mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows etc... expects parameter 1 to be resource or result
Я пытаюсь выбрать данные из таблицы 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(...);
31 ответ
Запрос может завершиться ошибкой по разным причинам, и в этом случае и mysql_*, и расширение mysqli вернутся false
из их соответствующих функций / методов запроса. Вы должны проверить это условие ошибки и обработать его соответствующим образом.
ПРИМЕЧАНИЕ. Функции 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'];
}
расширение MySQL
процедурный стиль:
$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
условие, если вы не используете подстановочные знаки: если вам нужно точное совпадение, используйте =
вместо 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
и все просто включилось.
Я надеюсь, что это помогает кому-то.
$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."'");
Не используйте устаревшую функцию mysql_* (удаленная в php 5.5 будет удалена в php 7). и вы можете сделать это с MySQL или 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();
?>
Перейти к вашей config.php
, У меня такая же проблема. Проверьте имя пользователя и пароль, а также выберите sql select с тем же именем, что и в конфигурации.
Включите переменную строки соединения перед запросом MySQL. Например, $connt
в этом коде:
$results = mysql_query($connt, "SELECT * FROM users");
В любое время вы получите...
"Предупреждение: 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
Столбец в таблице, решение задачи тривиально.
При желании вы можете включить эту проверку в функцию или класс и расширить ее, корректно обработав ошибки, как упоминалось ранее.
Попробуй это
$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'];
}
}
<?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'];
}
?>
Сначала проверьте ваше соединение с базой данных. Это связано успешно или нет?
Если это сделано, то после этого я написал этот код, и он работает хорошо:
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;
}
Убедитесь, что вы не закрываете базу данных, используя db_close(), прежде чем запускать свой запрос:
Если вы используете несколько запросов в сценарии, даже если вы включаете другие страницы, которые содержат запросы или соединение с базой данных, возможно, что в любом месте вы используете db_close(), которая закрывает соединение с вашей базой данных, поэтому убедитесь, что вы не делать эту ошибку в ваших сценариях.
Сначала проверьте ваше соединение.
Затем, если вы хотите получить точное значение из базы данных, вы должны написать:
$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'];
}
}
Вы можете попробовать этот код. Я обнаружил это раньше, когда столкнулся с проблемой, похожей на вашу.
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;
}
Обычно ошибка возникает при сбое подключения к базе данных, поэтому обязательно подключите базу данных или включите файл базы данных.
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);
,
Попробуйте этот код, он работает нормально
присвойте переменную 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'];
}
}