Ошибка "expects parameter 1 to be resource" при работе с mysql_fetch_array() в PHP
'; } ``` Но вместо ожидаемого списка имен я получаю ошибку: "Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in ..." Я проверил соединение с БД — оно вроде работает. Подскажите, что я делаю не так? Почему $result не является ресурсом? Я перепробовал разные варианты: mysql_fetch_assoc(), mysql_fetch_row() — везде та же ошибка. Возможно, проблема в самом запросе? Но я проверял его в phpMyAdmin — он работает и возвращает данные. Помогите разобраться, пожалуйста! <<
Причина ошибки и её решение
Ваша проблема — классическая ошибка начинающих PHP-разработчиков. Функция mysql_query() возвращает false (логическое значение) вместо ресурса, когда запрос к базе данных завершается ошибкой. Вы пытаетесь передать false в mysql_fetch_array(), которая ожидает ресурс — отсюда и предупреждение.
Почему запрос не выполняется?
Основные причины:
- Ошибка в SQL-запросе (синтаксическая или логическая)
- Таблица или база данных не существует
- Недостаточно прав для выполнения запроса
- Проблемы с соединением (хотя вы его проверили)
Как исправить?
Добавьте проверку результата выполнения запроса и вывод ошибки MySQL:
// Устанавливаем соединение
$connection = mysql_connect('localhost', 'root', '');
if (!$connection) {
die('Ошибка соединения: ' . mysql_error());
}
// Выбираем базу данных
$db_selected = mysql_select_db('test', $connection);
if (!$db_selected) {
die('Ошибка выбора БД: ' . mysql_error());
}
// Выполняем запрос с проверкой
$query = "SELECT * FROM users";
$result = mysql_query($query, $connection);
if (!$result) {
die('Ошибка запроса: ' . mysql_error() . ' (Запрос: ' . $query . ')');
}
// Теперь безопасно обрабатываем результат
while ($row = mysql_fetch_array($result)) {
echo htmlspecialchars($row['name']) . '<br>';
}
// Закрываем соединение
mysql_close($connection);
Что делать, если ошибка осталась?
Запустите скрипт с выводом ошибки MySQL. Скорее всего, вы увидите что-то вроде:
- "Table 'test.users' doesn't exist" — проверьте имя таблицы
- "Unknown database 'test'" — проверьте имя базы данных
- Синтаксическая ошибка в SQL — например, лишняя запятая
Важное замечание (для будущих проектов)
Расширение mysql_* устарело с PHP 5.5.0 и удалено в PHP 7.0.0. Настоятельно рекомендую перейти на PDO или MySQLi. Вот пример с PDO:
try {
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->query('SELECT * FROM users');
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo htmlspecialchars($row['name']) . '<br>';
}
} catch (PDOException $e) {
echo 'Ошибка: ' . $e->getMessage();
}
PDO автоматически выбрасывает исключения при ошибках, что упрощает отладку и делает код безопаснее.
<<Альтернативный подход: проверка через var_dump()
Иногда самый быстрый способ найти проблему — посмотреть, что именно возвращает mysql_query(). Добавьте перед циклом:
$result = mysql_query($query);
var_dump($result); // Выведет bool(false) при ошибке или resource(...) при успехе
if ($result) {
while ($row = mysql_fetch_array($result)) {
echo $row['name'] . '<br>';
}
} else {
echo 'Ошибка: ' . mysql_error();
}
Также проверьте, не забыли ли вы передать параметр соединения в mysql_query():
$result = mysql_query($query, $connection); // Явно указываем соединение
Если у вас несколько соединений, это критично. И ещё один совет: всегда экранируйте вывод данных с помощью htmlspecialchars(), особенно если данные приходят от пользователей — это защитит от XSS-атак.
И помните: если вы используете PHP 7+, расширение mysql_* уже не работает. Вам придётся переписать код на MySQLi или PDO. Для быстрого перехода используйте MySQLi:
$conn = mysqli_connect('localhost', 'root', '', 'test');
$result = mysqli_query($conn, "SELECT * FROM users");
while ($row = mysqli_fetch_assoc($result)) {
echo $row['name'] . '<br>';
}
Этот код совместим с PHP 7 и 8, и даёт понятные сообщения об ошибках через mysqli_error().