Но на сервере всего 4Гб памяти.
Откуда берётся ошибкаИсточник
Эта ошибка возникает, если запрос не может быть выполнен. Функции, которые могут к ней привести:
mysql_fetch_array/mysqli_fetch_array()
mysql_fetch_assoc()/mysqli_fetch_assoc()
mysql_num_rows()/mysqli_num_rows()
Если с запросом всё в порядке, и просто результат его выполнения пустой, то ошибка не возникает. К ошибке приводит только неверный синтаксис SQL.
Как найти источник ошибки
Убедитесь, что на сервере, на котором вы ведёте разработку, включено отображение всех ошибок. Вы можете включить его из PHP, выполнив error_reporting(-1); (можно разместить этот код в конфигурационном файле вашего сайта, например). Если при попытке выполнения запроса будут обнаружены ошибки в синтаксисе, то они будут отображены.
Используйте mysql_error(). Эта функция вернёт строку с текстом ошибки, если таковая возникла при выполнении последнего запроса.
Например:
mysql_connect($host, $username, $password) or die("Ошибка подключения");
mysql_select_db($db_name) or die("Ошибка выбора БД");
$sql = "SELECT * FROM table_name";
$result = mysql_query($sql);
if ($result === false) {
echo mysql_error();
}
Выполните ваш запрос в командной строке MySQL или из инструмента вроде phpMyAdmin. Если в запросе есть синтаксическая ошибка, то она будет отображена.
Убедитесь, что в запросе верно расставлены кавычки. Это частая причина синтаксических ошибок.
Убедитесь, что вы экранируете ваши значения. Если в строке присутствует кавычка, это может привести к ошибке (а также сделать ваш код уязвимым к SQL-инъекциям). Используйте для этого mysql_real_escape_string().
Убедитесь, что вы не используете одновременно функции mysqli_* и mysql_*. Их использование нельзя смешивать. (Если вы не знаете, что выбрать, отдайте предпочтение mysqli_*.)
Советы
Не используйте функции mysql_* в новом коде. Разработчики PHP больше не поддерживают и не развивают их, они отмечены как устаревшие, и в будущих версиях будут удалены. Ознакомьтесь с понятием prepared statement и переходите на использование PDO (PHP Data Objects) или MySQLi (MySQL improved). Это избавит вас от проблем с экранированием значений и убережёт от SQL-инъекций.
И MySQLi, и PDO поддерживают режим, в котором при ошибках выбрасываются исключения. В новом коде следует использовать этот подход, потому что он помогает обрабатывать ошибки в одном месте, а не размазывать проверки по всему коду, и позволяет обработке ошибок не зависеть от внешних условий (от конфигурации).
Если вкратце, то PDO — это общий слой над базами данных, который позволяет относительно легко переключать СУБД; а MySQLi даёт доступ к некоторым дополнительным возможностям СУБД MySQL..