mysqli_affected_rows для ОБНОВЛЕНИЯ иногда возвращает 0 при полном совпадении строк

#php #mysql #mysqli

#php #mysql

Вопрос:

Скажем, если у меня есть запрос MySQL для обновления строки:

 $res = mysqli_query($link, 
    "UPDATE table SET val=1 WHERE id=5");

if($res)
{
    if(mysqli_affected_rows($link) > 0)
    {
        echo("Updated something!");
    }
    else
        echo("Didn't update");
}
else
    echo("Error");
  

Как мне изменить его, чтобы различать эти 3 условия:

  1. Нашел элемент с id=5 помощью и установил его.
  2. Не найден элемент с id=5 .
  3. Ошибка

В том виде, в котором он написан сейчас, если в столбце моей базы val данных уже есть 1 эта строка, mysqli_affected_rows будет возвращен 0.

Ответ №1:

Вы можете использовать mysqli_info для получения информации, необходимой для различения двух случаев. mysqli_info($link) после UPDATE того, как запрос вернет строку, что-то вроде

 Rows matched: 1 Changed: 1 Warnings: 0
  

который затем можно проанализировать, например, с помощью preg_match :

 // $info = mysqli_info($link);
$info = 'Rows matched: 12 Changed: 8 Warnings: 0';
preg_match('/Rows matched: (d ) Changed: (d )/', $info, $matches);
list(, $matched, $changed) = $matches;
echo "$matched rows matched, $changed rows changedn";
  

Вывод:

 12 rows matched, 8 rows changed
  

Затем вы можете использовать значения в $matched и $changed , чтобы различать ваши два случая.

Комментарии:

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

2. @c00000fd вы могли бы просто игнорировать буквы и использовать /[^:] : (d ) [^:] : (d )/

3. Или даже /[^d] (d )[^d] (d )/

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

5. @Dylan true, и это, вероятно, самый надежный способ. Недостатком является то, что это другой запрос к базе данных, который должен быть выполнен.