2013-03-20 2 views
0

Я всегда боролся с довольно простой концепцией в моем PHP INSERT/UPDATE-коде. Должен ли я всегда проверять количество затронутых строк после каждого INSERT/UPDATE, потому что в подавляющем большинстве случаев я выполняю только один INSERT/UPDATE и, похоже, вызывает больше проблем, чем исправляет, проверяя, что затронута только одна строка ,PHP mysql_affected_rows() Должен ли я заботиться?

Ниже приведен мой стандартный код для выполнения INSERT/UPDATE, и этот код выходит из строя, если пользователь обновляет запись, не изменяя ничего, потому что затронутые строки будут равны 0. Я мог написать код, чтобы проверить, что по крайней мере одно поле изменилось но в больших формах это кажется очень неуклюжим, и он задавался вопросом, действительно ли это стоит того, потому что я никогда не замечал ошибок, проверяя этот номер.

<?php 
     $whereSql = ''; 
     $groupSql = 'INSERT INTO'; 

     if(isset($_POST['id']) && is_numeric($_POST['id'])){ 
      $groupSql = 'UPDATE'; 
      $whereSql = 'WHERE id = ' . $_POST['id']; 
     } 

     $groupSql .= ' sometable SET name="' . $name . '" ' . $whereSql; 

     $groupDb = mysqli_query($groupSql, $dbObject) or die("Login DB error:".mysql_error()); 

     if(mysqli_affected_rows($dbObject) == 1){ 
      //redirect 
     }else{ 
      die('System Error'); 
     } 
+1

-0.49 для использования 'mysql_query' в 2013 году. – cHao

+0

Почему бы не печатать ошибку, если mysql_affected_rows ($ dbObject) == -1. Из руководства -> Возвращает количество пораженных строк при успешном завершении и -1, если последний запрос не удался. –

+0

@cHao это устаревший код –

ответ

4

Вы должны проверять возвращаемые значения по запросам. Запрос select/update, который влияет на/не возвращает строки, равен NOT условие ошибки, это просто пустой набор результатов или обновление, которое не повлияло ни на что.

$result = mysql_query($sql) or die(mysql_error()); 
          ^^^^^^^^^^^^^^^^^^^^^ 

Рассмотрим систему Регистрация пользователя, который проверяет наличие согласующего пользователя:

SELECT id FROM users WHERE username='foo'; 

если пользователь foo не существует, ваша система будет блевать и утверждают, произошла ошибка. Но пустым набором результатов является NOT. Это просто означает, что имя пользователя доступно для пользователя.

То же для системы, которая обрабатывает оценки:

UPDATE students SET failed=true WHERE score < 50; 

получение 0 пострадавших строк не является неисправностью. Это просто означает, что все студенты прошли.

1

Я бы порекомендовал проверить, не вызвал ли запрос запрос, а если нет, то если затронуто более одной строки.

$groupDb = mysql_query($groupSql, $dbObject); 
if (false === $groupDb) { 
    die("Login DB error:".mysql_error()) 
if (mysql_affected_rows($dbObject) > 1) { 
    die('System Error: failed to ' . $action . ' a document Group'); 
} else { 
    //redirect 
} 

Таким образом, вы будете перенаправлены только в случае успешных запросов и если там было меньше, чем 2 ряда пострадавших (если это важно для вас).

Смежные вопросы