Я пытаюсь получить результаты с помощью mysqli-> fetch_row () (или fetch_object (), fetch_array ()), но когда я иду запускать код во время выполнения, он вызывает следующую ошибку:
Неустранимая ошибка: вызовите функцию-член fetch_row () для не-объекта в … в строке 23.
Вопрос var, который делает это, равен $, приводит к приведенному ниже коду. $ user и $ password получают значения из другого .php-файла, в который этот файл включен, поэтому на данный момент это не очень важно. Теперь исправьте меня, если я ошибаюсь, но если $ results задано = $ db-> query ($ query), то разве он не должен наследовать свойства $ db aka класса mysqli?
class mySQLHelper{ public function checkPass($user, $pass){ global $db; $db = new mysqli(); $db->connect('localhost', 'root', '', 'mydb'); if (mysqli_connect_errno()){ echo 'Can not connect to database'; echo mysqli_connect_errno(). mysqli_connect_error(); exit; return false; } $query = "SELECT user, password FROM Users WHERE user = $user AND password = $pass " ; echo $query; $results = $db->query($query); while ($row = $results->fetch_row()){ echo htmlspecialchars($row->user); echo htmlspecialchars($row->password); } $results->close(); $url = 'http://'. $_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF'])."/"; if(!$results){ // mysqli_close($db); // header("Location:.$url.login.php&msg=1"); } else{ // mysqli_close($db); // header("Location:.$url.featured.php"); } }
}
Ваш запрос не работает в этой строке:
$results = $db->query($query);
Из-за этого $results
является false
не результатом, как вы ожидаете.
Чтобы устранить проблему, вам нужно добавить кавычки вокруг своих переменных (или использовать подготовленные заявления):
$query = "SELECT user, password FROM Users WHERE user = '".$user."' AND password = '".$pass."' " ;
Я бы предложил обновить, чтобы использовать подготовленный оператор для предотвращения проблем с SQL-инъекциями, хотя:
$stmt = $db->prepare('SELECT user, password FROM Users WHERE user = ? AND password = ?'); $stmt->bind_param('ss', $user, $pass); $stmt->execute(); $results = $stmt->get_result();
В сценарии отсутствует проверка ошибок, и поэтому ошибка в запросе не обрабатывается.
$query = "SELECT user, password FROM Users WHERE user = '$user' AND password = '$pass' " ; // ^ quotes needed echo $query; $results = $db->query($query); // handle a error in the query if(!$results) die($db->error); while ($row = $results->fetch_row()){ echo htmlspecialchars($row->user); echo htmlspecialchars($row->password); }
Если вы используете текст поля пользователя и пароля или varchar, то вам нужно использовать одиночную кавычку вокруг них
$query = "SELECT user, password FROM Users WHERE user = '".$user."' AND password = '".$pass."' " ;
Вы должны проверить, если запрос выполняется правильно:
if ($result = $mysqli->query($query)) { }
Используйте: var_dump ($ results), чтобы проверить, что он содержит
Почему вы проверяете, if($results)
после попытки манипулировать им?
Эта…
$results->close(); //... if(!$results){ //... }
конкретные$results->close(); //... if(!$results){ //... }
Должно быть…
if(!$results){ //... } $results->close();