MySQL+PHP что-то не так с циклом при UPDATE

ariran

Новичок
добрый день.
имеется таблица с 4 полями (id, head, news, header) при этом в id стоят идентификаторы (не по порядку то есть 2, (3 отсутствует вообще) 324, 345 и т.д.) в ячейке head и news тексты с разметкой html. ячейка header - пустая.

текст в ячейке head пресдтавляет собой html конструкцию вида
Код:
<b>Заголовок</b><br>Анонс новости
задача: вычленить из ячейки head текст Заголовка и прописать его в ячейку header. Почитал, что на эту тему пишут и говорят и выдал следующее:

PHP:
<?php 
// Подключаемся
$link = mysql_connect($db, $user, $pass) ; 
if(!$link ) die("Could not connect on connection part: ".mysql_error());
// Выбираем базу 
$db mysql_select_db($base , $link ) or die("Could not select database: ".mysql_error()); 
$query = "SELECT * FROM `publication_reform`"; 
$result = mysql_query ( $query , $link ); //считываем всю таблицу 
while ($row = mysql_fetch_row($result)) 
{
    $text = $row[1];//присваиваем $text значение из ячейки с заголовком и анонсом 
    $id=$row[0];//задаем переменной значение ячейки id из обрабатываемой строки. 
    echo "$id<br>";//это для проверки просто, что переменная определилась. 
    preg_match_all ("#<b>(.*)</b>#", $text, $regs);//ищем соответствие на все что между тегами <B> 
    //вынимаем из массива только текст без <B>. присваиваем это значение новой переменной $OUT иначе не выводится через echo. 
    $out = $regs[1][0];
    //апдейтим таблицу. Записываем в пустую ячейку header заголовок (ID которой как бы сейчас обрабатывается)
    $query = "UPDATE `publication_reform` SET `header` = '$out' WHERE `id`='$id'";
    $result = mysql_query ( $query , $link ); 
    echo "$out inserted<br>";//тоже просто для проверки.
    $i++; 
} 
?>
в итоге скрипт записывает только одну ячейку и дальше цикл выполнять не хочет. При этом если с записью данных в БД не связываться, а включить, например, построчный вывод на экран наших ячеек, то цикл проходит всю базу.

Подскажите что я делаю не так?
 

fixxxer

К.О.
Партнер клуба
Подскажите что я делаю не так?
1)не используешь функцию mysql_error для отладки, хотя знаешь о ней
2)выводишь "просто для проверки" всякую хрень, а не запрос
 

ariran

Новичок
1)не используешь функцию mysql_error для отладки, хотя знаешь о ней
2)выводишь "просто для проверки" всякую хрень, а не запрос
фишка в том, что с php я только начинаю знакомиться. поэтому конструкция с mysql_error была "взята" из примеров. по той же причине (нуб) в проверке у меня всякая хрень.
 

artoodetoo

великий и ужасный
мне показалось автор не выполнил mysql_connect, а только написал о нем комментарий.
магия!
 

ariran

Новичок
мне показалось автор не выполнил mysql_connect, а только написал о нем комментарий.
магия!
это издержки вставки кода. по факту там
PHP:
//Подключаемся
$link = mysql_connect($db, $user, $pass) ;
с подключением и обработкой все хорошо. все хорошо пока дело не доходит до записи нужного текста в нужную ячейку.

вопрос - почему цикл while после обработки одной строки (с записью в ячейку header этой строки) не переходит к следующей строке. если вместо
PHP:
$query = "UPDATE `publication_reform` SET `header` = '$out' WHERE `id`='$id'";
$result = mysql_query ( $query , $link );
вставить например echo "$uid : $out : " то выводятся соответствующие поля из всей таблицы
 

ariran

Новичок
PHP:
$query = "UPDATE `publication_reform` SET `header` = '$out' WHERE `id`='$id'";
$result = mysql_query ( $query , $link );
если в конструкции условие WHERE не ставить, то цикл тоже выполняется и записывает по всей таблице (в каждую строку) в ячейку header заголовок из первой строки
 

Фанат

oncle terrible
Команда форума
Для человека, который только "почитал и выдал", код довольно-таки неплох, а ошибка вполне адекватная, заметить её можно только если знаешь эту фишку, отладкой я даже не знаю как.

Хотя нет. Конечно же,
PHP:
var_dump($result);
в цикле сразу покажет проблему
 

