LIKE оператор с $variable

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

В принципе, у меня есть следующий код:

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

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

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

Я старался :

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

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

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


person skarama    schedule 03.12.2009    source источник
comment
Что это за язык? Строковые кавычки выглядят немного странно.   -  person Joe Koberg    schedule 04.12.2009
comment
Вы найдете решение в stackoverflow.com/questions/1318028/php- Different-quotes   -  person Ivan Nevostruev    schedule 04.12.2009
comment
@Joe Да, цитирование строк в обоих случаях не соответствует действительности.   -  person ceejayoz    schedule 04.12.2009


Ответы (6)


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

Подстановочный знак SQL — это знак процента. Следовательно:

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

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

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

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

person ceejayoz    schedule 03.12.2009
comment
СПАСИБО! Вы спаситель! Большое вам спасибо! Я только что заметил ваше редактирование, это то, чего я не делал!! Теперь все работает нормально, большое спасибо, и этот сайт определенно в избранном. - person skarama; 04.12.2009
comment
Это было полезно для меня. Спасибо:) - person sg552; 23.02.2012

Использовать:

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

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

альтернативный текст

person OMG Ponies    schedule 03.12.2009
comment
Я понял, но поля tablename и columnname не являются фактическими именами полей, я изменил настоящие. Или я ошибаюсь? И я не обижаюсь, я очень рада, что получаю так много быстрых ответов! - person skarama; 04.12.2009
comment
skarama: Он имеет в виду, что вы не должны создавать SQL-запросы, используя строки для ввода параметров. Делая это, вы предоставляете своим пользователям полный доступ к вашей базе данных (с теми же разрешениями, что и ваш веб-сервер). - person Mark Byers; 04.12.2009
comment
@Skarma: Суть атаки SQL Injection заключается в том, что она искусственно завершает строковый параметр, который вы пытаетесь заполнить, а затем сразу после этого отправляет второй запрос, который, вероятно, будет вредоносным. Неважно, что происходит в первом запросе. - person OMG Ponies; 04.12.2009
comment
-1 за нерабочий запрос. Переменная не будет оцениваться в строке с одинарными кавычками, ей нужны одинарные кавычки вокруг самой переменной, и вам не хватает подстановочных знаков, запрошенных пользователем. - person ceejayoz; 04.12.2009
comment
Спасибо всем, я также рассмотрю атаки SQL Injection и попытаюсь узнать, как их предотвратить :) - person skarama; 04.12.2009

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

person Cade Roux    schedule 03.12.2009
comment
Боюсь, я понятия не имею, что это значит, я больше, чем новичок в этом :( - person skarama; 04.12.2009
comment
Это совсем не помогает. - person Jeffrey Aylesworth; 04.12.2009
comment
+1: Кто-то обиделся на предупреждение о плохих практиках :/ - person OMG Ponies; 04.12.2009
comment
Предупреждение о плохих практиках бесполезно для новичка, если вы не объясните, о чем говорите, и не поможете показать, как это исправить. - person ceejayoz; 04.12.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 . '"';
person Ivan Nevostruev    schedule 03.12.2009

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

person streetparade    schedule 03.12.2009

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

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

display_errors = On

А также:

error_reporting = E_ALL
person Paul Lammertsma    schedule 03.12.2009