Я пытаюсь написать 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 .
Тем не менее, оказывается, что mysql_affected_rows
PHP – это фактические затронутые строки и может оставаться 0, если строка существует, но name
уже было «Test». (Документы PHP даже говорят, что это так).
Если я запустил это в командной строке, я получаю следующую метаинформацию о запросе:
Query OK, 0 rows affected (0.01 sec) Rows matched: 1 Changed: 0 Warnings: 0
Есть ли способ для меня получить значение «Rows соответствует» в PHP вместо затронутых строк?
[ Изменить ]: Должен заметить, что я знаю, что могу запускать отдельный запрос, но я бы не хотел этого делать ради производительности.
Из документации MySQL для mysql_affected_rows
:
Для операторов UPDATE, если вы указываете флаг CLIENT_FOUND_ROWS при подключении к mysqld, mysql_affected_rows () возвращает количество строк, сопоставляемых предложением WHERE. В противном случае поведение по умолчанию состоит в том, чтобы вернуть количество реально измененных строк.
С помощью 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 ( source ).
Вы также можете использовать функцию
$variable = mysql_info();
Эта функция извлекает такую строку:
Соответствие строк: 1 Изменено: 0 Предупреждения: 0
Вы можете работать со строковыми функциями в своей переменной, чтобы извлечь подстроку с количеством строк, которые соответствуют, и вы должны иметь это!