Помогите с циклами

gopher-max

Новичок
Еще раз всем доброго времени суток! С подставкой переменных в запрос немного разобрался. Но теперь возникла другая проблема. Опишу достаточно кратко. Надеюсь что код написан не совсем коряво и он внесет ясность. Запрос по дате делает выборку товаров в базе. Далее открываем CSV файл и берем из него нужные поля. А дальше нужно что бы скрипт проходя по каждому выбранному запросом результату, сравнивал переменные и в случае успеха - добавлял информацию в таблицу. А сейчас скрипт обрабатывает только первую позицию из выбранных.
PHP:
<?
header('Content-type: text/html; charset=utf-8');
	if(!setlocale(LC_ALL, 'ru_RU.utf8')) setlocale(LC_ALL, 'en_US.utf8');
	if(setlocale(LC_ALL, 0) == 'C') die('Не поддерживается ни одна из перечисленных локалей (ru_RU.utf8, en_US.utf8)');
?>

<!DOCTYPE HTML>
<html lang="ru">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
		<title>Импорт подвидов</title>
		<link rel="stylesheet" href="css/stayl.css" type="text/css" media="screen">
	</head>
	<body>
		<?php
		
		ini_set('display_errors',1);
		error_reporting(E_ALL);
		
		$host="localhost";
		$user= $_POST['user'];
		$pwd= $_POST['pwd'];
		$dbname="a200331_cms";
		$datas= $_POST['datas'];
		$next_datas= $_POST['next_datas'];
		$mask = "1";
		
		@ $db = mysqli_connect($host, $user, $pwd, $dbname) or die("Ошибка: Не удалось установить соединение.");
		
		mysqli_select_db($db, $dbname);
		mysqli_set_charset($db, 'utf8' );
		
		$query_select = "SELECT * FROM cms_es_items WHERE modified_date >= '$datas'  AND modified_date <= '$next_datas'";
		$result_select = mysqli_query($db, $query_select);
		
		if($query_select){
			if (is_uploaded_file($_FILES["csvfile"]["tmp_name"])) {
				$fn = $_FILES["csvfile"] ["tmp_name"]; 
				$fd = fopen($fn,  "r");
				while($row_select = mysqli_fetch_assoc($result_select)) {
					$id = $row_select['id'];
					$id_category = $row_select['id_category'];
					$price = $row_select['price'];
					$rest = $row_select['rest'];
					$weight = $row_select['weight'];
					$lang = $row_select['lang'];
					$modified_date = $row_select['modified_date'];
					$sku = $row_select['sku'];
					while (!feof($fd))  {
						$fields = fgetcsv($fd, 1000, ";") ;
						$fields[5] = iconv("Windows-1251", "UTF-8", $fields[5]);
						@$fields[8] = iconv("Windows-1251", "UTF-8", $fields[8]);
						@$fields[9] = iconv("Windows-1251", "UTF-8", $fields[9]);
						$cod = $fields[5];
						$size = $fields[8];
						$color = $fields[9];
						if ($sku == $cod) {
							$query_insert = "INSERT INTO `cms_es_props` (`id_item`, `id_category`, `price`, `rest`, `weight`, `mask`, `lang`, `modified_date`, `prop_15`, `prop_16`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
							$stmt_insert = $db->prepare($query_insert);
							$stmt_insert->bind_param("iidiiissss", $id, $id_category, $price, $rest, $weight, $mask, $lang, $modified_date, $size, $color);
							$stmt_insert->execute();
							$stmt_insert->close();
							echo $id." ".$sku;
							echo " Добавлен.<br />";
						}
					}
				}
				fclose($fd);
			} else {
				echo "Ошибка загрузки файла";
				exit();
			}
			
		} else {
			print mysqli_error();
		}
		mysqli_free_result($result_select);
		mysqli_close($db);
		?>
	</body>
</html>
Зарание спасибо!
 

gopher-max

