php查询搜索一行中的字符串

php查询搜索一行中的字符串,php,mysql,joomla,Php,Mysql,Joomla,如何在php中搜索一行中的字符串?我写了这段代码: $filterQuery .=' LIKE %' . $db->Quote(JString::strtolower($filter) . '%'); 它可以在mysql中搜索字符串:比如“%stringtosearch%” 为什么它在php中不起作用?因为括号中的代码在字符串周围添加了引号,所以请改为这样做 $filterQuery .=" LIKE '%" . strtolower($filter) . "%'"); 请记住,在查询

如何在php中搜索一行中的字符串?我写了这段代码:

$filterQuery .=' LIKE %' . $db->Quote(JString::strtolower($filter) . '%');
它可以在mysql中搜索字符串:比如“%stringtosearch%”


为什么它在php中不起作用?

因为括号中的代码在字符串周围添加了引号,所以请改为这样做

$filterQuery .=" LIKE '%" . strtolower($filter) . "%'");

请记住,在查询数据库之前,您需要清理/转义数据

,因为括号中的代码在字符串周围添加了引号,请改为这样做

$filterQuery .=" LIKE '%" . strtolower($filter) . "%'");

请记住,在查询数据库之前,您需要清理/转义数据

如果它的工作方式类似于“%stringtosearch%”,则在
%
之前和之后添加

$filterQuery .= " LIKE '%" . $db->Quote(JString::strtolower($filter) . "%' ");
                       ^                                                 ^

如果它像“%stringtosearch%”一样工作,那么在
%
之前和之后添加
%
,就像这样

$filterQuery .= " LIKE '%" . $db->Quote(JString::strtolower($filter) . "%' ");
                       ^                                                 ^

注:@Andrew Eddie给出了一个更好的答案

$filterQuery .=' LIKE ' . $db->quote('%'. JString::strtolower($filter) . '%');

注:@Andrew Eddie给出了一个更好的答案

$filterQuery .=' LIKE ' . $db->quote('%'. JString::strtolower($filter) . '%');

如前所述,您忘记了
%…%
部分周围的引号。但是,MySQL默认情况下不区分大小写,因此您可能可以删除
JString
调用,除非您专门将MySQL服务器配置为区分大小写。然后,可将替代用途简化为:

$filterQuery .=' LIKE ' . $db->quote('%' . $filter . '%');
但是,请注意,如果使用用户输入,SQL通配符可能会导致DOS攻击(用户可能会在筛选器字符串中添加%和uu字符)。要防止出现这种情况,请使用以下格式:

$filterQuery .=' LIKE ' . $db->quote('%' . $db->escape($filter, true) . '%');
这将跳出过滤器本身(并允许您搜索真正的下划线或%字符)。核心代码就是这样处理这种情况的,如下所示:


如前所述,您忘记了
%…%
部分周围的引号。但是,MySQL默认情况下不区分大小写,因此您可能可以删除
JString
调用,除非您专门将MySQL服务器配置为区分大小写。然后,可将替代用途简化为:

$filterQuery .=' LIKE ' . $db->quote('%' . $filter . '%');
但是,请注意,如果使用用户输入,SQL通配符可能会导致DOS攻击(用户可能会在筛选器字符串中添加%和uu字符)。要防止出现这种情况,请使用以下格式:

$filterQuery .=' LIKE ' . $db->quote('%' . $db->escape($filter, true) . '%');
这将跳出过滤器本身(并允许您搜索真正的下划线或%字符)。核心代码就是这样处理这种情况的,如下所示:



$filterQuery.=“像“%”$db->Quote(JString::strtolower($filter)。“%”;没什么(@user3170524)您是否尝试过检查
$db->Quote(JString::strtolower($filter)
包含的内容或使用硬编码的值执行查询?请解释如何执行?尝试
var_dump($db->Quote(JString::strtolower($filter));
查看其生成和/或执行的是
$filterQuery.=“像“%stringtosearch%””;
$filterQuery.=“像“%”“$db->Quote(JString::strtolower($filter)。“%””;什么都没有!:(@user3170524)你有没有试过检查
$db->Quote(JString::strtolower($filter)
包含什么,或者用硬编码的值进行查询?你能解释一下怎么做吗?试试
变量转储($db->Quote(JString::strtolower($filter));
要查看其生成和/或执行的操作,
$filterQuery.=“像'%stringtosearch%'”;
如果您回显$db->Quote(JString::strtolower($filter),它会显示什么?输出是:'stringtosearch',那么$db->Quote(JString::strtolower($filter)也会在字符串周围添加引号?但是如果我尝试:$filterQuery.='LIKE'。$db->Quote(JString::strtolower($filter)。“%”);它可以工作,但它只能找到mystring位于第一个位置的单词。是的,这是因为在字符串前面没有%所以它只会在第一个位置拾取匹配的字符串如果你回显$db->Quote(JString::strtolower($filter),它会显示什么?输出是:'stringtosearch',那么$db->Quote呢(JString::strtolower($filter)在字符串周围加引号?但是如果我尝试:$filterQuery.='LIKE'.$db->Quote(JString::strtolower($filter)。“%”;它可以工作,但它只能找到第一个位置有mystring的单词。是的,这是因为你的字符串前面没有%所以它只会在第一个位置拾取匹配的字符串。你把%放在刻度之外。你把%放在刻度之外。通配符问题很重要,但iirc没有$db->quote()是否至少可以选择转义?这可能取决于驱动程序,但至少在MySQL的情况下,
quote
将转义NUL(ASCII 0)、\n、\r、\、“、”和Control-Z。它既不能转义
%
也不能转义
\
。这是一个有趣但必要的两步过程,因为我们希望正确地转义(转义通常的嫌疑犯)整个字符串,但我们不希望手动输入的
%
被转义,但我们确实希望彻底转义用户输入。来宾用户输入应始终以这种方式处理。对于经过身份验证的用户,由开发人员决定他们是否愿意允许。+1对,转义时为true($filter,true)添加%\后,quote()中的转义使用escape()默认值false,因此一切正常。这应该是可接受的答案,特别是因为实际可接受的答案对转义数据没有任何作用。通配符问题非常重要,但iirc没有$db->quote()是否至少可以选择转义?这可能取决于驱动程序,但至少在MySQL的情况下,
quote
将转义NUL(ASCII 0)、\n、\r、\、“、”和Control-Z。它既不能转义
%
也不能转义
\
。这是一个有趣但必要的两步过程,因为我们希望正确地转义(转义通常的嫌疑犯)整个字符串,但我们不希望手动输入的
%
被转义,但我们确实希望彻底转义用户输入。来宾用户输入应始终以这种方式处理。对于经过身份验证的用户,由开发人员决定他们是否愿意允许。+1对,转义时为true($filter,true)添加%\后,quote()中的转义使用了默认的escape()false,因此一切正常。这应该是