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 ]

653 голосов
/ 04 июня 2010

Запрос может завершиться ошибкой по разным причинам, и в этом случае mysql_ * и расширение mysqli вернут false из соответствующих функций / методов запроса. Вам необходимо проверить это условие ошибки и обработать его соответствующим образом.

mysql_ * расширение :

ПРИМЕЧАНИЕ Функции mysql_ устарели и удалены в php версии 7.

Проверьте $result, прежде чем передать его на mysql_fetch_array. Вы обнаружите, что это false, потому что запрос не выполнен. См. Документацию mysql_query для возможных возвращаемых значений и предложения о том, как с ними обращаться.

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

if($result === FALSE) { 
    die(mysql_error()); // TODO: better error handling
}

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

расширение mysqli
процедурный стиль :

$username = mysqli_real_escape_string($mysqli, $_POST['username']);
$result = mysqli_query($mysqli, "SELECT * FROM Users WHERE UserName LIKE '$username'");

// mysqli_query returns false if something went wrong with the query
if($result === FALSE) { 
    yourErrorHandler(mysqli_error($mysqli));
}
else {
    // as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach
    foreach( $result as $row ) {
        ...

oo-style :

$username = $mysqli->escape_string($_POST['username']);
$result = $mysqli->query("SELECT * FROM Users WHERE UserName LIKE '$username'");

if($result === FALSE) { 
    yourErrorHandler($mysqli->error); // or $mysqli->error_list
}
else {
    // as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach
    foreach( $result as $row ) {
      ...

с использованием подготовленного заявления:

$stmt = $mysqli->prepare('SELECT * FROM Users WHERE UserName LIKE ?');
if ( !$stmt ) {
    yourErrorHandler($mysqli->error); // or $mysqli->error_list
}
else if ( !$stmt->bind_param('s', $_POST['username']) ) {
    yourErrorHandler($stmt->error); // or $stmt->error_list
}
else if ( !$stmt->execute() ) {
    yourErrorHandler($stmt->error); // or $stmt->error_list
}
else {
    $result = $stmt->get_result();
    // as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach
    foreach( $result as $row ) {
      ...

Эти примеры только иллюстрируют , что следует сделать (обработка ошибок), а не как это сделать. Рабочий код не должен использовать or die при выводе HTML, иначе он будет (по крайней мере) генерировать недопустимый HTML. Кроме того, сообщения об ошибках базы данных не должны отображаться для пользователей, не являющихся администраторами, так как раскрывает слишком много информации .

163 голосов
/ 26 июля 2012

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

  • mysql_fetch_array / mysqli_fetch_array()
  • mysql_fetch_assoc() / mysqli_fetch_assoc()
  • mysql_num_rows() / mysqli_num_rows()

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

Шаги по устранению неполадок

  • Убедитесь, что сервер разработки настроен для отображения всех ошибок,Вы можете сделать это, разместив это в верхней части ваших файлов или в вашем конфигурационном файле: error_reporting(-1);.Если у вас есть какие-либо синтаксические ошибки, это укажет на них.

  • Используйте mysql_error().mysql_error() будет сообщать обо всех ошибках, обнаруженных MySQL при выполнении вашего запроса.

    Пример использования:

    mysql_connect($host, $username, $password) or die("cannot connect"); 
    mysql_select_db($db_name) or die("cannot select DB");
    
    $sql = "SELECT * FROM table_name";
    $result = mysql_query($sql);
    
    if (false === $result) {
        echo mysql_error();
    }
    
  • Запустите запрос из командной строки MySQL или из такого инструмента, как PHPMYADMIN .Если в вашем запросе есть синтаксическая ошибка, это скажет вам, что это такое.

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

  • Убедитесь, что вы экранировали свои значения.Кавычки в вашем запросе могут привести к сбою запроса (а также оставить вас открытыми для SQL-инъекций).Используйте mysql_real_escape_string() для выхода из вашего ввода.

  • Убедитесь, что вы не смешиваете функции mysqli_* и mysql_*.Они не одно и то же и не могут использоваться вместе.(Если вы собираетесь выбрать ту или иную флешку с mysqli_*. Смотри ниже, почему.)

Другие советы

mysql_* функции не должны использоваться для нового кода.Они больше не поддерживаются, и сообщество начало процесс устаревания .Вместо этого вы должны узнать о подготовленных операторах и использовать либо PDO , либо MySQLi .Если вы не можете решить, эта статья поможет выбрать.Если вы хотите учиться, вот хорошее руководство по PDO .

110 голосов
/ 04 июня 2010

Ошибка произошла здесь из-за использования одинарных кавычек ('). Вы можете поставить свой запрос так:

mysql_query("
SELECT * FROM Users 
WHERE UserName 
LIKE '".mysql_real_escape_string ($username)."'
");

Используется mysql_real_escape_string для предотвращения внедрения SQL. Хотя мы должны использовать расширение MySQLi или PDO_MYSQL для обновленной версии PHP (PHP 5.5.0 и более поздних версий), но для более старых версий mysql_real_escape_string подойдет.

60 голосов
/ 04 июня 2010

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

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

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

if($result)
{
    while($row = mysql_fetch_array($result))
    {
        echo $row['FirstName'];
    }
} else {
    echo 'Invalid query: ' . mysql_error() . "\n";
    echo 'Whole query: ' . $query; 
}

См. Документацию для mysql_query() для получения дополнительной информации.

Фактическая ошибка заключалась в одинарных кавычках, поэтому переменная $username не была проанализирована. Но вам действительно следует использовать mysql_real_escape_string($username), чтобы избежать SQL-инъекций.

54 голосов
/ 04 июня 2010

Поместите кавычки вокруг $username.Строковые значения, в отличие от числовых значений, должны быть заключены в кавычки.

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

Также нет смысла использовать условие LIKE, если вы не используете подстановочные знаки: если вам нужны точныеиспользуйте = вместо LIKE.

44 голосов
/ 25 апреля 2012

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

Чек

mysql_select_db('database name ')or DIE('Database name is not available!');

до запроса MySQL а затем перейдите к следующему шагу

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

f($result === FALSE) {
    die(mysql_error());
41 голосов
/ 04 июня 2010

Ваш код должен быть примерно таким

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

if($result === FALSE) {
    die(mysql_error("error message for the user")); 
}

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

Как только вы это сделаете, вы получите запрос, напечатанный на экране. Попробуйте этот запрос на вашем сервере и посмотрите, даст ли он желаемые результаты. В большинстве случаев ошибка в запросе. Остальная часть кода верна.

36 голосов
/ 08 января 2012
$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');

Вы определяете строку, используя одинарные кавычки, а PHP не анализирует строки, разделенные одинарными кавычками. Чтобы получить переменную интерполяцию, вам нужно использовать двойные кавычки ИЛИ конкатенацию строк (или их комбинацию). См. http://php.net/manual/en/language.types.string.php для получения дополнительной информации.

Также вы должны убедиться, что mysql_query вернул действительный ресурс результата, иначе fetch_ *, num_rows и т. Д. Не будут работать с результатом, поскольку это не результат! IE:

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

if( $result === FALSE ) {
   trigger_error('Query failed returning error: '. mysql_error(),E_USER_ERROR);
} else {
   while( $row = mysql_fetch_array($result) ) {
      echo $row['username'];
   }
}

http://us.php.net/manual/en/function.mysql-query.php для получения дополнительной информации.

35 голосов
/ 23 апреля 2013

Этот запрос должен работать:

$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'");
while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}

Проблема заключается в одинарных кавычках, поэтому ваш запрос не выполняется и возвращает FALSE, а ваш цикл WHILE не может быть выполнен. Использование% позволяет сопоставить любые результаты, содержащие вашу строку (например, SomeText- $ username-SomeText).

Это просто ответ на ваш вопрос, вы должны реализовать вещи, упомянутые в других постах: обработка ошибок, использование escape-строк (пользователи могут вводить в поле все что угодно, и вы ДОЛЖНЫ убедиться, что это не произвольный код), использовать PDO вместо mysql_connect, который теперь запрещен.

30 голосов
/ 10 мая 2013
$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'") or die(mysql_error());

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

Иногда подавление запроса как @mysql_query(your query);

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