Ошибка: mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows и др. ожидают ресурс в качестве параметра 1
Я пытаюсь извлечь данные из таблицы MySQL, но получаю одно из следующих сообщений об ошибке:
mysql_fetch_array() expects parameter 1 to be resource, boolean given
Вот мой код:
$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'];
}
Я не могу понять, в чем проблема. Помогите, пожалуйста!
5 ответ(ов)
Ошибка возникла здесь из-за использования одинарных кавычек ('
). Вы можете переписать ваш запрос следующим образом:
mysql_query("
SELECT * FROM Users
WHERE UserName
LIKE '".mysql_real_escape_string($username)."'
");
Этот код использует mysql_real_escape_string
для предотвращения SQL-инъекций. Однако стоит отметить, что для более современных версий PHP (5.5.0 и выше) рекомендуется использовать расширения MySQLi или PDO_MYSQL, так как они обеспечивают лучшую безопасность и функциональность. Но для старых версий mysql_real_escape_string
будет работать.
Чтобы исправить ваш запрос, необходимо заключить переменную $username
в кавычки. Строковые значения, в отличие от числовых, должны быть заключены в кавычки.
Ваш исправленный код должен выглядеть так:
$result = mysql_query("SELECT * FROM Users WHERE UserName = '$username'");
Кроме того, нет смысла использовать условие LIKE
, если вы не применяете подстановочные знаки. Если вам нужно точное совпадение, лучше использовать оператор =
вместо LIKE
.
Пожалуйста, убедитесь, что база данных выбрана, так как иногда она может не быть активной.
Перед выполнением запроса к MySQL добавьте следующую проверку:
mysql_select_db('имя_базы_данных') or die('База данных недоступна!');
После этого можете переходить к следующему шагу:
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '$username'");
if ($result === FALSE) {
die(mysql_error());
}
Обратите внимание, что в вашем коде есть небольшая ошибка в конструкции LIKE
. Не забудьте обернуть переменную $username
в кавычки для корректного выполнения SQL-запроса.
Также имейте в виду, что функции mysql_*
устарели. Рекомендуется использовать расширение mysqli
или PDO для работы с базой данных.
Ваш код должен выглядеть примерно так:
$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("Сообщение об ошибке для пользователя"));
}
while($row = mysql_fetch_array($result))
{
echo $row['FirstName'];
}
После выполнения этого кода, у вас будет напечатан SQL-запрос на экране. Попробуйте выполнить этот запрос на вашем сервере и посмотрите, дает ли он ожидаемые результаты. Чаще всего ошибка кроется в самом запросе. Остальная часть кода правильная.
Ваш запрос содержит ошибку, связанную с использованием одинарных кавычек для определения строки. В PHP строки, заключенные в одинарные кавычки, не поддерживают интерполяцию переменных. Чтобы правильно использовать переменную $username
в вашем SQL-запросе, вам необходимо либо использовать двойные кавычки, либо конкатенацию строк. Например, вот так:
$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '$username'");
Обратите внимание на то, что мы добавили одинарные кавычки вокруг переменной $username
, чтобы её значение корректно интерполировалось в строку SQL.
Кроме того, стоит проверить, действительно ли функция mysql_query
вернула корректный ресурс результата. Если вы не проверите это, функции получения данных, такие как mysql_fetch_array
, mysql_num_rows
и т.д., не смогут работать, так как результат будет невалидным. Вот пример с проверкой:
$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '$username'");
if ($result === FALSE) {
trigger_error('Запрос не удался, ошибка: ' . mysql_error(), E_USER_ERROR);
} else {
while ($row = mysql_fetch_array($result)) {
echo $row['username'];
}
}
Для получения дополнительной информации вы можете обратиться к документации PHP.
Почему не стоит использовать функции mysql_* в PHP?
Как предотвратить SQL-инъекции в PHP?
UTF-8 на всех уровнях!
Функции startsWith() и endsWith() в PHP
Как получить расширение файла в PHP?