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

Форум MySQL

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

 

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

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

тема: mysql_affected_rows() - проверка несколько запросов на результат
 
 автор: Filatov_Aleksey   (05.02.2011 в 17:23)   письмо автору
 
 

Здравтсвуйте. Возникла проблема с функцией mysql_affected_rows().
Я делаю несколько SQL запросов (MySQL) на обновление, удаление и вставки.
$myrow_doc = mysql_query("UPDATE doctors SET f='".$f."', i='".$i."', o='".$o."'......
$myrow_del_spec = mysql_query("DELETE FROM DocSpec WHERE doc = ".$id....
$myrow_ins_spec = mysql_query("INSERT INTO DocSpec (Doc, Spec) VALUES....

if (mysql_affected_rows($myrow_doc) and mysql_affected_rows($myrow_del_spec) mysql_affected_rows($myrow_inc_spec) ) { echo "Запросы прошли";}

В официальной документации пишут: int mysql_affected_rows ( [resource link_identifier] )

Если в функции mysql_affected_rows не указывать ресурс, то возвращает результат последнего запроса, если указываю параметр, то выдаёт предупреждение: Warning: mysql_affected_rows() expects parameter 1 to be resource.
В Чём может быть проблема?

  Ответить  
 
 автор: cheops   (05.02.2011 в 17:26)   письмо автору
 
   для: Filatov_Aleksey   (05.02.2011 в 17:23)
 

Добавьте проверки после mysql_query() - они все корректно выполняются?
<?php
  
if(!$myrow_doc) exit("Ошибка - ".mysql_error());
  if(!
$myrow_del_spec) exit("Ошибка - ".mysql_error());
  if(!
$myrow_ins_spec) exit("Ошибка - ".mysql_error());
?>

PS Вообще такую проверку лучше всегда делать, даже если у вас SQL-запрос не динамически формируется - много времени на отладке экономится. MySQL и PHP - разные системы и PHP не сообщает о проблемах на стороне MySQL, если не приложить к этому усилия.

  Ответить  
 
 автор: Filatov_Aleksey   (05.02.2011 в 19:14)   письмо автору
 
   для: cheops   (05.02.2011 в 17:26)
 

Для проверки на ошибки запроса я использую or die:
<?php
$myrow_del_spec = mysql_query("DELETE FROM DocSpec WHERE doc = ".$id,$db) or die ("<br>При выполнении запроса к БД возникла ошибка: ".mysql_error().". Код ошибки: ".mysql_errno().". ");
?>

Вопрос несколько в другом, нужно узнать внесены ли изменения в по запросам, т.е. например при delete - сколько записей затронуто запросом?
Нужно это сделать для нескольких запросов одновременно. В документации есть функция mysql_affected_rows() как раз для этих целей, она работает "без матюка" только при использовании её без параметров - по последнему запросу, но мне такой вариант не подходит, тогда придётся писать if для каждого запроса, т.е.
<?php
if(mysql_affected_rows()) {
второй запрос
if(mysql_affected_rows()) {
//третий запрос
}
}

?>

  Ответить  
 
 автор: Trianon   (05.02.2011 в 19:19)   письмо автору
 
   для: Filatov_Aleksey   (05.02.2011 в 19:14)
 

<?
mysql_query
($sql1) or die("error in $sql1 : ".mysql_error());
$a1 mysql_affected_rows();
mysql_query($sql2) or die("error in $sql2 : ".mysql_error());
$a2 mysql_affected_rows();
mysql_query($sql3) or die("error in $sql3 : ".mysql_error());
$a3 mysql_affected_rows();

if(
$a1 && $a2 && $a3)
   echo 
"каждый из запросов внес изменения в БД";

  Ответить  
 
 автор: Filatov_Aleksey   (05.02.2011 в 19:50)   письмо автору
 
   для: Trianon   (05.02.2011 в 19:19)
 

Да, это самый оптимальный вариант.
Благодарю Вас.

  Ответить  
 
 автор: cheops   (05.02.2011 в 19:27)   письмо автору
 
   для: Filatov_Aleksey   (05.02.2011 в 19:14)
 

Дело в том, что mysql_query() при выполнении запросов UPDATE, DELETE, DROP возврщает TRUE или FALSE, а не дескриптор результирующей таблицы (которой нет). Собственно функция mysql_affected_rows() и не принимает в качестве параметра дескритор результирующей таблицы, она принимает дескриптор соединения, которое возвращает фукнция mysql_connect(). Поэтому после всех запросов выполнять три подряд mysql_affected_rows() не получится - нужно функцию применять сразу.

  Ответить  
 
 автор: Filatov_Aleksey   (05.02.2011 в 19:53)   письмо автору
 
   для: cheops   (05.02.2011 в 19:27)
 

Вы меня посвятили в данном вопросе. Благодарю Вас.

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

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