Новичок
Да почему же не решаемая?
http://phpfaq.ru/debug
Спасибо! Всю отладку провел! Информация об ошибках никакая не выводится! Попробую объяснить еще раз. Данный скрипт должен 1) Получать данные от пользователя (получает).
2) Записывать их в переменные (записывает)
3) Подключаться к базе (подключается)
4) Выполнять запрос в базу и сохранить результат (делает, но переменная $result_select выводит array)
5) Первый цикл должен построчно просматривать выборку и возвращать строку в виде массива (делает)
6) Вложенный цикл должен при каждой итерации первого цикла считывать построчно файл, записывать данные в переменные и сравнивать переменные (делает)
7) При равенстве переменных, должна совершаться запись в базу и вернуться к первому циклу. И так пока не пройдет по всей выборке из базы.
Но в данный момент цикл берет первую строку из выборки, находит совпадения в файле, делает запись в базу и на этом скрипт завершает свою работу, не возвращаясь к первому циклу.
Пытался сделать наоборот - берем строку из файла и ищем соответствия в выборке - тот же результат. Первый цикл не выполняет только первую итерацию.
 

С.

Продвинутый новичок
Ну так проверяй условия, почему они не прорабатывает как надо. Выводи отладочную информацию на каждом шаге, смотри, что не так, как ожидается. Кто за тебя это делать будет?
 

gopher-max

Новичок
Я не знаю как посмотреть почему после первой итерации верхний цикл заканчивает свою работу так как с PHP только знакомлюсь. Условия уже 1000 раз проверил просмотрел что содержат в себе переменные на каждом шаге, так и выяснил что именно верхний цикл не прорабатывает до конца. Из книжки PHP и MySQL черпаю знания. Может я не правильно циклы понимаю?
 

С.

Продвинутый новичок
Я не знаю как посмотреть почему после первой итерации верхний цикл заканчивает свою работу так как с PHP только знакомлюсь.
Дело не в РНР. В каждом языке у цикла есть условие исполнения. Если цикл не идет на следующую итерацию, значит условие более не исполняется. Почему не исполняется можешь знать только ты. Выведи данные и увидишь сам. (Вывести можно оператором print.)
 

gopher-max

Новичок
Смотри, если убрать вложенный цикл и после переменных сделать вывод в браузер данных переменных, то цикл просматривает все строки выборки, а если добавить вложенный цикл и оставить в верхнем цикле вывод переменных - то верхний цикл выполняет только одну итерацию и скрипт завершает работу. Мне кажется что это связано с тем что у вложенного цикла в конце итерации значение FALSE. Но если я меняю условие вложенного цикла на сравнение количества строк из выборки и новой переменной, которая увеличевается при каждой итерации, то, естественно вложенный цикл выполняет заданное количество итераций и скрипт завершается.
 

С.

Продвинутый новичок
Ты будешь продолжать фантазировать и гадать или все-таки начнешь выводить отладочную информацию?
 

gopher-max

Новичок
PHP:
if (is_uploaded_file($_FILES["csvfile"]["tmp_name"])) {
                $fn = $_FILES["csvfile"] ["tmp_name"]; 
                $fd = fopen($fn,  "r");
				
				while($row_select = mysqli_fetch_assoc($result_select)) {
					
					$id = $row_select['id'];
					$id_category = $row_select['id_category'];
					$price = $row_select['price'];
					$weight = $row_select['weight'];
					$lang = $row_select['lang'];
					$modified_date = $row_select['modified_date'];
					$sku = $row_select['sku'];
                                        echo $sku.' SKU<br />';
					
					/*while (!feof($fd))  {	
                        
						$fields = fgetcsv($fd, 1000, ";");
						
						$cod = $fields[5];
						$size = $fields[8];
						$color = $fields[9];
						$rest = $fields[10];
						
						$cod = addslashes($cod);
						$size = addslashes($size);
						$color = addslashes($color);
						
						$cod = iconv("Windows-1251", "UTF-8", $cod);
						$size = iconv("Windows-1251", "UTF-8", $size);
						$color = iconv("Windows-1251", "UTF-8", $color);
						
						echo $sku.' SKU<br />';
						echo $cod.'COD<br />';
						echo '<br />';
						
						$row++;
                   
						if ($sku == $cod) {
							$query_insert = "INSERT INTO `cms_es_props` (`id_item`, `id_category`, `price`, `rest`, `weight`, `mask`, `lang`, `modified_date`, `prop_15`, `prop_16`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
							$stmt_insert = $db->prepare($query_insert);
							$stmt_insert->bind_param("iidiiissss", $id, $id_category, $price, $rest, $weight, $mask, $lang, $modified_date, $size, $color);
							$stmt_insert->execute();
							$stmt_insert->close();
							echo $id." ".$sku." ".$size." ".$color." ".$rest;
							echo " Добавлен.<br />";
						}
					}*/
                }
            fclose($fd);
            }
