Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: помогите разобраться с Update
 
 автор: Vigorius   (29.07.2009 в 00:47)   письмо автору
 
 

Помогите разобраться с updat'ом - не обновляется строка в mysql, хотя echo выдаёт "Страница успешно обновлена!"

$title = $_REQUEST['title'];
$body = $_REQUEST['body'];
$id = $_REQUEST['id'];
if ($_POST['submit']=='Ok'){
    $result=mysql_query("UPDATE `items` SET `title`='".$title."', `body`='".$body."' WHERE `id`='".$id."'");
    if ($result == 'true') {echo "<p><b>Страница успешно обновлена!</b></p>";}
    else
    {echo "<p>Страница не обновлена.</p>";}
}

  Ответить  
 
 автор: yuk   (29.07.2009 в 01:09)   письмо автору
 
   для: Vigorius   (29.07.2009 в 00:47)
 

Информация к размышлению, взятая из мануала:

Только для запросов SELECT, SHOW, EXPLAIN, DESCRIBE, mysql_query() возвращает указатель на результат запроса, или FALSE если запрос не был выполнен. В остальных случаях, mysql_query() возвращает TRUE в случае успешного запроса и FALSE в случае ошибки. Значение не равное FALSE говорит о том, что запрос был выполнен успешно. Он не говорит о количестве затронутых или возвращённых рядов. Вполне возможна ситуация, когда успешный запрос не затронет ни одного ряда.

  Ответить  
 
 автор: Vigorius   (29.07.2009 в 01:28)   письмо автору
 
   для: yuk   (29.07.2009 в 01:09)
 

yuk , спасибо за инфо!
$result="UPDATE `items` SET `title`='".$title."', `body`='".$body."' WHERE `id`='".$id."'";

Результат - "Страница не обновлена"

Ошибку так и не могу найти...

  Ответить  
 
 автор: Trianon   (29.07.2009 в 01:30)   письмо автору
 
   для: Vigorius   (29.07.2009 в 01:28)
 

echo $result;
echo mysql_error();

  Ответить  
 
 автор: yuk   (29.07.2009 в 09:39)   письмо автору
 
   для: Vigorius   (29.07.2009 в 01:28)
 

нет, ищите ошибку здесь:
if ($result == 'true')

  Ответить  
 
 автор: ride   (29.07.2009 в 10:45)   письмо автору
 
   для: yuk   (29.07.2009 в 09:39)
 

проблема не в этой строке.
вы же сами привели отрывок из мануала.
Автору темы:
думаю, проблема в $id.
echo $id что вам покажет?

UPD
возможно, проблема в том, что вы не обрабатываете спец символы перед вставкой их в запрос, и где-то проскакивает ковычка.
попробуйте написать не $title, а mysql_escape_string($title)
а вообще, конечно, как сказал Trianon, mysql_error() вам в помощь

  Ответить  
 
 автор: yuk   (29.07.2009 в 11:29)   письмо автору
 
   для: ride   (29.07.2009 в 10:45)
 

Сейчас не важно, чему равно id. Даже если упростить код до:

$title = 'text1'; 
$body = 'text2'; 
$id = 'то что никак не может быть в id'; 

    $result=mysql_query("UPDATE `items` SET `title`='".$title."', `body`='".$body."' WHERE `id`='".$id."'"); 
    if ($result == 'true') {echo "<p><b>Страница успешно обновлена!</b></p>";} 
    else 
    {echo "<p>Страница не обновлена.</p>";} 


Все-равно будет выводиться сообщение об успешном обновлении.

Главная ошибка в том, что $result проверяют на true (причем весьма не грамотно -$result сравнивают со строкой, которую mysql_query() никогда не возвращал. К сожалению, РНР в силу своей интеллектуальности сам преобразовывает строку 'true' в true).
Не будем зацикливаться на строке, предположим, проверка была if($result==true).
Похоже, автор хочет проверить, были ли обновлены строки таблицы запросом. Вот тут пригодится выше указанный отрывок из мануала, в частности то место, где говорится, что "Вполне возможна ситуация, когда успешный запрос не затронет ни одного ряда".
т. е., если запрос выполняется без ошибок - $result будет равен true, даже если ничего не было изменено.

Сделать проверку на то, были ли внесены изменения при UPDATE - можно с помощью, скажем, mysql_affected_rows().

  Ответить  
 
 автор: ride   (29.07.2009 в 12:10)   письмо автору
 
   для: yuk   (29.07.2009 в 11:29)
 

