mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows etc... ожидает, что параметр 1 будет ресурсом или результатом
Я пытаюсь выбрать данные из таблицы 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, '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(...);
Ответы
Ответ 1
Запрос может быть неудачным по различным причинам, и в этом случае оба 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 ) {
...
Эти примеры только иллюстрируют, что должно быть сделано (обработка ошибок), а не как это сделать. При выводе HTML код производства не должен использовать or die
, иначе он (по крайней мере) создаст неверный HTML. Кроме того, сообщения об ошибках базы данных не должны отображаться для пользователей, не являющихся администраторами, так как раскрывает слишком много информации.
Ответ 2
Это сообщение об ошибке отображается, если в вашем запросе возникла ошибка, из-за которой он был сбой. Он проявится при использовании:
-
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.
Ответ 3
Ошибка произошла из-за использования одинарных кавычек ('
). Вы можете задать свой запрос следующим образом:
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
будет делать трюк.
Ответ 4
Как объяснил 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.
Ответ 5
Поместите кавычки вокруг $username
. Значения строк, в отличие от числовых значений, должны быть заключены в кавычки.
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '$username'");
Кроме того, нет смысла использовать условие LIKE
, если вы не используете подстановочные знаки: если вам нужно точное совпадение, используйте =
вместо LIKE
.
Ответ 6
Пожалуйста, проверьте, как только выбранная база данных не была вызвана, потому что некоторая база данных не выбрана
Проверьте
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());
Ответ 7
Ваш код должен быть чем-то вроде этого
$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'];
}
После этого вы получите запрос, напечатанный на экране. Попробуйте выполнить этот запрос на своем сервере и посмотрите, дает ли он желаемые результаты. В большинстве случаев ошибка содержится в запросе. Остальная часть кода верна.
Ответ 8
$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 для получения дополнительной информации.
Ответ 9
Этот запрос должен работать:
$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, который теперь лишен.
Ответ 10
$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);
Ответ 11
Если вы все пробовали здесь, и это не сработает, вы можете проверить сортировку базы данных MySQL. Мой был настроен на шведскую сортировку. Затем я изменил его на utf8_general_ci
, и все просто нажало на передачу.
Я надеюсь, что это поможет кому-то.
Ответ 12
Попробуйте это, это должно быть работа, иначе вам нужно распечатать ошибку, чтобы указать вашу проблему.
$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'];
}
Ответ 13
$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. Это намного лучше, чем это для использования запроса.
Я сделал этот запрос и не получаю никаких ошибок, таких как параметр или логический.
Ответ 14
Попробуйте использовать следующий код. Он может работать нормально.
$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName ='$username'");
while($row = mysql_fetch_array($result))
{
echo $row['FirstName'];
}
Ответ 15
Могут быть две причины:
-
Открыли ли вы подключение к базе данных до вызова функции mysql_query? Я не вижу этого в вашем коде. Перед выполнением запроса используйте mysql_connect. См. php.net/manual/en/function.mysql-connect.php
-
Переменная $username используется внутри одной строки кавычек, поэтому ее значение не будет оцениваться внутри запроса. Запрос, безусловно, потерпит неудачу.
В-третьих, структура запроса подвержена SQL-инъекции. Вы можете использовать подготовленные инструкции, чтобы избежать этой угрозы безопасности.
Ответ 16
<?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."'");
Ответ 17
Перейдите к config.php
. У меня такая же проблема. Проверьте имя пользователя и пароль, а также sql select - это то же имя, что и config.
Ответ 18
Включите переменную строки подключения перед запросом MySQL. Например, $connt
в этом коде:
$results = mysql_query($connt, "SELECT * FROM users");
Ответ 19
Не используйте лишенную функцию 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();
?>
Ответ 20
Попробуйте это
$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'];
}
}
Ответ 21
Сначала проверьте соединение с базой данных. Это связано успешно или нет?
Если это так, то после этого я написал этот код, и он работает хорошо:
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;
}
Ответ 22
<?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'];
}
?>
Ответ 23
Каждый раз, когда вы получаете...
"Предупреждение: 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
, решение проблемы тривиально.
Если вы выберете, вы можете включить эту проверку в функцию или класс и расширить ее, обработав ошибки изящно, как упоминалось ранее.
Ответ 24
Убедитесь, что вы не закрываете базу данных. Используя db_close() Before To Выполнение запроса:
Если вы используете несколько запросов в script, даже если вы включаете другие страницы, содержащие запросы или подключение к базе данных, возможно, что в любом месте вы будете использовать db_close(), который закроет соединение с базой данных, убедитесь, что вы не делаете эту ошибку в своих сценариях.
Ответ 25
Сначала проверьте свое соединение.
Затем, если вы хотите получить точное значение из базы данных, тогда вы должны написать:
$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%'");
Ответ 26
Если во время проверки не появляется ошибка MySQL, убедитесь, что вы правильно создали таблицу базы данных. Это случилось со мной. Ищите любые нежелательные запятые или цитаты.
Ответ 27
Вы также можете проверить, что $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'];
}
}
Ответ 28
Вы можете попробовать этот код. Я нашел его раньше, когда у меня возникла проблема, подобная вашей.
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;
}
Ответ 29
Обычно ошибка возникает при сбое подключения к базе данных, поэтому обязательно подключите базу данных или включите файл базы данных.
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
- Рекомендуется выполнить запрос в sqlyog, а затем скопировать его в код своей страницы.
- Всегда сохраняйте ваш запрос в переменной, а затем отображайте ее. Затем перейдите к
mysql_query($query_variable);
,
Ответ 30
Попробуйте этот код, он отлично работает
присвойте переменной 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'];
}
}