MySQL, как запрос, но не как другие - PullRequest
1 голос
/ 15 сентября 2011
    $SQL = "SELECT * FROM `user_posts` WHERE (`post` LIKE '%@".$user."%')";

Например, если мое имя пользователя @Jake, в нем будет отображаться любой пост, в котором есть @Jake.Но это также подойдет, например, @ Jake11, это также покажет.Как я могу это исправить?

Ответы [ 7 ]

3 голосов
/ 15 сентября 2011

Возможно, вы захотите использовать какое-то регулярное выражение вместо LIKE '%...%'.

Примером может быть:

... WHERE `post` REGEXP '@" . mysql_real_escape_string( $user ) . "[[:>:]]'"

Совпадение [[:>:]] направильная граница слова.Как указал Билл Карвин, в этом случае нет необходимости использовать левую границу, поскольку подразумевается граница слова в символе @.(Действительно, вы не можете иметь левую границу слева от несловесного символа.)

(Я уверен, что другие прокомментируют ваше возможное воздействие SQL-инъекции атака тоже.)

0 голосов
/ 15 сентября 2011

Используйте регулярное выражение:

$SQL = "SELECT *
        FROM `user_posts1
        WHERE (`post` LIKE '%@".$user."%)
        AND (`post` NOT RLIKE '%@".$user."[a-zA-Z0-9]%')"

В вашем примере это будет включать @jake, пока символ, следующий непосредственно за "jake" ($user), не находится между a и z, А и Z или 0-а.

0 голосов
/ 15 сентября 2011

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

0 голосов
/ 15 сентября 2011

'%' - это подстановочный знак, он будет соответствовать любому количеству символов в этом месте.Удалите их из вашего запроса, и все будет готово.Этот запрос говорит: «найдите строку, в которой есть запись, совпадающая с [что угодно] @Jake [что угодно]»

Звучит не так, как вы хотите*

0 голосов
/ 15 сентября 2011

http://devzone.zend.com/article/1304

Использовать столбец FULLTEXT:)

ALTER TABLE user_posts ADD FULLTEXT(post);

$sql = ' SELECT * FROM user_posts WHERE MATCH (post) AGAINST ("' . $user . '") ';
0 голосов
/ 15 сентября 2011
$SQL = "SELECT * FROM `user_posts` WHERE (`post` LIKE '%@".$user."')"; 
0 голосов
/ 15 сентября 2011

Похоже, у вас нет необходимости в LIKE, будет работать простая проверка на равенство:

$SQL = "SELECT * FROM `user_posts` WHERE (`post` = '@".$user."')";

Имейте в виду, у вас есть возможность инъекции SQL здесь и должны использовать mysql_real_escape_string:

$SQL = sprintf("SELECT * FROM `user_posts` WHERE (`post` = %s)", mysql_real_escape_string('@' . $user));

Если вы хотите найти @Joe внутри поста, вы можете добавить пробелы вокруг вашего элемента, но это будет выполняться медленно:

$SQL = sprintf("SELECT * FROM `user_posts` WHERE (`post` LIKE %s)", mysql_real_escape_string('% @' . $user . ' %'));

Для исполнения используйте FULLTEXT index:

$SQL = sprintf("SELECT * FROM `user_posts` WHERE MATCH (post) AGAINST (%s)", mysql_real_escape_string('@' . $user));
...