Я пытаюсь записать процессор базы данных PHP-MySQL, который несколько интеллектуален. Когда этот процессор решает, что должен сделать обновление, я хочу сообщить, было ли это действительно успешно или нет. Я думал, что мог использовать mysql_affected_rows
...
// Example:
// After running query "UPDATE mytable SET name='Test' WHERE ID=1"
$result = mysql_affected_rows();
if ($result >= 1) { /* Success */ }
Если, например, не было никакой строки с ID=1, то $result
был бы 0.
Однако оказывается что PHP's mysql_affected_rows
фактические затронутые строки и могут быть все еще быть 0, если строка существует, но name
уже был "Тест". (В документах PHP даже говорится дело обстоит так).
Если я выполняю это в командной строке, я получаю следующую метаинформацию о запросе:
Query OK, 0 rows affected (0.01 sec)
Rows matched: 1 Changed: 0 Warnings: 0
Есть ли какой-либо способ для меня получить это, "Строки соответствовали" значению в PHP вместо затронутых строк?
[Править]: Я должен отметить, что знаю, что я могу выполнить отдельный запрос, но я хотел бы не сделать это ради производительности.
Из документации MySQL для mysql_affected_rows
:
Для операторов UPDATE, если вы укажете флаг CLIENT_FOUND_ROWS, когда подключение к mysqld, mysql_affected_rows () возвращает количество строк, соответствующих ГДЕ пункт. В противном случае по умолчанию поведение - вернуть количество строки действительно изменились.
В mysqli вы можете указать CLIENT_FOUND_ROWS, используя mysqli :: real_connect .
$db = mysqli_init();
$db->real_connect('host', 'username', 'password', 'dbname', '3306', null, MYSQLI_CLIENT_FOUND_ROWS);
В PDO константа называется PDO :: MYSQL_ATTR_FOUND_ROWS
$db = new PDO('mysql:dbname=mydatabase;host=myhost', 'username', 'password', array(
PDO::MYSQL_ATTR_FOUND_ROWS => true
));
В старом и устаревшем расширении MySQL вы можете указать CLIENT_FOUND_ROWS, передавая значение 2 в качестве 5-го параметра для mysql_connect ( источник ).