Что такое код msql_affected_rows


mysql_affected_rows, чтобы выяснить тип запроса

У меня есть класс утилиты в моем PHP-коде, который предоставляет оболочку для некоторых функций mysql. Одна из функций с именем query() принимает строку запроса в качестве аргумента и затем выполняет этот запрос. В этой функции запроса я хочу узнать, является ли данный запрос результатом изменения состояния данных (UPDATE/INSERT/DELETE etc.) Или простым запросом на извлечение данных (SHOW/SELECT) .

Я планировал использовать функцию mysql_affected_rows для этого, так как руководство php сообщает, что эта функция «Получает количество затронутых строк last INSERT, UPDATE, REPLACE or DELETE query «.

Я предполагал, что я получу 0 или нуль для запроса SELECT. Я знаю, что даже те запросы UPDATE/DELETE которые не вносят никаких изменений, возвращают 0, но это нормально с моей перспективы кода, потому что я хочу только идентифицировать те запросы, которые фактически сделали некоторые изменения данных.

Но когда я действительно выполнял код, mysql_affected_rows возвращает мне количество выбранных строк для запросов SELECT.

Это ожидаемое поведение? Я искал справочники по php, но они не уточняют, каким будет поведение mysql_affected_rows в случае запросов SELECT.

Я просмотрел документацию по MySql, и он говорит, mysql_affected_rows функция mysql_affected_rows MySql, как ожидается, будет работать как mysql_num_rows (что согласуется с поведением, которое я вижу).

Итак, есть ли какая-либо другая функция php, которая может помочь мне идентифицировать тип запроса без фактического разбора запроса?

mysql_affected_rows

mysql_affected_rows — получает количество рядов, задействованных в предыдущей MySQL-операции.

Описание

int mysql_affected_rows ([resource link_identifier])

mysql_affected_rows() возвращает количество рядов, задействованных в последнем запросе INSERT, UPDATE или DELETE, ассоциированном с идентификатором link_identifier. Если link identifier не специфицирован, принимается последняя ссылка, открытая функцией mysql_connect().

Примечание: если вы используете транзакции, необходимо вызывать mysql_affected_rows() после запроса INSERT, UPDATE или DELETE, а не после подтверждения транзакции.


Если последним запросом был DELETE без оператора WHERE, все записи таблицы будут удалены, но функция возвратит нуль.

Примечание: при использовании UPDATE, MySQL не обновит столбцы, где новое значение — такое же, как и старое. Это создаёт возможность того, что mysql_affected_rows() совпадёт не с количеством рядов, задействованных реально, а только с рядами, непосредственно изменёнными запросом.

mysql_affected_rows() не работает с операторами SELECT; только с операторами, модифицирующими запись. Для запрашивания количества рядов, возвращённых SELECT, используйте mysql_num_rows().

Если последний запрос потерпел неудачу, эта функция возвратит -1.

mysqli->affected_rows

mysqli->affected_rows — mysqli_affected_rows — Gets the number of affected rows in a previous MySQL operation

Описание

Returns the number of rows affected by the last INSERT, UPDATE, REPLACE or DELETE query.

For SELECT statements mysqli_affected_rows() works like mysqli_num_rows() .

Список параметров

Только для процедурного стиля: Идентификатор соединения, полученный с помощью mysqli_connect() или mysqli_init()

Возвращаемые значения

An integer greater than zero indicates the number of rows affected or retrieved. Zero indicates that no records where updated for an UPDATE statement, no rows matched the WHERE clause in the query or that no query has yet been executed. -1 indicates that the query returned an error.

Илон Маск рекомендует:  Ошибка с блочными ссылками в IE6


If the number of affected rows is greater than maximal int value, the number of affected rows will be returned as a string.

Примеры

Пример #1 mysqli->affected_rows example

= new mysqli ( «localhost» , «my_user» , «my_password» , «world» );

/* check connection */
if ( mysqli_connect_errno ()) <
printf ( «Connect failed: %s\n» , mysqli_connect_error ());
exit();
>

/* Insert rows */
$mysqli -> query ( «CREATE TABLE Language SELECT * from CountryLanguage» );
printf ( «Affected rows (INSERT): %d\n» , $mysqli -> affected_rows );

