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 ]

12 голосов
/ 05 августа 2015

Каждый раз, когда вы получаете ...

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

... вероятно, потому что есть проблема с вашим запросом. prepare() или query() может возвращать FALSE (логическое значение), но это общее сообщение об ошибке не оставляет вас на пути подсказок. Как вы узнаете, что не так с вашим запросом? Вы спрашиваете !

Прежде всего, убедитесь, что отчеты об ошибках включены и видимы: добавьте эти две строки в начало файла (ов) сразу после открытия тега <?php:

error_reporting(E_ALL);
ini_set('display_errors', 1);

Если ваше сообщение об ошибке установлено в php.ini, вам не придется об этом беспокоиться. Просто убедитесь, что вы корректно обрабатываете ошибки и никогда не раскрываете истинную причину каких-либо проблем для ваших пользователей. Раскрытие истинной причины для общественности может быть приглашением с золотой гравировкой для тех, кто хочет навредить вашим сайтам и серверам. Если вы не хотите отправлять ошибки в браузер, вы всегда можете отслеживать журналы ошибок вашего веб-сервера. Расположение журналов будет варьироваться от сервера к серверу, например, в Ubuntu журнал ошибок обычно находится в /var/log/apache2/error.log. Если вы просматриваете журналы ошибок в среде Linux, вы можете использовать tail -f /path/to/log в окне консоли, чтобы увидеть ошибки по мере их появления в режиме реального времени .... или по мере их возникновения.

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

$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
$query = $mysqli->prepare($sql)); // assuming $mysqli is the connection
$query->bind_param('s', $definition);
$query->execute();

Ошибка является общей и не очень полезна для решения происходящего.

С помощью пары строк кода вы можете получить очень подробную информацию, которую можно использовать для немедленного решения проблемы . Проверьте правильность заявления prepare() и, если оно хорошо, вы можете перейти к обязательному исполнению и выполнению.

$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
if($query = $mysqli->prepare($sql)) { // assuming $mysqli is the connection
    $query->bind_param('s', $definition);
    $query->execute();
    // any additional code you need would go here.
} else {
    $error = $mysqli->errno . ' ' . $mysqli->error;
    echo $error; // 1054 Unknown column 'foo' in 'field list'
}

Если что-то не так, вы можете выдать сообщение об ошибке, которое приведет вас непосредственно к проблеме. В этом случае в таблице нет столбца foo, решение проблемы тривиально.

При желании вы можете включить эту проверку в функцию или класс и расширить ее, корректно обработав ошибки, как упоминалось ранее.

11 голосов
/ 06 апреля 2015
<?php
      $username = $_POST['username'];
       $password = $_POST['password'];

     $result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '".mysql_real_escape_string($username)."'")or die(mysql_error());
while($row=mysql_fetch_array($result))
  {
 echo $row['FirstName'];
 }
 ?>
11 голосов
/ 29 апреля 2013

Сначала проверьте подключение к базе данных. Это успешно связано или нет?

Если это сделано, то после этого я написал этот код, и он хорошо работает:

if (isset($_GET['q1mrks']) && isset($_GET['marks']) && isset($_GET['qt1'])) {
    $Q1mrks = $_GET['q1mrks'];
    $marks = $_GET['marks'];
    $qt1 = $_GET['qt1'];

    $qtype_qry = mysql_query("
        SELECT *
        FROM s_questiontypes
        WHERE quetype_id = '$qt1'
    ");
    $row = mysql_fetch_assoc($qtype_qry);
    $qcode = $row['quetype_code'];

    $sq_qry = "
        SELECT *
        FROM s_question
        WHERE quetype_code = '$qcode'
        ORDER BY RAND() LIMIT $Q1mrks
    ";
    $sq_qry = mysql_query("
        SELECT *
        FROM s_question
        WHERE quetype_code = '$qcode'
        LIMIT $Q1mrks
    ");
    while ($qrow = mysql_fetch_array($sq_qry)) {
        $qm = $qrow['marks'] . "<br />";
        $total += $qm . "<br />";
    }
    echo $total . "/" . $marks;
}
10 голосов
/ 13 октября 2014

Убедитесь, что вы не закрываете базу данных, используя db_close (), прежде чем Выполнение вашего запроса:

Если вы используете несколько запросов в сценарии, даже если вы включаете другие страницы, содержащие запросы или соединение с базой данных, возможно, что в любом месте вы используете db_close (), которая закрывает соединение с базой данных, поэтому убедитесь Вы не делаете эту ошибку в своих сценариях.

9 голосов
/ 08 ноября 2014

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

9 голосов
/ 06 июля 2013

Сначала проверьте соединение.

Тогда, если вы хотите получить точное значение из базы данных, вы должны написать:

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

Или вы хотите получить значение типа LIKE, тогда вы должны написать:

$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'");
8 голосов
/ 16 декабря 2013

Вы также можете проверить, не работает ли $result следующим образом, перед выполнением массива выборки

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');
if(!$result)
{
     echo "error executing query: "+mysql_error(); 
}else{
       while($row = mysql_fetch_array($result))
       {
         echo $row['FirstName'];
       }
}
7 голосов
/ 26 ноября 2014

Вы можете попробовать этот код. Я обнаружил это раньше, когда столкнулся с проблемой, похожей на вашу.

if (isset($_GET['q1mrks']) && isset($_GET['marks']) && isset($_GET['qt1'])) {
$Q1mrks = $_GET['q1mrks'];
$marks = $_GET['marks'];
$qt1 = $_GET['qt1'];

$qtype_qry = mysql_query("
    SELECT *
    FROM s_questiontypes
    WHERE quetype_id = '$qt1'
");
$row = mysql_fetch_assoc($qtype_qry);
$qcode = $row['quetype_code'];

$sq_qry = "
    SELECT *
    FROM s_question
    WHERE quetype_code = '$qcode'
    ORDER BY RAND() LIMIT $Q1mrks
";
$sq_qry = mysql_query("
    SELECT *
    FROM s_question
    WHERE quetype_code = '$qcode'
    LIMIT $Q1mrks
");
while ($qrow = mysql_fetch_array($sq_qry)) {
    $qm = $qrow['marks'] . "<br />";
    $total += $qm . "<br />";
}
echo $total . "/" . $marks;
}
6 голосов
/ 21 января 2014

Обычно ошибка возникает при сбое подключения к базе данных, поэтому обязательно подключите базу данных или включите файл базы данных.

include_once(db_connetc.php');

OR

// Create a connection
$connection = mysql_connect("localhost", "root", "") or die(mysql_error());

//Select database
mysql_select_db("db_name", $connection) or die(mysql_error());

$employee_query = "SELECT * FROM employee WHERE `id` ='".$_POST['id']."'";

$employee_data = mysql_query($employee_query);

if (mysql_num_rows($employee_data) > 0) {

    while ($row = mysql_fetch_array($employee_data)){
        echo $row['emp_name'];
    } // end of while loop
} // end of if
  • Рекомендуется выполнить запрос в sqlyog, а затем скопировать его в код вашей страницы.
  • Всегда сохраняйте ваш запрос в переменной, а затем выводите эту переменную. Затем перейдите к mysql_query($query_variable);.
4 голосов
/ 28 апреля 2014

Попробуйте этот код, он отлично работает

назначить переменную post переменной

   $username = $_POST['uname'];

   $password = $_POST['pass'];

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

if(!empty($result)){

    while($row = mysql_fetch_array($result)){
        echo $row['FirstName'];
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...