#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 условия:
- Нашел элемент с
id=5
помощью и установил его. - Не найден элемент с
id=5
. - Ошибка
В том виде, в котором он написан сейчас, если в столбце моей базы 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, и это, вероятно, самый надежный способ. Недостатком является то, что это другой запрос к базе данных, который должен быть выполнен.