2009-12-03 2 views
1

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

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

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

Если я эхо переменных $, она печатает URL текущей страницы (который является JavaScript на моей странице)

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

Я пробовал:

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

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

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

+0

На каком языке это? Строковое цитирование выглядит немного странным. –

+0

@Joe: Код - это PHP. –

+0

Вы найдете решение в http://stackoverflow.com/questions/1318028/php-different-quotes –

ответ

20

Ultimately, what I want, is to be able to make a search for which the search-term is the current page's url, with wildcards before and after.

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: Просто получил upvote, так что с учетом этого, пожалуйста не использовать mysql_* функции больше.

+0

СПАСИБО! Вы спаситель, спасибо вам большое! Я только что заметил ваше редактирование, это то, чего я еще не делал !! Он отлично работает сейчас, спасибо большое, и этот сайт определенно выгоден. – skarama

+1

+1: И я ценю комментарий относительно нисходящего потока. –

+0

Это было полезно для меня. Спасибо:) – sg552

5

Пожалуйста! не используйте это, оно уязвимо для SQL injection (this is a list of 138 StackOverflow questions you should read, absorb and understand prior to returning to your application). Используйте параметризованные запросы или хранимые процедуры.

+0

Я боюсь, я понятия не имею, что это значит, я больше, чем новичок в этом :( – skarama

+2

Это совсем не помогает. –

+2

+1: Кто-то обиделся на предупреждение о плохих практиках:/ –

6

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

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

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

alt text

+0

Я получаю идею, но поля tablename и columnname не являются фактическими именами полей, я изменил реальные. Или я ошибаюсь? И я не обижаюсь, я очень доволен, что получаю так много быстрых ответов! – skarama

+0

skarama: Он означает, что вы не должны создавать SQL-запросы, используя строки для ввода параметров. Делая это, вы предоставляете своим пользователям полный доступ к вашей базе данных (с теми же правами, что и ваш веб-сервер). –

+0

@Skarma: Точка атаки SQL Injection заключается в том, что она искусственно завершает строковый параметр, который вы пытаетесь заполнить, а затем сразу же отправляйте второй запрос, который может быть вредоносным. Неважно, что происходит в первом запросе. –

1

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

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

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

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

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

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

display_errors = On 

И:

error_reporting = E_ALL 
1

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

Смежные вопросы