$mysqli -> query ( «ALTER TABLE Language ADD Status int default 0» );

/* update rows */
$mysqli -> query ( «UPDATE Language SET Status=1 WHERE Percentage > 50» );
printf ( «Affected rows (UPDATE): %d\n» , $mysqli -> affected_rows );

/* delete rows */
$mysqli -> query ( «DELETE FROM Language WHERE Percentage );
printf ( «Affected rows (DELETE): %d\n» , $mysqli -> affected_rows );

/* select all rows */
$result = $mysqli -> query ( «SELECT CountryCode FROM Language» );
printf ( «Affected rows (SELECT): %d\n» , $mysqli -> affected_rows );

/* Delete table Language */
$mysqli -> query ( «DROP TABLE Language» );

/* close connection */
$mysqli -> close ();
?>

= mysqli_connect ( «localhost» , «my_user» , «my_password» , «world» );


if (! $link ) <
printf ( «Can’t connect to localhost. Error: %s\n» , mysqli_connect_error ());
exit();
>

/* Insert rows */
mysqli_query ( $link , «CREATE TABLE Language SELECT * from CountryLanguage» );
printf ( «Affected rows (INSERT): %d\n» , mysqli_affected_rows ( $link ));

mysqli_query ( $link , «ALTER TABLE Language ADD Status int default 0» );

/* update rows */
mysqli_query ( $link , «UPDATE Language SET Status=1 WHERE Percentage > 50» );
printf ( «Affected rows (UPDATE): %d\n» , mysqli_affected_rows ( $link ));

/* delete rows */
mysqli_query ( $link , «DELETE FROM Language WHERE Percentage );
printf ( «Affected rows (DELETE): %d\n» , mysqli_affected_rows ( $link ));

/* select all rows */
$result = mysqli_query ( $link , «SELECT CountryCode FROM Language» );
printf ( «Affected rows (SELECT): %d\n» , mysqli_affected_rows ( $link ));

/* Delete table Language */
mysqli_query ( $link , «DROP TABLE Language» );

/* close connection */
mysqli_close ( $link );
?>

Результат выполнения данных примеров:

Смотрите также

  • mysqli_num_rows() — Gets the number of rows in a result
  • mysqli_info() — Retrieves information about the most recently executed query

Что такое код msql_affected_rows


mysql_affected_rows — получает количество рядов, задействованных в предыдущей MySQL-операции.

Описание

int mysql_affected_rows ([resource link_identifier])

mysql_affected_rows() возвращает количество рядов, задействованных в последнем запросе INSERT, UPDATE или DELETE, ассоциированном с идентификатором link_identifier . Если link identifier не специфицирован, принимается последняя ссылка, открытая функцией mysql_connect() .

Примечание: если вы используете транзакции, необходимо вызывать mysql_affected_rows() после запроса INSERT, UPDATE или DELETE, а не после подтверждения транзакции.

Если последним запросом был DELETE без оператора WHERE, все записи таблицы будут удалены, но функция возвратит нуль.

Примечание: при использовании UPDATE, MySQL не обновит столбцы, где новое значение — такое же, как и старое. Это создаёт возможность того, что mysql_affected_rows() совпадёт не с количеством рядов, задействованных реально, а только с рядами, непосредственно изменёнными запросом.

mysql_affected_rows() не работает с операторами SELECT; только с операторами, модифицирующими запись. Для запрашивания количества рядов, возвращённых SELECT, используйте mysql_num_rows() .

Что такое код msql_affected_rows

my_ulonglong mysql_affected_rows(MYSQL *mysql)

8.4.3.2 Описание

Возвращает количество строк, измененных последней командой UPDATE , удаленных последней командой DELETE или вставленных последней командой INSERT . Может быть вызвана немедленно после mysql_query() для команд UPDATE , DELETE или INSERT . Для команд SELECT mysql_affected_rows() работает аналогично mysql_num_rows() .

Илон Маск рекомендует:  Что такое код asp poolidctimeout

8.4.3.3 Возвращаемые значения

