Получить данные из MySQL, используя переменную - PullRequest
1 голос
/ 18 января 2012

Я использую этот код

<?php
  $word = $_POST['word'];
  $wid= $_POST['id'];
  print "<table>";
  print "<tr>";
  $sql= 'SELECT url_imgsrch FROM p_url_imgsrch where 'word_id'='[$wid]' ORDER BY RAND() LIMIT 5';
  $result   =   mysql_query($sql);
  while($row = mysql_fetch_array($result)){

           print ' <td>
               <img name="myimage" src="'.$row[0].'" width="100" height="100" alt="word" border="1"/>
            </td>';
  }
  print "</tr>";
  print "</table>";
  ?>

Что я делаю, чтобы получить одно поле из mysql, используя предложение where, но оно показывает ошибку

Ошибка разбора: синтаксисошибка, неожиданный T_STRING в D: \ wamp \ www \ demo \ login \ card.php в строке 21

и в строке 21 содержится

$sql= 'SELECT url_imgsrch FROM p_url_imgsrch where 'word_id'='[$wid]' ORDER BY RAND() LIMIT 5';

Пожалуйста, укажите мне, что этопромах я делаю?Указания, пожалуйста.

Я думаю, мне следует пояснить одну вещь: «поле ord_id» - это Numeric (int)

Ответы [ 4 ]

5 голосов
/ 18 января 2012

На этой строке:

$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";

Обратите внимание на два различия:

  1. Избавился от квадратных скобок.
  2. Изменены первые и последние кавычки строки с одинарных к двойным. И одинарные кавычки, и двойные кавычки могут использоваться для обозначения строк в 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 непосредственно в коде.

2 голосов
/ 18 января 2012

Это должно работать нормально при использовании двойных кавычек для вашего оператора sql $sql= "SELECT ..."

WHERE word_id='$wid'

Также добавьте mysql_real_escape_string () во входные переменные пользователя, чтобы избежать SQL-инъекций :

$wid = mysql_real_escape_string($_POST['id']);
1 голос
/ 18 января 2012

попробуйте это:

$wid = mysql_real_escape_string($wid);
$sql = "SELECT url_imgsrch FROM p_url_imgsrch where word_id = '$wid' ORDER BY RAND() LIMIT 5";

Вы неправильно использовали кавычки. Если вы собираетесь использовать кавычки в именах столбцов, используйте обратную кавычку, а не одиночную кавычку.

0 голосов
/ 18 января 2012

Как уже упоминали другие, вы не используете кавычки правильно, если вы используете 'одинарные кавычки', вам придется объединить строки следующим образом:

'string ' . $var

одинарные кавычки означают, что все внутри рассматривается как буквальная строка, где почти ничего не должно быть экранировано (кроме, конечно, одинарных кавычек) Внутри «двойных кавычек» вы должны экранировать специальные символы, также вы можете использовать имена переменных без необходимости добавлять переменную в строку самостоятельно:

"string $var" 

например будет нормально работать ... См. Документацию PHP для получения дополнительной информации

Ваш код подвержен SQL-инъекциям. Вы можете увидеть некоторые ответы о том, как это исправить здесь . Вы можете использовать mysql_real_escape_string (), чтобы экранировать определенные управляющие символы, как упомянуто, но это не безопасно. Пример взят из Полинома по ссылке до:

SELECT * FROM users WHERE score = $var
//is still vulnerable to
$var = "1 OR 1 = 1"

Я бы порекомендовал вам использовать подготовленные заявления , если вы планируете использовать его в Интернете.

EDIT:

Измененный пример.

добавлены ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...