Различают «строки не были затронуты» и строки успешно обновлены — до одинакового значения (MySQL и PHP)

Я выполняю команды SQL (MySQL) из PHP. Есть несколько возможных результатов для каждого выполнения:

  1. Запись обновлена ​​до нового значения
  2. Запись обновлена, но значения совпадают
  3. Запись не находит строки для обновления (т. Е. Ни одна строка не соответствует WHERE оговорка)

Мне интересно, как различить # 1 и 3: оба случая возвращают ноль в качестве числа затронутых строк, поэтому:

$result = $db->exec($statement)

буду иметь $result == 0 в обоих случаях. Как я могу определить разницу?

РЕДАКТИРОВАТЬ: Я хотел спросить, как провести различие между сценариями ДВА и 3, а не 1 и 3! Приносим извинения за неудобства…

2

Решение

Простым решением было бы два запроса.

Во-первых, запустите запрос SELECT, чтобы проверить, существует ли строка, с помощью mysqli_num_rows ().

Затем, если строка существует, вы можете выполнить запрос UPDATE и использовать mysqli_affered_rows ().


[РЕДАКТИРОВАТЬ]

…Я предложу потенциальную альтернативу для тех, кто ищет один звонок. Я не знаю, если вы заинтересованы в выполнении каких-либо вставок или просто ОБНОВЛЕНИЯ. Ниже приведена пища для размышлений:

С верхнего комментария @ http://php.net/manual/en/mysqli.affected-rows.php :

В запросах «INSERT INTO ON DUPLICATE KEY UPDATE», хотя можно ожидать, что disabled_rows вернет только 0 или 1 на строку в успешных запросах, фактически может вернуть 2.

Из руководства Mysql: «С ON DUPLICATE KEY UPDATE значение затронутых строк на строку равно 1, если строка вставлена ​​как новая строка, и 2, если существующая строка обновлена».

Увидеть: http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

Вот разбивка суммы за ряд:

+0: строка не была обновлена ​​или вставлена ​​(вероятно, потому что строка уже существовала, но никакие значения полей фактически не изменялись во время ОБНОВЛЕНИЯ)

+1: строка была вставлена

+2: строка была обновлена

Можете ли вы сделать это, чтобы удовлетворить ваши потребности?

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]