На этой строке:
$sql= 'SELECT url_imgsrch FROM p_url_imgsrch where 'word_id'='[$wid]' ORDER BY RAND() LIMIT 5';
Обратите особое внимание на то, как механизм подсветки синтаксиса Stack Overflow относится к нему, особенно в отношении термина word_id
. То, что вы делаете с этими одинарными кавычками, это завершение строки PHP, а затем добавление неизвестного термина word_id
. PHP не знает, что с этим делать, поэтому выдает ошибку, которую вы видите.
Есть ли причина, по которой вы используете одинарные кавычки вокруг термина word_id
? Должна ли это быть строка в операторе SQL? Я предполагаю, что это не должно Вы должны иметь возможность просто ссылаться на столбец в таблице непосредственно в запросе. Примерно так:
$sql= 'SELECT url_imgsrch FROM p_url_imgsrch where word_id='[$wid]' ORDER BY RAND() LIMIT 5';
Обратите внимание, что синтаксический анализ PHP полностью отделен от синтаксического анализа SQL. Все, что вы делаете в этом коде, это строит строку для отправки в базу данных. После этого база данных будет анализировать эту строку как код SQL. Поэтому смешивание PHP и SQL должно выполняться с осторожностью, чтобы не создавать неправильный SQL, иначе вы получите больше ошибок, даже если ваш PHP-код в порядке. (Вы также должны, как отмечено в комментарии к вопросу и в других ответах, изучить такие вещи, как атаки с использованием SQL-инъекций и узнать, как обеспечить дополнительную защиту вашего кода. Код может работать, но в то же время он может представлять собой явные дыры в безопасности . См. Остальную часть этого ответа и другие ответы для получения более подробной информации. Это важно . )
Быстрый вопрос, и, возможно, это просто синтаксис, с которым я не сразу знаком ... почему в этом выражении есть квадратные скобки вокруг переменной $wid
? Я больше знаком с MSSQL, чем с MySQL, и в первых квадратных скобках обозначают объект базы данных (а не переменную, такую как строка для сопоставления с объектом базы данных), которая, кажется, не является тем, что вам нужно. Скорее всего, вы на самом деле имеете в виду это:
$sql= "SELECT url_imgsrch FROM p_url_imgsrch where word_id='$wid' ORDER BY RAND() LIMIT 5";
Обратите внимание на два различия:
- Избавился от квадратных скобок.
- Изменены первые и последние кавычки строки с одинарных к двойным. И одинарные кавычки, и двойные кавычки могут использоваться для обозначения строк в PHP. В этом конкретном случае двойные кавычки полезны, потому что они позволяют вам включать одинарные кавычки в самой строке (без экранирования, что затруднит чтение).
Наконец, как уже отмечали другие, этот код нуждается в для защиты от атак SQL-инъекций. Самый непосредственный и очевидный способ сделать это с помощью mysql_real_escape_string()
, больше информации здесь . По сути, эта функция конвертирует строку в более безопасную для SQL строку, экранируя управляющие символы и тому подобное. Вы должны обернуть все входные строки этим, прежде чем добавлять их в строку SQL:
$wid = mysql_real_escape_string($wid);
$sql= "SELECT url_imgsrch FROM p_url_imgsrch where word_id='$wid' ORDER BY RAND() LIMIT 5";
Вы также можете подумать о том, чтобы предпринять дальнейшие шаги, чтобы уменьшить ваши уязвимости SQL, а также потенциально привести к более чистому коду. Попробуйте рассмотреть PHP Data Objects , чтобы представить взаимодействие с вашей базой данных, а не просто строить строки SQL непосредственно в коде.