Целое число больше нуля равно количеству строк, подвергшихся воздействию или извлеченных. Нуль указывает, что ни одна из записей не была обновлена для команды UPDATE , ни одна из строк не совпала с утверждением WHERE в данном запросе или что ни один запрос еще не был выполнен. Значение -1 показывает, что данный запрос возвратил ошибку или что для запроса SELECT функция mysql_affected_rows() была вызвана прежде вызова функции mysql_store_result() .


8.4.3.4 Ошибки


8.4.3.5 Пример

Если указывается флаг CLIENT_FOUND_ROWS при подключении к mysqld , то mysql_affected_rows() возвратит количество строк, соответствующих выражению WHERE для команд UPDATE .

Следует отметить, что при использовании команды REPLACE функция mysql_affected_rows() возвратит значение 2, если новая строка заменила старую. Это происходит по той причине, что в данном случае одна строка была внесена и затем дублирующая была удалена.

mysql_affected_rows не отображает сообщение

Я пытаюсь отобразить затронутые строки, но по какой-то причине он не работает. когда я запускаю этот код ниже, PHP mysql_affected_rows() ничего не отображает. любые предложения

Это то, что я есть:

    2 1
  • 13 мар 2020 2020-03-13 22:51:22
  • Karish Karish

1 ответ


Вы серьезно смешивания mysql и mysqli функции? Кажется, вы используете OO API, так что это может быть только mysqli . Вы не можете их смешивать.

Это функция, что вам нужно: mysqli_affected_rows или $mysqli->affected_rows .

mysql_affected_rows выяснить тип запроса

У меня есть служебный класс в моем PHP — код , который обеспечивает обертку для некоторых функций MySQL. Одна из функций , названных query() принимает строку запроса в качестве аргумента , а затем выполняет этот запрос. В этой функции запроса я хочу , чтобы выяснить , если данный запрос состояния изменения данных запроса (UPDATE/INSERT IGNORE /DELETE etc.) или простой запрос извлечения данных (SHOW/SELECT) .

Я планировал использовать mysql_affected_rows функцию для этого , как руководство PHP говорит , что эта функция «Возвращает число затронутых строк самого last INSERT IGNORE , UPDATE, REPLACE or DELETE query ».

Я предполагал , я хотел бы получить 0 или NULL для отборного запроса. Я знаю , что даже те UPDATE/DELETE запросы , которые не делают каких — либо изменений будет возвращать 0 , но это нормально , с моей точки зрения кода , потому что я только хочу , чтобы определить те запросы , которые фактически сделали некоторую модификацию данных.

Но когда я на самом деле выполняется код, mysql_affected_rows возвращает мне количество выбранных строк для SELECT , запросов.

Это ожидаемое поведение? Я посмотрел PHP инструкции , но они не вдаваться в подробности о том , что было бы поведение mysql_affected_rows в случае SELECT , запросов.

Я посмотрел MySql документацию и говорит MySql mysql_affected_rows функция , как ожидается , работать как mysql_num_rows (что согласуется с поведением я вижу).

Так есть ли другие функции PHP, которые могут помочь мне определить тип запроса, фактически разбора запроса?

Безопасно ли использовать mysql_affected_rows

Можно ли использовать mysql_affected_rows для получения количества строк, затронутых при выполнении обновления пользователем? Что делать, если несколько пользователей обновляют свои пароли, и мне нужно знать, было ли успешное обновление каждого пользователя или нет. Поэтому, если 3 пользователя сделали обновления одновременно, mysql_affected_rows может вернуть 2, даже если одно обновление пользователей не было успешным. Так оно и есть? Я не могу тестировать несколько пользователей одновременно. Насколько это безопасно.

Это безопасно. Он возвращает только данные о последнем запросе в вашем собственном соединении.


Документация PHP (благодаря Fluffeh ):

Получите количество затронутых строк последним запросом INSERT, UPDATE, REPLACE или DELETE, связанным с link_identifier .

Поскольку это тонкая оболочка над MySQL C API, мы также можем проверить, что :

my_ulonglong mysql_affected_rows (MYSQL * mysql)

Это явно не указано нигде, насколько я могу видеть, но он принимает идентификатор соединения, и кажется, что общий шаблон заключается в том, что все функции возвращают данные о конкретном соединении:

