Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.12.2010, 17:20   #1
SoldSoul
 
Регистрация: 27.12.2010
Сообщений: 7
Вопрос Глюки с strpos()

Доброго времени суток.
Второй день ломаю голову и не могу понять где собака порылась.

Есть скрипт парсинга *.xls файлов (кусок кода в котором косяк):
Код:
for ($i = 1; $i <= $data->sheets[0]['numRows']; $i++) {
	$row = " ".@implode(" | ", @$data->sheets[0]['cells'][$i]);
	$sizes = $GLOBALS['db']->select_array_array("mod_conformity_sizes_variants", "uid", array("name", "pid"));
	$brends = $GLOBALS['db']->select_array_array("mod_conformity_brends_variants", "uid", array("name", "pid"));
	$size = "";
	$brend = "";
	$b_pos = "";
	if (is_array($data->sheets[0]['cells'][$i])) {
		foreach (@$data->sheets[0]['cells'][$i] as $item) {
			$brend = $GLOBALS['db']->sql_fetch_assoc($GLOBALS['db']->sql_query("SELECT `pid`, `name` FROM `mod_conformity_brends_variants` WHERE `name`='".$item."' LIMIT 1"));
			if ($brend['pid']) {
				break;
			}
		}
		if(!$size['pid']) {
			foreach ($brends as $b) {
				if (strpos($row, $b['name'])) {
					$brend['pid']=$b['pid'];
					break;
				}
			}
		}
		foreach (@$data->sheets[0]['cells'][$i] as $item) {
			$size = $GLOBALS['db']->sql_fetch_assoc($GLOBALS['db']->sql_query("SELECT `pid`, `name` FROM `mod_conformity_sizes_variants` WHERE `name`='".$item."' LIMIT 1"));
			if ($size['pid']) {
				break;
			}
		}
		if(!$size['pid']) {
			foreach ($sizes as $s) {
				if (strpos($row, $s['name'])) {
					$size['pid']=$s['pid'];
					break;
				}
			}
		}
	}
	echo $i." - ".$brend['pid']." - ".$size['pid']." - ".$row."<br>";
	if (isset($size['pid']) AND isset($brend['pid'])) {
		$sql = "INSERT INTO `mod_catalog_price` (`pid`, `crdate`, `cruser`, `size`, `brend`, `price`, `currency`, `line`) 
			VALUES ('".$_POST['pid']."', '".date("Y-m-d H:i:s")."', '', '".$size['pid']."', '".$brend['pid']."', '".$data->sheets[0]['cells'][$i][$_POST['price']]."', '".$_POST['currency']."', '".$row."')";
		$GLOBALS['db']->sql_query($sql);
	}
	else {
		$no_parsed[$i] = $data->sheets[0]['cells'][$i];
	}
}
$brends и $sizes - массивы с возможными вариантами представления бренда или размера вида array('id' => array('pid','name')).

$row имеет вид "1 165/70 R14C KC11 89/87Q Kumho 09 Korea зима м.автоб - 4 72 576".
$s['name'] имеен вид "165/70 R14".

В этом куске кода strpos($row, $s['name']) не находит вхождение подстроки, а если вынести это в отдельный файл и $row и $s['name'] задать приведенные выше значения, то все работает как надо.
Верная подстрока всегда присутствует в массиве (проверено и перепроверено 300 раз).

Подскажите, пожалуйста, в какую сторону копать.
SoldSoul вне форума Ответить с цитированием
Старый 27.12.2010, 17:26   #2
ssdm
Форумчанин
 
Регистрация: 20.05.2009
Сообщений: 506
По умолчанию

Попробуйте mb_strpos вместо strpos
ssdm вне форума Ответить с цитированием
Старый 28.12.2010, 10:43   #3
SoldSoul
 
Регистрация: 27.12.2010
Сообщений: 7
По умолчанию

Попробовал.
Результат тот же
SoldSoul вне форума Ответить с цитированием
Старый 28.12.2010, 11:54   #4
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,160
По умолчанию

Сделайте вывод на экран - исходную и искомую строки....
возможно нужно применить strupper или еще что.... посомтрите две строки и поймете почему и кае
ADSoft вне форума Ответить с цитированием
Старый 28.12.2010, 13:25   #5
SoldSoul
 
Регистрация: 27.12.2010
Сообщений: 7
По умолчанию

Цитата:
Сообщение от ADSoft Посмотреть сообщение
Сделайте вывод на экран - исходную и искомую строки....
возможно нужно применить strupper или еще что.... посомтрите две строки и поймете почему и кае
Делал. В массиве присутствуют варианты как в нижнем так и в верхнем регистре.

UPD: При этом бренды распознаются нормально, а размеры - ни в какую.
SoldSoul вне форума Ответить с цитированием
Старый 28.12.2010, 14:32   #6
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,160
По умолчанию

не связано ли это с знаком слеша / ?

Последний раз редактировалось ADSoft; 28.12.2010 в 14:34.
ADSoft вне форума Ответить с цитированием
Старый 28.12.2010, 15:54   #7
SoldSoul
 
Регистрация: 27.12.2010
Сообщений: 7
По умолчанию

Цитата:
Сообщение от ADSoft Посмотреть сообщение
не связано ли это с знаком слеша / ?
Кстати вариант ... сейчас попробую экранировать это дело ...
SoldSoul вне форума Ответить с цитированием
Старый 28.12.2010, 22:47   #8
SoldSoul
 
Регистрация: 27.12.2010
Сообщений: 7
По умолчанию

Менял с помощью str_repace() "/" на "~" - результаттот же самый, т.е. никакого.
Кстати заметил, что при определении бренда strpos() показывает значение начала подстроки со смещением на 2 символа вправо. Тоже странное явление.
SoldSoul вне форума Ответить с цитированием
Старый 28.12.2010, 23:24   #9
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,160
По умолчанию

кодировка то какая?
ADSoft вне форума Ответить с цитированием
Старый 29.12.2010, 11:07   #10
SoldSoul
 
Регистрация: 27.12.2010
Сообщений: 7
По умолчанию

Цитата:
Сообщение от ADSoft Посмотреть сообщение
кодировка то какая?
UTF-8 в обоих строках.
SoldSoul вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
USB глюки Dormidon Помощь студентам 1 16.06.2010 14:44
FireFox: глюки Arigato Софт 5 10.12.2009 04:25
Глюки DynamicSkinForm k1r1ch Компоненты Delphi 5 10.09.2009 15:06
Глюки с указателями _Инженер_ Общие вопросы Delphi 1 17.09.2008 20:20
Глюки Делфи Killbrum Помощь студентам 9 20.05.2008 20:31