В PHP почему mysqli_num_rows не возвращает целое число для запроса с 0 возвращенными строками? - PullRequest
0 голосов
/ 04 марта 2019

У меня странная проблема с mysqli_num_rows.В поисках этой проблемы я нашел только людей, у которых были проблемы с возвратом NULL, несмотря ни на что.Я также проверил официальную документацию для функции, и она говорит, что возвращает целое число строк, возвращаемых запросом.Всякий раз, когда мой запрос возвращает 1 строку (он никогда не должен возвращать больше), он ведет себя так, как я ожидал.Когда запрос возвращает 0 строк, я ожидаю, что функция вернет 0, но возвращает NULL.Почему он не возвращает 0?

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

function getArtistID($name) {
    global $conn; 
    $query = "SELECT artist_id FROM artist WHERE artist_name LIKE '${name}'";
    $result = mysqli_query($conn, $query);
    if ($result->num_rows) {
        $row = mysqli_fetch_assoc($result);
        return $row['artist_id'];
    } else {
        return 0;
    }
}

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Я просто не могу понять, почему это возвращает NULL, а не 0.

Мы можем только догадываться, не видя вывода журнала;но, скорее всего, возвращаемое значение равно нулю, поскольку вместо этого возникла ошибка.

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

0 голосов
/ 04 марта 2019

Вот некоторый код, который я использовал для воспроизведения случая, когда num_rows кажется NULL:

<?php
error_reporting(E_ALL);
$conn = new mysqli('127.0.0.1', 'root', null, 'test');
$sql = "SELECT * FROM dual";
$result = $conn->query($sql);
if ($result === false) {
  print "Error: {$conn->error}\n";
}
$n = $result->num_rows;
echo "Dump the num_rows property: ";
var_dump($n);

Вывод:

Error: No tables used

Notice: Trying to get property of non-object in /Users/bkarwin/Documents/SO/my.php on line 14
Dump the num_rows property: NULL

Уведомление о том, что доступ к нему недействителенобъектно-ориентированное свойство переменной, которая не является объектом.Это частый источник путаницы для разработчиков PHP, и это является побочным продуктом того факта, что PHP является свободно типизированным языком, и такие функции, как query(), могут возвращать либо объект результата, либо логический скаляр.

Функция query() фактически вернула false как $result из-за некоторой ошибки.В своем коде я проверил эту ошибку, а вы нет.

Когда вы запускаете mysqli::query() или mysqli::prepare() или mysqli_stmt::execute(), вы должны каждый раз проверять наличие ошибок .

Что-то в вашем запросе вызвало ошибку.Вы должны проверить на наличие ошибки и сообщить о ней.


Обновление: я отредактировал некоторый текст выше, чтобы улучшить объяснение, но некоторые комментарии ниже могут показаться неуместными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...