Использование столбцов LAST_INSERT_ID () и AUTO_INCREMENT одновременно от нескольких клиентов вполне допустимо. Каждый клиент получит последний вставленный идентификатор для последнего оператора, который был выполнен клиентом.

В любом случае, это было бы довольно непригодно, если бы вы не были уверены, получен ли ваш результат или нет.

Илон Маск рекомендует:  strtolower - Преобразует строку в нижний регистр

Это безопасно и возвращает значение для вашего текущего соединения с БД ( функция mysql-affected-rows ).

Это безопасно, потому что это зависит от подключения.

Если вы передаете ссылку на свое соединение в качестве параметра, оно относится к этому соединению и поэтому безопасно использовать, даже если одновременные пользователи получают доступ к вашему скрипту – потому что каждый из них будет использовать отдельное соединение! См. Документацию для mysql_affected_rows .

Обратите внимание, однако, что расширение mysql в целом устарело. Подумайте о переходе на MySQLi или PDO_MySQL!

Я использую mysql_query(«SELECT ROW_COUNT();»); , Я всегда находил, что это сработало лучше.

Можно ли обнаружить ошибку в этом PHP/MySQL код UPDATE — mysql_affected_rows() возвращает неправильно


У меня есть этот PHP код:

Первый посмотреть запрос-1 работает отлично .. НО Второй QUERY2 работ но mysql_affected_rows() не сообщает мне, была ли обновлена ​​запись, почему?

Я думаю, предупреждение состоит в том, что query2 не возвращает идентификатор ресурса, который необходим mysqL_affected_rows().

  • обе дБ и таблица находятся в utf8. что я делаю неправильно?

Создан 02 мар. 13 2013-03-02 17:19:34 ali

Пожалуйста, скажите мне, что это ** не ** настоящие данные аутентификации, которые вы только что опубликовали на общедоступном веб-сайте. – Oliver Charlesworth 02 мар. 13 2013-03-02 17:23:29

[** Пожалуйста, не используйте ‘mysql_ *’ функции в новом коде **] (http://bit.ly/phpmsql). Они больше не поддерживаются [и официально устарели] (https://wiki.php.net/rfc/mysql_deprecation). См. [** красное поле **] (http://j.mp/Te9zIL)? Узнайте о [* подготовленных операторах *] (http://j.mp/T9hLWi) и используйте [PDO] (http://php.net/pdo) или [MySQLi] (http://php.net/ mysqli) — [эта статья] (http://j.mp/QEx8IB) поможет вам решить, какой из них. Если вы выберете PDO, [здесь хороший учебник] (http://j.mp/PoWehJ). – DCoder 02 мар. 13 2013-03-02 17:24:31

Попробуйте одно: прямо перед строкой, начинающейся с $ result2 = . добавьте следующий код: echo $ query2; и посмотрите на выход. – Steve 02 мар. 13 2013-03-02 17:26:46

mysql_affected_rows

mysql_affected_rows — получает количество рядов, задействованных в предыдущей MySQL-операции.

Описание

int mysql_affected_rows ([resource link_identifier])

mysql_affected_rows() возвращает количество рядов, задействованных в последнем запросе INSERT, UPDATE или DELETE, ассоциированном с идентификатором link_identifier . Если link identifier не специфицирован, принимается последняя ссылка, открытая функцией mysql_connect() .

Примечание: если вы используете транзакции, необходимо вызывать mysql_affected_rows() после запроса INSERT, UPDATE или DELETE, а не после подтверждения транзакции.

Если последним запросом был DELETE без оператора WHERE, все записи таблицы будут удалены, но функция возвратит нуль.

Примечание: при использовании UPDATE, MySQL не обновит столбцы, где новое значение — такое же, как и старое. Это создаёт возможность того, что mysql_affected_rows() совпадёт не с количеством рядов, задействованных реально, а только с рядами, непосредственно изменёнными запросом.

mysql_affected_rows() не работает с операторами SELECT; только с операторами, модифицирующими запись. Для запрашивания количества рядов, возвращённых SELECT, используйте mysql_num_rows() .

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL