mysql_fetch_array () / mysql_fetch_assoc () / mysql_fetch_row () / mysql_num_rows etc ... ожидает, что параметр 1 будет ресурсом или результатом - PullRequest
929 голосов
/ 04 июня 2010

Я пытаюсь выбрать данные из таблицы MySQL, но получаю одно из следующих сообщений об ошибке:

mysql_fetch_array () ожидает, что параметр 1 будет ресурсом, логическое значение задано

или

mysqli_fetch_array () ожидает, что параметр 1 будет mysqli_result, логическое значение задано

или

Вызов функции-члена fetch_array () для логического / необъектного

Это мой код:

$username = $_POST['username'];
$password = $_POST['password'];

$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');

while($row = mysql_fetch_array($result)) {
    echo $row['FirstName'];
}

То же самое относится и к коду типа

$result = mysqli_query($mysqli, 'SELECT ...');
// mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given
while( $row=mysqli_fetch_array($result) ) {
    ...

и

$result = $mysqli->query($mysqli, 'SELECT ...');
// Call to a member function fetch_assoc() on a non-object
while( $row=$result->fetch_assoc($result) ) {
    ...

и

$result = $pdo->query('SELECT ...', PDO::FETCH_ASSOC);
// Invalid argument supplied for foreach()
foreach( $result as $row ) {
    ...

и

$stmt = $mysqli->prepare('SELECT ...');
// Call to a member function bind_param() on a non-object
$stmt->bind_param(...);

и

$stmt = $pdo->prepare('SELECT ...');
// Call to a member function bindParam() on a non-object
$stmt->bindParam(...);

Ответы [ 32 ]

3 голосов
/ 04 октября 2015

, поскольку $ username является переменной php, нам нужно передать ее как строку в mysqli, так как в запросе u, начинающемся с одинарной кавычки, мы будем использовать двойную кавычку, одинарную кавычку и точку полного останова для целей конкатенации ("'. $ username. '") если вы начали с двойной кавычки, вы бы изменили кавычки ('". $ username. "').

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE "'.$username.'"');

while($row = mysql_fetch_array($result))
     {
      echo $row['FirstName'];
     }

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '".$username."' ");

while($row = mysql_fetch_array($result))
     {
      echo $row['FirstName'];
     }

но использование Mysql сильно устарело, вместо этого используйте PDO. Это просто, но очень безопасно

0 голосов
/ 07 апреля 2019

Традиционно PHP был терпим к плохой практике и ошибкам в коде, что делает отладку довольно сложной.Проблема в этом конкретном случае заключается в том, что оба mysqli и PDO по умолчанию не сообщают вам о сбое запроса и просто возвращают FALSE.(Я не буду говорить об ограниченном расширении mysql . Поддержка подготовленных операторов является достаточной причиной для переключения на PDO или mysqli .) Но вы можете изменить стандартное поведение PHP, чтобы оно всегда выдавало исключений при сбое запроса.

Для PDO : использовать $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

error_reporting(E_ALL);

$pdo = new PDO("mysql:host=localhost;dbname=test", "test","");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$result = $pdo->query('select emal from users');
$data = $result->fetchAll();

Это покажет вам следующее:

Неустранимая ошибка: необработанное исключение 'PDOException' с сообщением 'SQLSTATE [42S22]: столбец не найден: 1054 Неизвестный столбец' emal 'в' списке полей'' в E: \ htdocs \ test \ mysql_errors \ pdo.php в строке 8

PDOException: SQLSTATE [42S22]: столбец не найден: 1054 Неизвестный столбец 'emal' в 'списке полей' в E: \htdocs \ test \ mysql_errors \ pdo.php в строке 8

Как видите, он точно говорит вам, что не так с запросом и где его исправить в коде.

Без $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); вы получите

Неустранимая ошибка: вызов функции-члена fetchAll () для логического значения в E: \ htdocs \ test \ mysql_errors \ pdo.php в строке 9

для mysqli : используйте mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

error_reporting(E_ALL);

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'test', '', 'test');

$result = $mysqli->query('select emal from users');
$data = $result->fetch_all();

Вы получите

Неустранимая ошибка: необработанное исключение «mysqli_sql_exception» с сообщением «Неизвестный столбец« emal »в« списке полей »в E: \ htdocs \ test \ mysql_errors \ mysqli.php в строке 8

mysqli_sql_exception: Неизвестный столбец 'emal' в 'списке полей' в E: \ htdocs \ test \ mysql_errors \ mysqli.php в строке 8

Без mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); вы получите только

Неустранимая ошибка: вызов функции-члена fetch_all () для логического значения в E: \ htdocs \ test \ mysql_errors \ mysqli.php в строке 10

Конечно, вы можете вручную проверить ошибки MySQL,Но я бы сошел с ума, если бы мне приходилось делать это каждый раз, когда я делал опечатку - или еще хуже - каждый раз, когда я хотел бы запросить базу данных.

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