На самом деле все что я писал выше - уже проделано мной. Эту тему я создавал почти неделю назад и за это время я успел проверить то что описал.
Данный код пересмотрит все строки из выборки и выводит в браузер значение поля sku из каждой строки
 

С.

Продвинутый новичок
Замечательно, пусть будет так. Раскомментируй по частям, пока не будет наблюдаться ошибка.
 

gopher-max

Новичок
Вот так уже верхний цикл проходит только первую строку
PHP:
header('Content-type: text/html; charset=utf-8');
    if(!setlocale(LC_ALL, 'ru_RU.utf8')) setlocale(LC_ALL, 'en_US.utf8');
    if(setlocale(LC_ALL, 0) == 'C') die('Не поддерживается ни одна из перечисленных локалей (ru_RU.utf8, en_US.utf8)');
?>

<!DOCTYPE HTML>
<html lang="ru">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>Импорт подвидов</title>
        <link rel="stylesheet" href="css/stayl.css" type="text/css" media="screen">
    </head>
    <body>
        <?php
        
        ini_set('display_errors',1);
        error_reporting(E_ALL);
        
        $host="localhost";
        $user= $_POST['user'];
        $pwd= $_POST['pwd'];
        $dbname="a200331_cms";
        $datas= $_POST['datas'];
        $next_datas= $_POST['next_datas'];
        $mask = "1";
		$row = 0;
			
        
		@ $db = mysqli_connect($host, $user, $pwd, $dbname) or die("Ошибка: Не удалось установить соединение.");
        
        mysqli_select_db($db, $dbname);
        mysqli_set_charset($db, 'utf8' );
        
        $query_select = "SELECT * FROM cms_es_items WHERE modified_date >= '$datas'  AND modified_date <= '$next_datas'";
        $result_select = mysqli_query($db, $query_select);
		
		$num = mysqli_num_rows($result_select);
        
        if($query_select){
            if (is_uploaded_file($_FILES["csvfile"]["tmp_name"])) {
                $fn = $_FILES["csvfile"] ["tmp_name"]; 
                $fd = fopen($fn,  "r");
				
				while($row_select = mysqli_fetch_assoc($result_select)) {
					
					$id = $row_select['id'];
					$id_category = $row_select['id_category'];
					$price = $row_select['price'];
					$weight = $row_select['weight'];
					$lang = $row_select['lang'];
					$modified_date = $row_select['modified_date'];
					$sku = $row_select['sku'];
					
					while (!feof($fd))  {	
                        
						$fields = fgetcsv($fd, 1000, ";");
						
						$cod = $fields[5];
						$size = $fields[8];
						$color = $fields[9];
						$rest = $fields[10];
						
						$cod = addslashes($cod);
						$size = addslashes($size);
						$color = addslashes($color);
						
						$cod = iconv("Windows-1251", "UTF-8", $cod);
						$size = iconv("Windows-1251", "UTF-8", $size);
						$color = iconv("Windows-1251", "UTF-8", $color);
						
						echo $sku.' SKU<br />';
						echo $cod.'COD<br />';
						echo '<br />';
						
						$row++;
                   
						/*if ($sku == $cod) {
							$query_insert = "INSERT INTO `cms_es_props` (`id_item`, `id_category`, `price`, `rest`, `weight`, `mask`, `lang`, `modified_date`, `prop_15`, `prop_16`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
							$stmt_insert = $db->prepare($query_insert);
							$stmt_insert->bind_param("iidiiissss", $id, $id_category, $price, $rest, $weight, $mask, $lang, $modified_date, $size, $color);
							$stmt_insert->execute();
							$stmt_insert->close();
							echo $id." ".$sku." ".$size." ".$color." ".$rest;
							echo " Добавлен.<br />";
						}*/
					}
                }
            fclose($fd);
            } else {
                echo "Ошибка загрузки файла";
                exit();
            }
            
        } else {
            print mysqli_error();
        }
        mysqli_free_result($result_select);
        mysqli_close($db);
        ?>
    </body>
