Avatar ·

Ошибка "expects parameter 1 to be resource" при работе с mysql_fetch_array() в PHP

Всем привет! Я новичок в PHP и MySQL, и у меня возникла проблема, которую я никак не могу решить. Пишу простой скрипт для вывода данных из таблицы users. Вот мой код: ```php $connection = mysql_connect('localhost', 'root', ''); mysql_select_db('test', $connection); $query = "SELECT * FROM users"; $result = mysql_query($query); while ($row = mysql_fetch_array($result)) { echo $row['name'] . '
'; } ``` Но вместо ожидаемого списка имен я получаю ошибку: "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().