Как оператор с переменной $ - PullRequest
2 голосов
/ 04 декабря 2009

Это мой первый вопрос, и я надеюсь, что он достаточно прост, чтобы получить быстрый ответ!

В основном у меня есть следующий код:

$variable = curPageURL();
$query = 'SELECT * FROM `tablename` WHERE `columnname` LIKE '$variable' ;

Если я отображаю переменную $, она печатает URL текущей страницы (который является javascript на моей странице)

В конечном итоге, я хочу иметь возможность выполнять поиск, для которого поисковый термин является URL-адресом текущей страницы, с подстановочными знаками до и после. Я не уверен, возможно ли это вообще или у меня просто есть синтаксическая ошибка, потому что я не получаю ошибок, просто нет результата!

Я пытался:

    $query = 'SELECT * FROM `tablename` WHERE `columnname` LIKE '"echo $variable" ' ;

Но опять же, я, вероятно, отсутствует или использую неуместное "" и т. Д.

Пожалуйста, скажите мне, что я делаю неправильно!

Ответы [ 6 ]

24 голосов
/ 04 декабря 2009

В конечном итоге я хочу выполнить поиск, для которого поисковый термин является URL-адресом текущей страницы, с подстановочными знаками до и после.

Подстановочный знак SQL является знаком процента. Поэтому:

$variable = curPageURL();
$variable = mysql_real_escape_string($variable);
$query = "SELECT * FROM `tablename` WHERE `columnname` LIKE '%{$variable}%'";

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

Также обратите внимание: я также исправил ваше цитирование строк. Вы можете использовать переменную в строке напрямую, только если эта строка заключена в двойные кавычки, и в конце $query.

вы пропустили кавычку.

edit 17 января 2015: Только что получил голосование, поэтому с учетом этого пожалуйста не используйте функции mysql_* больше.

7 голосов
/ 04 декабря 2009

Использование:

$query = "SELECT * FROM `tablename` WHERE `columnname` LIKE '{$variable}'" ;

Чтобы получить представление о том, почему для предотвращения атак с использованием SQL-инъекций, таких как описанные выше, могут быть уязвимы, я отправляю «Эксплойты мамы»:

alt text

5 голосов
/ 04 декабря 2009

Пожалуйста, не делайте этого, это уязвимо для SQL-инъекций (это список из 138 вопросов StackOverflow, которые вы должны прочитать, усвоить и понять до возвращения в свое приложение) . Используйте параметризованные запросы или хранимые процедуры.

1 голос
/ 04 декабря 2009

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

1 голос
/ 04 декабря 2009

Используйте двойные кавычки , если вам нужно подставить значения переменных:

## this code is open for SQL injection attacks
$query = "SELECT * FROM `tablename` WHERE `columnname` LIKE '$variable'";

Или строка конкатата вручную:

## this code is open for SQL injection attacks
$query = 'SELECT * FROM `tablename` WHERE `columnname` LIKE "' . $variable . '"';
0 голосов
/ 04 декабря 2009

Почему вас не уведомляют о синтаксической ошибке: вполне вероятно, что ваши настройки отчетов об ошибках установлены неправильно.

Откройте php.ini и убедитесь, что установлено следующее:

display_errors = On

И

error_reporting = E_ALL
...