Mysql
 sql >> база данни >  >> RDS >> Mysql

Не може да се получи броят на редовете и да се извлече, когато се използва MySQLi подготвен оператор

Ако искате да използвате mysqli_stmt::$num_rows (тоест проверете броя на редовете в подготвеното изявление), трябва да използвате $stmt->store_result() след изпълнение на подготвения оператор, преди да може да провери броя на редовете. Това означава, че резултатът се съхранява в паметта, преди да проверим колко реда са върнати.

$stmt = $conn->prepare($sql);
$stmt->bind_param('ss',$log_username,$log_username);
$stmt->execute();
$stmt->store_result(); // Need to store the result into memory first
if ($stmt->num_rows) {
    // ...

Ако обаче искате да използвате mysqli_result::$num_rows (в MySQLi-резултата, който преобразувате от резултата от израза), трябва да направите това, след като направите $result = $stmt->get_result(); и използвайте $result->num_rows; , както е показано по-долу.

$stmt = $conn->prepare($sql);
$stmt->bind_param('ss',$log_username,$log_username);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows) {
    while ($row = $result->fetch_assoc()) {
    // ....

В крайна сметка и двамата трябва да направят едно и също нещо - да предоставят определен брой редове, върнати от първоначално подготвената заявка.

Забележка
Важно е да се отбележи, че не можете да използвате store_result() и get_result() на същото изявление. Което означава, че в първия пример не можете да конвертирате в обект mysqli-result (чрез използване на get_result() , което ви позволява да използвате стандартния fetch_assoc() метод). Като store_result() съхранява резултата в паметта, няма нищо за get_result() за преобразуване и обратно.

Това означава, че ако използвате store_result() , трябва да извлечете чрез израза-извличане, mysqli_stmt::fetch() и обвържете резултатите чрез mysqli_stmt::bind_result() . Ако използвате get_result() , трябва да проверите броя на редовете в получения обект MySQLi-result (както е показано във втория пример).

Затова трябва да изградите своя код така, че да трябва да използвате само един от тях.

Като се има предвид това, използвайки affected_rows както е предложено в коментарите, не е правилният инструмент за работата - според ръководството на mysqli_stmt::$affected_rows (същото важи и за обикновена заявка, mysqli::$affected_rows ):




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Вмъкнете няколко имейла в mysql, като използвате едно текстово поле

  2. Чудна и досадна грешка:Извикване на недефинирана функция mysql_query()

  3. Използване на нишки за отправяне на заявки за база данни

  4. Създаване на емисия от множество модели на релси, ефективно?

  5. Разлика между схема/база данни в MySQL