Фанат

oncle terrible
Команда форума
если в конструкции условие WHERE не ставить, то цикл тоже выполняется и записывает по всей таблице (в каждую строку) в ячейку header заголовок из первой строки
а вот здесь ты лоханулся по полной.

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

Объясняю главное правило программирования: программист обязан уметь отлаживать свои программы
Объясняю главное правило отладки: программист не должен изображать из себя херлокхолмса, догадываясь о событиях по их последствиям. Программист должен своими глазами убеждаться в справедливости своих выводов.

Ты считаешь, что цикл выполняется сколько надо?
Как это проверить? Не по последствиям, а явно?
И каков результат?
 

ariran

Новичок
PHP:
$result = mysql_query ( $query , $link ); <-- ошибка здесь
это про запрос который уже в цикле?

добавил в код цикла
PHP:
while ($row = mysql_fetch_row($result))
{
$text = $row[1];//присваиваем $text значение из ячейки с заголовком и анонсом
preg_match_all ("#<b>(.*)</b>#", $text, $regs);//ищем соответствие на все что между тегами B
$out = $regs[1][0];//вынимаем из массива только текст без B. присваиваем это значение новой переменной $OUT 
$id=$row[0];//для условия WHERE при записи
$query = "UPDATE  `publication_reform` SET  `header` =  '$out' WHERE `id` = '$id' ";
$result = mysql_query ( $query );
var_dump($result);
print_r ($result);//похоже, что смысл как у var_dump
$i++;
}
на экране выводится bool(true) 1
 

Фанат

oncle terrible
Команда форума
в общем да, логично. в любом случае выведется 1 раз.
сработает только если выводить КАЖДУЮ переменную.
ладно, вернемся к тезису о ненаходимости этой ошибки самостоятельно.
это про запрос который уже в цикле?
то есть, ты в курсе, что у тебя этой переменной значение присваивается два раза?
 

ariran

Новичок
в общем да, логично. в любом случае выведется 1 раз.
сработает только если выводить КАЖДУЮ переменную.
ладно, вернемся к тезису о ненаходимости этой ошибки самостоятельно.

то есть, ты в курсе, что у тебя этой переменной значение присваивается два раза?
не то чтобы в курсе, просто я это вижу ) и мне "казалось" что если переменную переобъявить перед выполнением функции, то в функции будет участвовать новое значение переменной.
 

ariran

Новичок
заменил $result в цикле на другую переменную
PHP:
$query = "UPDATE  `publication_reform` SET  `header` =  '$out' WHERE `id` = '$id' ";
$update = mysql_query ( $query  , $link );
все сработало. заменились все значения.
но возник вытекающий вопрос - почему тогда $query у нас тоже объявляется для каждого запроса, но при этом остается $query а не $query1 например
 

ariran

Новичок
вопрос, зачем здесь вообще нужна переменная, остался открытым ;)
честно говоря не знаю. так у меня "исторически сложилось".
до этого была другая задача (из файлов надо было в таблицу данные построчно переносить) и на форумах и статьях я выяснял про работу с бд. и вот оттуда меня "научили".
 

Фанат

oncle terrible
Команда форума
Не надо оправдываться, я все понимаю.
пхп в этом смысле самый чудовищный язык, если учиться "читая в интернете". там такого понаписано...
большая часть писателей мало того, что не понимают смысла написанного - они и сами-то никогда в сознание не приходили

и тем не менее, эта переменная оказалась не только бесполезной, но и вредной.
это учит нас критически относиться к коду, который мы копируем, и выкидывать из него всё лишнее, по заветам старика Оккама.
 

ariran

Новичок
да, кстати, я теперь походу понял в чем фишка была. в $result в цикле ставилась 1, и эта же 1 шла в начало цикла и while начинал выполняться для 1 ряда.
а когда я убирал заполнение таблицы в цикле, то $result не менялся и тогда цикл проходил всю базу.
так?
 

ariran

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

и тем не менее, эта переменная оказалась не только бесполезной, но и вредной.
это учит нас критически относиться к коду, который мы копируем, и выкидывать из него всё лишнее, по заветам старика Оккама.
это да. и примеры все под копирку и для единичной обработки. я даже вспомнил откуда эти переменные пошли у меня. я влепил в код mysql запрос вот прямо как он был в чистом виде в справочнике. и вот там то мне показали эту конструкцию с $query и result )
 
Сверху