</html>
 

WMix

герр M:)ller
Партнер клуба
gopher-max
немножко не по вопросу, а зачем ты пишешь такую хрень?
PHP:
  $weight = $row_select['weight'];
если можно также использовать масив в этом месте....
PHP:
 $stmt_insert->bind_param("iidiiissss", $row_select['id'], ...
куча строк ненужных исчезнет...
Вот так уже верхний цикл проходит только первую строку
PHP:
 $num = mysqli_num_rows($result_select);
echo $num; // что выдает?
if($query_select){
 

gopher-max

Новичок
PHP:
 $num = mysqli_num_rows($result_select);
echo $num; // что выдает?
if($query_select){
Выводит количество строк в выборке! Значение правильное!
Да чет мне хочется сначала написать так чтобы это работало а потом оптимизировать! Я ведь только учусь!
 

WMix

герр M:)ller
Партнер клуба
так часто бывает, когда пишешь больше чем нужно, повторяя сам себя, а уже при оптимизации складываешь по полочкам, но в твоем случае ты делаешь себе сложнее, создавая новые переменные, все становится плохочитабельным,... но так новички пишут часто...

Вот так уже верхний цикл проходит только первую строку
а почему ты думаешь что только первую строку?
PHP:
 while($row_select = mysqli_fetch_assoc($result_select)) {
print_r($row_select ); // что тут выдает?
...
 

gopher-max

Новичок
а почему ты думаешь что только первую строку?
PHP:
 while($row_select = mysqli_fetch_assoc($result_select)) {
print_r($row_select ); // что тут выдает?
...
Вместо записи в базу я выводил на печать и там сразу все становится видно! Что выводит print_r($row_select); проверю примерно через час. Но впринцепе это массив созданный из строки. Если вывести на печать элементы массива, то они выводятся корректно.
 

WMix

герр M:)ller
Партнер клуба
print_r($row_select ); выводит строчку на каждую итерацию, и если ты видешь все строки напрашивается вывод, что цикл проходит не только первую строчку...
это ответ на утверждение
Вот так уже верхний цикл проходит только первую строку
 

gopher-max

Новичок
print_r($row_select ); выводит строчку на каждую итерацию, и если ты видешь все строки напрашивается вывод, что цикл проходит не только первую строчку...
это ответ на утверждение
В первой итерации он показывает первую строку а до второй он не доходит. Могу продемонстрировать к примеру по скайпу все выводы. Тогда станет ясно.
 

WMix

герр M:)ller
Партнер клуба
ошибки то показывает?

дальше ты на каждую строчку пытаешься читать один и тотже CSV и если там 1 строчка, то проблема там....
PHP:
$fields = fgetcsv($fd, 1000, ";");
print_r($fields);
 

gopher-max

Новичок
ошибки то показывает?

дальше ты на каждую строчку пытаешься читать один и тотже CSV и если там 1 строчка, то проблема там....
PHP:
$fields = fgetcsv($fd, 1000, ";");
print_r($fields);
В файле более чем одна строка. Но на каждую строчку из выборки один и тот же csv должен считываться иначе соответствия не будут найдены.
Ошибки никакие не выдает. Может просто нужно использовать рекурсию?
 
Сверху