MySQL, как вопрос - PullRequest
       7

MySQL, как вопрос

0 голосов
/ 16 января 2010

У меня есть скрипт:

$friendnotes = mysql_query("SELECT nid,user,subject,message FROM friendnote 
WHERE tousers LIKE '%$userinfo[username]%' ");

А содержание в таблице "tousers" базы данных:

Test 
Example 
User

Этот скрипт работает хорошо

Однако , если есть пользователь с именем «Test2», он также будет отображать контент с «Test2» в базе данных, где $ userinfo [username] просто «Test»

Есть ли способ исправить эту проблему? Например (это просто пример, я не против, если вы дадите другой способ) сделать так, чтобы он просматривал целые строки?

РЕДАКТИРОВАТЬ: Я не думаю, что кто-то понимает, таблица "Tousers" содержит несколько значений (разделенных строкой), а не только одно, я хочу, чтобы он искал каждую строку (или все, что работает аналогично) , а не ряд

Ответы [ 6 ]

2 голосов
/ 16 января 2010

Состояние

tousers LIKE '%Test%'

означает, что touser содержит «Test» в некоторый момент, поэтому это верно для «Test», «MyTest», «Test3», «MyTest3» и т. Д.

Если вы хотите соответствовать только текущему пользователю, попробуйте

... WHERE tousers = '$userinfo[username]'

РЕДАКТИРОВАТЬ Если вы действительно хотите сохранить несколько имен в одном столбце (разделенных символом новой строки), вы можете использовать шаблон REGEXP, например

WHERE tousers REGEXP '(^|\\n)($userinfo[username])($|\\n)'

Имейте в виду, что $userinfo[username] не содержит символов, похожих на регулярные выражения ('$', '^', '|', '(' и т. Д.). Также (как указано в комментариях) выше) это решение является неоптимальным с точки зрения безопасности / производительности и т. д. Было бы лучше смоделировать отношение 1: n между таблицей friendnote и некоторой таблицей friendnotes_user ...

1 голос
/ 16 января 2010

Хорошо, похоже, что поле tousers может содержать такие значения, как «опция проверки материала» и «foo test2 что-то бла-бла», и вы хотите сопоставить первое, но не второе.В этом случае вам нужно включить разделители вокруг вашего поискового запроса.Предполагая, что поисковый термин всегда будет иметь пробел перед, а либо пробел или запятую после него, вы можете сделать что-то вроде:

... WHERE tousers LIKE '%[ ]$userinfo[username][ ,]%'

Однако это может вызвать проблемы, если ваш поисковый термин может появиться в началеполя (без пробела перед ним) или в конце поля (без разделителя после него).В этом случае вам может потребоваться несколько предложений LIKE.

1 голос
/ 16 января 2010

Это будет работать, если вы удалите знаки %, которые позволяют сопоставлять шаблоны.

$friendnotes = mysql_query("SELECT nid,user,subject,message FROM friendnote 
WHERE tousers LIKE '$userinfo[username]' ");

Но, похоже, все согласны с тем, что использование равных будет быстрее. См. /509706/ravno-protiv-like.

Так что в этом случае измените на

$friendnotes = mysql_query("SELECT nid,user,subject,message FROM friendnote 
WHERE tousers = '$userinfo[username]' ");

Правка - в отношении вашего редактирования это не очень хороший дизайн.Если пользователь может иметь несколько «Tousers» (то есть отношение «один ко многим»), это должно быть представлено в виде отдельной таблицы tousers, где каждая строка представляет один «Touser» и имеет внешний ключ для идентификатора пользователя длясопоставьте его с таблицей friendnote.Но если вы абсолютно не можете изменить свой дизайн, вам может потребоваться подобный подход:

WHERE tousers LIKE '%$userinfo[username]\n%' ");

, гарантирующий, что после имени пользователя будет разрыв строки.

0 голосов
/ 16 января 2010

Это идеальный случай использования оператора MySQL REGEXP .

0 голосов
/ 16 января 2010

То есть вы хотите искать только точные совпадения имен? Если это так, просто используйте = и удалите символы %:

$friendnotes = mysql_query("SELECT nid,user,subject,message FROM friendnote 
WHERE tousers = '$userinfo[username]' ");
0 голосов
/ 16 января 2010

Из того, что я понимаю, вы должны просто использовать строгое сравнение:

where tousers = 'whatever'

Это потому, что tousers like %whatever% соответствует любой строке, в которой поле tousers имеет «что угодно» в любом месте своего содержимого, поэтому оно соответствует «что угодно», «123whwhat», «what321» и «123whwhat321». Я надеюсь, вы поняли идею.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...