Вопрос по php, mysql, sql, string – Как использовать строку PHP в запросе MySQL LIKE?

11

Я пытаюсь найти количество строк, которые соответствуют определенному шаблону. В этом примере все, что НАЧИНАЕТСЯ с «123»:

Это работает:

<code>$query = mysql_query("SELECT * FROM table WHERE the_number LIKE '123%'");
$count = mysql_num_rows($query);
</code>

Проблема в том, что LIKE будет меняться, поэтому я пытаюсь определить его в сценарии, а затем выполнить запрос, но это НЕ работает:

<code>$prefix = "123";
$query = mysql_query("SELECT * FROM table WHERE the_number LIKE $prefix.'%'");
$count = mysql_num_rows($query);
</code>

Как я могу заставить этот запрос работать должным образом во втором примере?

РЕДАКТИРОВАТЬ: Я также пробовал без периода (также не работает):

<code>$query = mysql_query("SELECT * FROM table WHERE the_number LIKE $prefix'%'");
</code>
Джон, то, что я нашел, помогает мне при использовании переменных в строках, это использовать фигурные скобки.$var1 = "foo"; $var2 = "{$var1} bar"; echo $bar2; Выводит: foo bar, и вам не нужно беспокоиться о конкатенации и т. Д., Однако, это не работает, как вы можете подумать, используя одинарные кавычки для строк. Blake

Ваш Ответ

2   ответа
3

$query = mysql_query("SELECT * FROM table WHERE the_number LIKE '$yourPHPVAR%'");

Не забывайте% в конце

18

нет необходимости помещать точку внутри строки в двойных кавычках. Вместо этого это должно быть больше похоже на

$query = mysql_query("SELECT * FROM table WHERE the_number LIKE '$prefix%'");

Вы можете подтвердить это, распечатав строку, чтобы убедиться, что она идентична первому случаю.

Конечно, этоnot a good idea просто вставить переменные в строку запроса, как это из-за опасности внедрения SQL. По крайней мере, вы должны вручную экранировать содержимое переменной с помощьюmysql_real_escape_stringчто бы выглядело примерно так:

$sql = sprintf("SELECT * FROM table WHERE the_number LIKE '%s%%'",
               mysql_real_escape_string($prefix));
$query = mysql_query($sql);

Обратите внимание, что внутри первого аргументаsprintf знак процента должен быть удвоен, чтобы в конечном итоге появиться один раз в результате.

Фантастика. Спасибо вам большое! JROB
@Blake: Очевидно, но я все равно должен сказать это. Код может быть адаптирован к контекстам, отличным от того, для которого он предназначен.
ertertg ertferf
Существует опасность инъекции, если вы используете какие-либо введенные пользователем данные. Нет опасности для:$var = "rawr"; ... query("SELECT * FROM table WHERE col='{$var}'"; Вы контролируете свои собственные данные на сервере.
@ Джон, Конечно. Однако вы должны указать, что запросы могут быть уязвимы для инъекций ... с введенными пользователем данными. Существует разница между словами "Посмотри на этот дом". и "Посмотри на этот дом в огне". :)

Похожие вопросы