【问题标题】:Select from SQL database all rows that CONTAIN a certain text string in specific column从 SQL 数据库中选择在特定列中包含特定文本字符串的所有行
【发布时间】:2013-06-27 10:16:13
【问题描述】:

我一直在查看其他帖子,例如 thisthis,但对我的具体情况没有任何帮助。

我有一张这样的桌子:

|    Name    |    Reference    |    Etc...    |
|------------|-----------------|--------------|
|  John Doe  |                 |  Blah blah   |
|  Jane Doe  |   John Doe      |  Blah blah   |
| Mike Small |   Jane Doe      |  Blah blah   |
|  Steve Ex  |   John Doe      |  Blah blah   |
| Mary White |   Mike Small    |  Blah blah   |

我希望能够找到哪些名称也是另一个名称的引用,并将它们转换为链接,以便用户可以单击它们并获取引用的名称列表。

例如,如果用户点击 John Doe,他/她将获得如下表格:

|    Name    |    Reference    |    Etc...    |
|------------|-----------------|--------------|
|  Jane Doe  |   John Doe      |  Blah blah   |
|  Steve Ex  |   John Doe      |  Blah blah   |

目前我被困在这里:

function find_items_by_ref($ref) {
  db_connect();
  $query = sprintf("SELECT * FROM items WHERE reference LIKE '%s'", mysql_real_escape_string($ref));
  $result = mysql_query($query);
  $row = mysql_fetch_array($result);
  return $row;
}

我试过LIKECONTAINSlike '%' || TEXT || '%' 等等等等,但没有任何效果。请问有什么想法吗?


我在下面给出的答案中尝试了这两种可能性。第一个我遇到了一些麻烦。当我想echo 从 SQL Select 获得的数组元素时,我收到 Warning: Illegal string offset 'X' ... 错误。如果我在其中一个检索到的数组上运行var_dump,这就是我得到的。我不太清楚出了什么问题。对我来说似乎是一个工作数组:

array (size=16)
0 => string '37' (length=2)
'id' => string '37' (length=2)
1 => string 'Steve Ex' (length=8)
'name' => string 'Steve Ex' (length=8)
2 => string 'John Doe' (length=8)
'reference' => string 'John Doe' (length=8)
3 => string 'Blah blah' (length=9)
'etc' => string 'Blah blah' (length=9)

好的。解决了。这个问题太愚蠢了……猜猜谁觉得自己像个混蛋。 无论如何,如果 SQL 行作为一行,我试图传递一个数字。当用户想要通过其 ID 获取单行信息时,我错误地复制了我的 Select 函数。问题一直就在那里,我就像一头躲在树后面的大象一样想念它。无论如何,它是......对不起。工作代码是:

function find_items_by_ref($ref) {
  db_connect();
  $query = sprintf("SELECT * FROM items WHERE INSTR(reference,'".mysql_real_escape_string($ref)."')>'0' ORDER BY name ASC");
  $result = mysql_query($query);
  $result = db_result_to_array($result);
  return $result;
}

感谢@dimaninc 的帮助!

【问题讨论】:

  • 你传入的 ref 值是多少?您能否在问题中包含 $query 的值?
  • 只是猜测,但您可能需要对 $ref (php.net/manual/en/function.urldecode.php) 进行 urldecode。可能是将 $ref John Doe 中的空格编码为 John%20DoeJohn+Doe
  • 感谢所有帮助过的人!

标签: php sql select contains sql-like


【解决方案1】:
function find_items_by_ref($ref) {
  db_connect();
  $query = "SELECT * FROM items WHERE INSTR(reference,'".mysql_real_escape_string($ref)."')>'0'";
  $result = mysql_query($query);
  $row = mysql_fetch_array($result);
  return $row;
}

在这种情况下,INSTR 比 LIKE 快

或者如果你需要LIKE,你应该正确使用它:

$query = "SELECT * FROM items WHERE reference LIKE '%".mysql_real_escape_string($ref)."%'";

【讨论】:

  • @user2246674 它包含在 % 中,就像在 %%%s%% 中一样。哇!
  • 当你使用 LIKE 时,你应该使用 % 而不是 * 传递带有通配符的字符串
  • sprintf("SELECT * FROM items WHERE reference LIKE '%s'", mysql_real_escape_string($ref));?
  • sprintf("SELECT * FROM items WHERE reference LIKE '%%%s%%'", mysql_real_escape_string($ref));
  • @dimaninc,完美!这成功了。除了在sprintf 字符串的末尾和逗号之后,我从来没有能够让mysql_real_escape_string 在任何地方工作,所以也谢谢你!
猜你喜欢
  • 2015-10-17
  • 1970-01-01
  • 1970-01-01
  • 2019-10-22
  • 2017-10-07
  • 2020-12-08
  • 1970-01-01
  • 1970-01-01
  • 2013-09-27
相关资源
最近更新 更多