Я пытаюсь выбрать данные из таблицы MySQL, но получаю одно из следующих сообщений об ошибке:
mysql_fetch_array () ожидает, что параметр 1 будет ресурсом, учитывая логическое значение
Это мой код:
$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_real_escape_string
. Никогда не доверяйте пользовательским данным.mysql_real_escape_string
это не является основной защитой SQL-инъекций; это все еще уязвимо для многих нападений. (Нет, вы никогда не говорили, что это идеально, но вы подразумевали, что это единственное необходимое решение) Насколько мне известно, сейчас наилучшим решением является PDO.Ответы:
Запрос может завершиться ошибкой по разным причинам, и в этом случае mysql_ * и расширение mysqli будут возвращаться
false
из своих соответствующих функций / методов запроса. Вы должны проверить это условие ошибки и обработать его соответствующим образом.mysql_ * расширение :
Проверьте
$result
перед передачейmysql_fetch_array
. Вы обнаружите, что этоfalse
потому, что запрос не удался. См.mysql_query
Документацию для возможных возвращаемых значений и предложений о том, как обращаться с ними.mysqli расширение
процедурного стиля :
оо-стиль :
используя подготовленное утверждение:
Эти примеры только иллюстрируют, что должно быть сделано (обработка ошибок), а не как это сделать. Рабочий код не должен использоваться
or die
при выводе HTML, иначе он будет (по крайней мере) генерировать недопустимый HTML. Кроме того, сообщения об ошибках базы данных не должны отображаться для пользователей, не являющихся администраторами, так как они раскрывают слишком много информации .источник
if($result === FALSE)
тебя можно использоватьif(! $result)
. Поправь меня если я не правЭто сообщение об ошибке отображается, когда в вашем запросе есть ошибка, которая вызвала его сбой. Это проявится при использовании:
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 или из такого инструмента, как phpMyAdmin . Если в вашем запросе есть синтаксическая ошибка, это скажет вам, что это такое.
Убедитесь, что ваши цитаты верны. Отсутствие кавычки вокруг запроса или значения может привести к сбою запроса.
Убедитесь, что вы избегаете своих ценностей. Кавычки в вашем запросе могут привести к сбою запроса (а также оставить вас открытыми для SQL-инъекций). Используйте,
mysql_real_escape_string()
чтобы избежать вашего ввода.Убедитесь , что вы не смешиваясь
mysqli_*
иmysql_*
функции. Они не одно и то же и не могут использоваться вместе. (Если вы собираетесь выбрать ту или иную палкуmysqli_*
. См. Ниже, почему.)Другие советы
mysql_*
функции не должны использоваться для нового кода. Они больше не поддерживаются, и сообщество начало процесс амортизации . Вместо этого вы должны узнать о подготовленных утверждениях и использовать либо PDO, либо MySQLi . Если вы не можете решить, эта статья поможет выбрать. Если вы хотите учиться, вот хороший учебник PDO .источник
mysql_query()
/mysqli_query($connection)
и т. Д.» ; мысли? Поскольку ни один другой ответ в этом Q & A не упоминает об этом.Ошибка произошла здесь из-за использования одинарных кавычек (
'
). Вы можете поставить свой запрос так:Используется
mysql_real_escape_string
для предотвращения внедрения SQL. Хотя мы должны использовать расширение MySQLi или PDO_MYSQL для обновленной версии PHP (PHP 5.5.0 и более поздних версий), но для более старых версий всеmysql_real_escape_string
получится.источник
Как объяснил scompt.com , запрос может завершиться ошибкой. Используйте этот код, чтобы получить ошибку запроса или правильный результат:
См. Документацию для
mysql_query()
получения дополнительной информации.Фактическая ошибка заключалась в одинарных кавычках, поэтому переменная
$username
не была проанализирована. Но вы должны действительно использовать,mysql_real_escape_string($username)
чтобы избежать SQL-инъекций.источник
Положите цитаты вокруг
$username
. Строковые значения, в отличие от числовых значений, должны быть заключены в кавычки.Кроме того, нет смысла использовать
LIKE
условие, если вы не используете подстановочные знаки: если вам нужно использовать точное совпадение=
вместоLIKE
.источник
Пожалуйста, проверьте, если база данных не выбрана, потому что иногда база данных не выбрана.
Проверьте
перед запросом MySQL, а затем перейти к следующему шагу
источник
Ваш код должен быть примерно таким
Сделав это, вы напечатаете запрос на экране. Попробуйте этот запрос на вашем сервере и посмотрите, даст ли он желаемые результаты. В большинстве случаев ошибка в запросе. Остальная часть кода верна.
источник
Вы определяете строку, используя одинарные кавычки, а PHP не анализирует строки, разделенные одинарными кавычками. Чтобы получить переменную интерполяцию, вам нужно использовать двойные кавычки ИЛИ конкатенацию строк (или их комбинацию). Смотрите http://php.net/manual/en/language.types.string.php для получения дополнительной информации.
Также вы должны убедиться, что mysql_query вернул допустимый ресурс результата, иначе fetch_ *, num_rows и т. Д. Не будут работать с результатом, поскольку это не результат! IE:
http://us.php.net/manual/en/function.mysql-query.php для получения дополнительной информации.
источник
Этот запрос должен работать:
Проблема заключается в одинарных кавычках, поэтому ваш запрос не выполняется и возвращает FALSE, а ваш цикл WHILE не может быть выполнен. Использование% позволяет сопоставить любые результаты, содержащие вашу строку (например, SomeText- $ username-SomeText).
Это просто ответ на ваш вопрос, вы должны реализовать материал, упомянутый в других постах: обработку ошибок, использование escape-строк (пользователи могут вводить в поле все что угодно, и вы ДОЛЖНЫ убедиться, что это не произвольный код), использовать PDO вместо mysql_connect который сейчас ограничен.
источник
Иногда подавление запроса как
@mysql_query(your query);
источник
Если вы попробовали все здесь, и это не работает, вы можете проверить сопоставление базы данных MySQL. Мой был установлен на шведскую сортировку. Затем я изменил его на
utf8_general_ci
и все просто включилось.источник
Вместо использования запроса WHERE вы можете использовать этот запрос ORDER BY. Это гораздо лучше, чем это для использования запроса.
Я сделал этот запрос и не получаю ошибок, таких как параметр или логическое значение.
источник
htmlspecialchars()
при использовании произвольных данных в контексте HTML. В противном случае вы рискуете создать действительный HTML, когда в данных используются зарезервированные символы.Попробуйте, это должно работать, в противном случае вам нужно распечатать ошибку, чтобы указать вашу проблему
источник
LIKE
выражении).Там может быть две причины:
Открыли ли вы соединение с базой данных до вызова функции mysql_query? Я не вижу этого в вашем коде. Используйте mysql_connect перед выполнением запроса. Видеть
php.net/manual/en/function.mysql-connect.php
Переменная $ username используется внутри одной строки кавычек, поэтому ее значение не будет оцениваться внутри запроса. Запрос определенно потерпит неудачу.
В-третьих, структура запроса подвержена внедрению SQL . Вы можете использовать подготовленные заявления, чтобы избежать этой угрозы безопасности.
источник
Попробуйте следующий код. Это может работать нормально.
источник
Иди к своему
config.php
. У меня такая же проблема. Проверьте имя пользователя и пароль, а также выберите sql select с тем же именем, что и в конфигурации.источник
Не используйте ограниченную функцию mysql_ * (исключено в php 5.5 будет удалено в php 7). и вы можете сделать это с MySQL или PDO
вот полный запрос выбора
источник
И если есть пользователь с уникальным именем пользователя, вы можете использовать «=» для этого. Там нет необходимости любить.
Ваш запрос будет:
источник
username
и он будет выполнен.Включите переменную строки соединения перед запросом MySQL. Например,
$connt
в этом коде:источник
Каждый раз, когда вы получаете ...
... вероятно, потому что есть проблема с вашим запросом.
prepare()
Илиquery()
может вернутьсяFALSE
(булево), но это общее сообщение об ошибке не оставит вас много на пути разгадки. Как вы узнаете, что не так с вашим запросом? Вы спрашиваете !Прежде всего, убедитесь, что отчеты об ошибках включены и видимы: добавьте эти две строки вверху ваших файлов сразу после открывающего
<?php
тега:Если ваше сообщение об ошибке установлено в php.ini, вам не придется беспокоиться об этом. Просто убедитесь, что вы корректно обрабатываете ошибки и никогда не раскрываете истинную причину каких-либо проблем для ваших пользователей. Раскрытие истинной причины для общественности может быть приглашением с золотой гравировкой для тех, кто хочет навредить вашим сайтам и серверам. Если вы не хотите отправлять ошибки в браузер, вы всегда можете отслеживать журналы ошибок вашего веб-сервера. Расположение журналов зависит от сервера, например, в Ubuntu журнал ошибок обычно находится по адресу
/var/log/apache2/error.log
. Если вы просматриваете журналы ошибок в среде Linux, вы можете использовать ихtail -f /path/to/log
в окне консоли, чтобы увидеть ошибки, возникающие в режиме реального времени .... или по мере их возникновения.Как только вы возьметесь за стандартную отчетность об ошибках, добавив проверку ошибок в вашем соединении с базой данных и запросах, вы получите гораздо более подробную информацию о возникающих проблемах. Посмотрите на этот пример, где имя столбца неверно. Во-первых, код, который возвращает общее фатальное сообщение об ошибке:
Ошибка носит общий характер и не очень помогает вам решить, что происходит.
С помощью пары строк кода вы можете получить очень подробную информацию, которую можно использовать для немедленного решения проблемы . Проверьте
prepare()
утверждение на правдивость, и если оно хорошее, вы можете перейти к обязательному исполнению и исполнению.Если что-то не так, вы можете выложить сообщение об ошибке, которое приведет вас непосредственно к проблеме. В этом случае
foo
столбца в таблице нет, решение задачи тривиально.При желании вы можете включить эту проверку в функцию или класс и расширить ее, корректно обработав ошибки, как упоминалось ранее.
источник
echo $error;
в одном посте?источник
Попробуй это
источник
Сначала проверьте ваше соединение с базой данных. Это связано успешно или нет?
Если это сделано, то после этого я написал этот код, и он работает хорошо:
источник
Если вы используете несколько запросов в сценарии, даже если вы включаете другие страницы, которые содержат запросы или соединение с базой данных, возможно, что в любом месте вы используете db_close (), которая закроет ваше соединение с базой данных, поэтому убедитесь, что вы не делать эту ошибку в ваших сценариях.
источник
Если у вас не возникает ошибка MySQL при проверке, убедитесь, что вы правильно создали таблицу базы данных. Это случилось со мной. Ищите любые нежелательные запятые или цитаты.
источник
Сначала проверьте ваше соединение.
Затем, если вы хотите получить точное значение из базы данных, вы должны написать:
Или вы хотите получить
LIKE
тип значения, тогда вы должны написать:источник
Вы также можете проверить, как
$result
происходит сбой, перед тем как выполнить массив извлеченияисточник
Обычно ошибка возникает при сбое подключения к базе данных, поэтому обязательно подключите базу данных или включите файл базы данных.
ИЛИ
mysql_query($query_variable);
.источник
Традиционно PHP был терпим к плохой практике и ошибкам в коде, что делает отладку довольно сложной. Проблема в этом конкретном случае заключается в том, что mysqli и PDO по умолчанию не сообщают вам, когда запрос не выполнен, и просто возвращаются
FALSE
. (Я не буду говорить об ограниченном расширении mysql . Поддержка подготовленных операторов является достаточной причиной для переключения либо на PDO, либо на mysqli .) Но вы можете изменить поведение PHP по умолчанию, чтобы всегда выдавать исключения при сбое запроса.Для PDO : используйте
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Это покажет вам следующее:
Как видите, он точно говорит вам, что не так с запросом, и где это исправить в вашем коде.
Без
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
тебя получишьДля MySQL : используйте
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
Ты получишь
Без
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
вас только получитьКонечно, вы можете вручную проверить ошибки MySQL. Но я бы сошел с ума, если бы мне приходилось делать это каждый раз, когда я делал опечатку - или хуже - каждый раз, когда я хотел бы запросить базу данных.
источник
Попробуйте этот код, он работает нормально
присвойте переменную post переменной
источник