начну по порядку.
1. автор сначала написал
"Помогите разобраться с updat'ом - не обновляется строка в mysql, хотя echo выдаёт "Страница успешно обновлена!""
первое, что приходит в голову - это то, что id, например, равен нулю.
такая запись не найдена, рез-т - "Страница успешно обновлена!"
2. Далее вы приводите отрывок из мануала.
В рез-те, он получает "Страница не обновлена."
Это может быть по следующим причинам:
2.1 Не известно, какой вывод для себя сделал топикстартер, и как он исправил свой код.
2.2 возможно, он ввел другие данные, которые будут содержать одинарные ковычки.
3 теперь по последнему вашему сообщению:
>>Главная ошибка в том, что $result проверяют на true
это не главная ошибка.
здесь

К сожалению, РНР в силу своей интеллектуальности сам преобразовывает строку 'true' в true).

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

>>Похоже, автор хочет проверить, были ли обновлены строки таблицы запросом.
с чего вы это взяли?
>>"Вполне возможна ситуация, когда успешный запрос не затронет ни одного ряда".
>>т. е., если запрос выполняется без ошибок - $result будет равен true
именно это у него и происходит(в самом первом посте)

  Ответить  
 
 автор: yuk   (29.07.2009 в 12:38)   письмо автору
 
   для: ride   (29.07.2009 в 12:10)
 

>>2. Далее вы приводите отрывок из мануала.
>>В рез-те, он получает "Страница не обновлена."

да, причина именно в
>>2.1 Не известно, какой вывод для себя сделал топикстартер, и как он исправил свой код.

>>>>Похоже, автор хочет проверить, были ли обновлены строки таблицы запросом.
>>с чего вы это взяли?
Действительно, с чего я это взял? Возможно с того, что при не успешном обновлении выводится сообщение "страница не обновлена". Но теперь, смотрю, сообщение поменялось на "Ошибка при обновлении!" - что уже больше подходит под проверку на ошибки запроса. Если автор хочет проверить, была ли ошибка при выполнении запроса - тогда я не прав, и все мои посты можно проигнорировать.


Обратимся тогда к автору:
что вы хотите проверить? - была ли ошибка при выполнении запроса, или были ли затронуты ряды таблицы при выполнении запроса?

  Ответить  
 
 автор: Trianon   (29.07.2009 в 11:10)   письмо автору
 
   для: yuk   (29.07.2009 в 09:39)
 

здесь, конечно, ошибка.
Только она не влияет...

  Ответить  
 
 автор: yuk   (29.07.2009 в 11:34)   письмо автору
 
   для: Trianon   (29.07.2009 в 11:10)
 

>здесь, конечно, ошибка.
Я бы добавил - и не одна.

  Ответить  
 
 автор: Vigorius   (29.07.2009 в 12:20)   письмо автору
 
   для: yuk   (29.07.2009 в 11:34)
 

Всем спасибо!

Рабочий пример:
<?php
if ($_REQUEST['submit']=='Ok'){
    
$title htmlspecialchars($_REQUEST['title']);
    
$body htmlspecialchars($_REQUEST['body']);
    
$id intval($_REQUEST['id']);
    
    
$result="UPDATE `items` SET `title`='$title', `body`='$body' WHERE `id`='$id'";
    
$query_result mysql_query($result); 

    if (
mysql_affected_rows() > '0') {$msg "Запись обновлена!";} else {$msg "Ошибка при обновлении!";}
        echo 
$msg;
}
?>


Покажите, пожалуйста, в чём ещё ошибки!

  Ответить  
 
 автор: Trianon   (29.07.2009 в 12:23)   письмо автору
 
   для: Vigorius   (29.07.2009 в 12:20)
 

Это не рабочий пример, а ересь мерзкая.
Вместо того, чтобы ошибки исправить, Вы их добавили.
htmlspecialchars здесь никаким боком не лезет.

  Ответить  
 
 автор: ride   (29.07.2009 в 12:32)   письмо автору
 
   для: Vigorius   (29.07.2009 в 12:20)
 

>>if (mysql_affected_rows() > '0')
да и это тоже не правильно
прочитайте отрывок из мануала, который вам привели выше+ добавлю от себя:
если вы попытаетесь обновить данные на те же самые, mysql не обновит, в рез-те вернет true(запрос выполнен успешно), но mysql_affected_rows будет равен 0.
чувствуете разницу?
и, в конце-концов, хотя пхп за вас преобразует переменные, вы работаете с числами, а не со строками, так будьте добры, пишите числа: 0 а не '0'

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования