Получил немного кода PHP, с которым я борюсь – имел поиск в Google и т. Д., И попробовал все упомянутое, но по какой-то причине у меня возникли проблемы с его решением.
Проблема в:
У меня есть код, который запрашивает базу данных для присутствия конкретного пользователя.
Код (это метод внутри класса)
<?php global $mysqli; // Query specified database for value $q = 'SELECT id FROM ' . $database . ' WHERE username = \'' . $username . '\''; $r = $mysqli->query($q); var_dump($r); if ($r->num_rows) { // If row found username exists so return false return false; } ... ?>
Я var сбрасывал результат запроса ($ r) и получил это:
object(mysqli_result)#4 (5) { ["current_field"]=> int(0) ["field_count"]=> int(1) ["lengths"]=> NULL ["num_rows"]=> int(1) ["type"]=> int(0) }
Это правильно, должно быть только 1 строка, как указано выше.
Я получаю эту ошибку, if ($r->num_rows) {
на строку: if ($r->num_rows) {
Примечание. Пытается получить свойство не-объекта в ФАЙЛЕ на линии LINE
но я не знаю, почему, поскольку объект действителен (как указано выше), и он должен работать нормально. Из того, что я могу сказать, похоже, все идет хорошо, мне просто интересно, почему произошла ошибка. Я уверен, что это что-то простое, но я буду признателен за любую помощь.
$sql = "SELECT * FROM table"; $result = $conn->query($sql); if (!$result) { trigger_error('Invalid query: ' . $conn->error); }
проверьте ошибку с помощью функции mysqli_error ()
вероятно, ваш запрос имеет некоторые недостатки.
Просто подумал, что я немного расширюсь.
Если вы выполняете запрос MYSQLI SELECT, который возвращает 0 результатов, он возвращает FALSE.
Однако, если вы получите эту ошибку, и вы написали свою собственную функцию запроса MYSQLI, вы также можете получить эту ошибку, если выполняемый запрос не является выбранным, а обновляется. Запрос обновления вернет либо TRUE, либо FALSE. Поэтому, если вы просто предположите, что любой неверный результат будет иметь возвращенные записи, тогда вы будете отключены при запуске обновления или что-либо другое, кроме выбора.
Самое простое решение, после того как вы проверили, что это не false, нужно сначала проверить, что результат запроса является объектом.
$sqlResult = $connection->query($sql); if (!$sqlResult) { ... } else if (is_object($sqlResult)) { $sqlRowCount = $sqlResult->num_rows; } else { $sqlRowCount = 0; }
Я работал над написанием настраиваемого модуля в Drupal 7 и получил ту же ошибку:
Примечание. Попытка получить свойство не объекта
Мой код выглядит примерно так:
function example_node_access($node, $op, $account) { if ($node->type == 'page' && $op == 'update') { drupal_set_message('This poll has been published, you may not make changes to it.','error'); return NODE_ACCESS_DENY; } }
Решение: Я просто добавил условие if (is_object($sqlResult))
, и все прошло хорошо.
Вот мой последний код:
function mediaten_node_access($node, $op, $account) { if (is_object($node)){ if ($node->type == 'page' && $op == 'update') { drupal_set_message('This poll has been published, you may not make changes.','error'); return NODE_ACCESS_DENY; } } }
Я думаю, это не причина, о которой все говорили выше. В вашем коде что-то не так, может быть, пропустить орфографию или несоответствие именам столбцов базы данных. Если запрос mysqli не получает результата, он возвращает false, так что он не является объектом – это неправильная идея. Все работает нормально. он возвращает 1 или 0, если запрос имеет результат или нет.
Итак, мое предложение – проверить имена переменных и имена столбцов таблицы или любые другие орфографические ошибки.
Причина вашей проблемы проста. Так много людей столкнутся с одной и той же проблемой, потому что я тоже это сделал, и мне потребовался час, чтобы понять. На всякий случай, кто-то еще спотыкается. Проблема в вашем запросе, оператор select вызывает $dbname
вместо имени таблицы. Поэтому его не найдено, в результате чего возвращается false
которое является boolean
. Удачи.