Я пытаюсь выбрать данные из таблицы MySQL, но я получаю одно из следующих сообщений об ошибке:
mysql_fetch_array () ожидает, что параметр 1 будет ресурсом, boolean
или
mysqli_fetch_array () ожидает, что параметр 1 будет mysqli_result, boolean given
или
Вызов функции-члена 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, 'SLECT ...'); // mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given while( $row=mysqli_fetch_array($result) ) { ...
а также
$result = $mysqli->query($mysqli, 'SELCT ...'); // Call to a member function fetch_assoc() on a non-object while( $row=$result->fetch_assoc($result) ) { ...
а также
$result = $pdo->query('SLECT ...', PDO::FETCH_ASSOC); // Invalid argument supplied for foreach() foreach( $result as $row ) { ...
а также
$stmt = $mysqli->prepare('SLECT ...'); // Call to a member function bind_param() on a non-object $stmt->bind_param(...)
а также
$stmt = $pdo->prepare('SLECT ...'); // Call to a member function bindParam() on a non-object $stmt->bindParam(...)
Запрос может быть неудачным по различным причинам, и в этом случае оба mysql_ * и расширение mysqli вернут false
из своих соответствующих функций / методов запроса. Вам необходимо проверить это условие ошибки и обработать его соответствующим образом.
mysql_ * расширение :
ПРИМЕЧАНИЕ. Функции mysql_ устарели и были удалены в версии 7 php.
Проверьте $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 ) { ...
оо-стиль :
$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. Кроме того, сообщения об ошибках базы данных не должны отображаться для пользователей, не являющихся администраторами, поскольку они раскрывают слишком много информации .
Это сообщение об ошибке отображается при возникновении ошибки в запросе, которая привела к сбою. Он проявится при использовании:
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 .
Ошибка произошла здесь из-за использования одинарных кавычек ( '
). Вы можете задать свой запрос следующим образом:
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
сделает трюк.
Как объяснил 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.
Поместите кавычки вокруг $username
. Строковые значения, в отличие от числовых значений, должны быть заключены в кавычки.
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '$username'");
Кроме того, нет смысла использовать условие LIKE
если вы не используете подстановочные знаки: если вам нужно точное совпадение use =
вместо LIKE
.
Пожалуйста, проверьте, как только база данных выбрана не потому, что некоторая база данных не выбрана
Проверьте
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());
Ваш код должен быть чем-то вроде этого
$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']; }
После этого вы получите запрос, напечатанный на экране. Попробуйте выполнить этот запрос на своем сервере и посмотрите, дает ли он желаемые результаты. В большинстве случаев ошибка содержится в запросе. Остальная часть кода верна.
$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 для получения дополнительной информации.
Этот запрос должен работать:
$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 который теперь лишен.
$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);
Если вы попробовали все здесь, и это не сработает, вы можете проверить свою сортировку базы данных MySQL. Мой был настроен на шведскую сортировку. Затем я сменил его на utf8_general_ci
и все просто utf8_general_ci
на передачу.
Я надеюсь, что это помогает кому-то.
$query = "SELECT Name,Mobile,Website,Rating FROM grand_table order by 4"; while( $data = mysql_fetch_array($query)) { echo("<tr><td>$data[0]</td><td>$data[1]</td><td>$data[2]</td><td>$data[3]</td></tr>"); }
Вместо использования запроса WHERE вы можете использовать этот запрос ORDER BY. Это намного лучше, чем использование запроса.
Я сделал этот запрос и не получаю никаких ошибок, таких как параметр или логический.
Попробуйте это, это должна быть работа, иначе вам нужно распечатать ошибку, чтобы указать вашу проблему
$username = $_POST['username']; $password = $_POST['password']; $sql = "SELECT * from Users WHERE UserName LIKE '$username'"; $result = mysql_query($sql,$con); while($row = mysql_fetch_array($result)) { echo $row['FirstName']; }
Попробуйте следующий код. Он может работать нормально.
$username = $_POST['username']; $password = $_POST['password']; $result = mysql_query("SELECT * FROM Users WHERE UserName ='$username'"); while($row = mysql_fetch_array($result)) { echo $row['FirstName']; }
Могут быть две причины:
Открыли ли вы подключение к базе данных до вызова функции mysql_query? Я не вижу этого в вашем коде. Перед выполнением запроса используйте mysql_connect. См. php.net/manual/en/function.mysql-connect.php
Переменная $ username используется внутри одной строки кавычек, поэтому ее значение не будет оцениваться внутри запроса. Запрос, безусловно, потерпит неудачу.
В-третьих, структура запроса подвержена SQL-инъекции . Вы можете использовать подготовленные инструкции, чтобы избежать этой угрозы безопасности.
<?php $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_query("SELECT * FROM Users WHERE UserName ='".$username."'");
Перейдите в свой config.php
. У меня такая же проблема. Проверьте имя пользователя и пароль, а также sql select – то же имя, что и config.
Включите переменную строки подключения перед запросом MySQL. Например, $connt
в этом коде:
$results = mysql_query($connt, "SELECT * FROM users");
Не используйте лишенную функцию mysql_ * (лишенная php 5.5 будет удалена в php 7). и вы можете сделать это с помощью mysqli или pdo
вот полный запрос выбора
<?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDB"; // Create connection $conn = new mysqli($servername, $username, $password, $dbname); // Check connection if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $sql = "SELECT id, firstname, lastname FROM MyGuests"; $result = $conn->query($sql); if ($result->num_rows > 0) { // output data of each row while($row = $result->fetch_assoc()) { // code here } } else { echo "0 results"; } $conn->close(); ?>
Попробуй это
$username = $_POST['username']; $password = $_POST['password']; $result = mysqli_query('SELECT * FROM Users WHERE UserName LIKE $username'); if($result){ while($row = mysqli_fetch_array($result)) { echo $row['FirstName']; } }
Сначала проверьте подключение к базе данных. Это связано успешно или нет?
Если это сделано, то после этого я написал этот код, и он работает хорошо:
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; }
<?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']; } ?>
в<?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']; } ?>
Убедитесь, что вы не закрываете базу данных. Используя db_close () перед запуском вашего запроса:
Если вы используете несколько запросов в скрипте, даже если вы включаете другие страницы, содержащие запросы или подключение к базе данных, возможно, что в любом месте вы используете db_close (), который закроет соединение с базой данных, поэтому убедитесь, что вы не делая эту ошибку в ваших сценариях.
Каждый раз, когда вы получаете …
"Предупреждение: mysqli_fetch_object () ожидает, что параметр 1 будет mysqli_result, boolean задан"
… вероятно, потому что есть проблема с вашим запросом. Команда 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
, решение проблемы тривиально.
Если вы выберете, вы можете включить эту проверку в функцию или класс и расширить ее, обработав ошибки изящно, как упоминалось ранее.
Сначала проверьте свое соединение.
Затем, если вы хотите получить точное значение из базы данных, тогда вы должны написать:
$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%'");
Если во время проверки не появляется ошибка MySQL, убедитесь, что вы правильно создали таблицу базы данных. Это случилось со мной. Ищите любые нежелательные запятые или цитаты.
Вы также можете проверить, что $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']; } }
Обычно возникает ошибка, связанная с конденсированием базы данных, поэтому не забудьте подключить свою базу данных или включить файл базы данных.
include_once(db_connetc.php');
ИЛИ
// 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
mysql_query($query_variable);
, Попробуйте этот код, он отлично работает
присвойте переменной 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']; } }
Вы можете попробовать этот код. Я нашел его раньше, когда у меня возникла проблема, похожая на вашу.
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; }