PHP搜索引擎循环失败

PHP搜索引擎循环失败,php,loops,search-engine,Php,Loops,Search Engine,我需要一些代码方面的帮助。到目前为止,当我转到页面时,可以看到整个视图。当我设置搜索并发布它时,它也可以工作。但是,当我添加-->2或更多关于SQL错误的时,您正在遍历一个术语列表以构建一个WHERE子句。但是,在每次迭代中,您附加的查询还包含一个orderby子句。只要一个学期,这就行了。超过2个术语,您的SQL无效 尝试更新循环以仅追加WHERE-子句项,并在以下内容之后添加ORDER BY: foreach ($terms as $each) { if ($i++ > 0)

我需要一些代码方面的帮助。到目前为止,当我转到页面时,可以看到整个视图。当我设置搜索并发布它时,它也可以工作。但是,当我添加-->2或更多关于SQL错误的时,您正在遍历一个术语列表以构建一个
WHERE
子句。但是,在每次迭代中,您附加的查询还包含一个
orderby
子句。只要一个学期,这就行了。超过2个术语,您的SQL无效

尝试更新循环以仅追加
WHERE
-子句项,并在以下内容之后添加
ORDER BY

foreach ($terms as $each) {
    if ($i++ > 0) $customerlistquery .= ' OR ';
    $customerlistquery .= "concat(custsurname, custforename, custmidname) LIKE '%$each%' ";
}
$customerlistquery .= " ORDER BY custsurname, custforename, custmidname";
为了完成相同的任务,我还稍微更改了您的循环,但没有重复的代码

为了解决有关
未定义变量的警告问题,当您尝试使用变量而未声明变量时,会发生这种情况。如果是
$i
,则从不定义它(例如
$i=0;
),而是使用
$i++
——这将导致警告

您可以使用以下方法关闭这些通知:

error_reporting(E_ALL ^ E_NOTICE);

但是,您实际上在代码中使用了变量;相反,添加
$i=0
在您进入
foreach
循环以修复实际问题之前。

关于您的SQL错误-您正在循环一系列术语以构建
WHERE
子句。但是,在每次迭代中,您附加的查询还包含一个
orderby
子句。只要一个学期,这就行了。超过2个术语,您的SQL无效

尝试更新循环以仅追加
WHERE
-子句项,并在以下内容之后添加
ORDER BY

foreach ($terms as $each) {
    if ($i++ > 0) $customerlistquery .= ' OR ';
    $customerlistquery .= "concat(custsurname, custforename, custmidname) LIKE '%$each%' ";
}
$customerlistquery .= " ORDER BY custsurname, custforename, custmidname";
为了完成相同的任务,我还稍微更改了您的循环,但没有重复的代码

为了解决有关
未定义变量的警告问题,当您尝试使用变量而未声明变量时,会发生这种情况。如果是
$i
,则从不定义它(例如
$i=0;
),而是使用
$i++
——这将导致警告

您可以使用以下方法关闭这些通知:

error_reporting(E_ALL ^ E_NOTICE);

但是,您实际上在代码中使用了变量;相反,添加
$i=0
在进入
foreach
循环以解决实际问题之前。

@newfurniture是正确的,您第一次使用
$i
时,如下所示:
$i++
基本上,您将
1
添加到不存在的内容中:
$i
尚未声明,因此没有可以添加1的值

是的,你可以把通知关掉,把它们藏起来。但是,您的日志会很快变得杂乱无章。因此,以这样的方式编写代码是一种很好的做法,它可以在
E|u STRICT | E|u ALL
设置下运行,而不会出现任何警告或通知

解决了这个问题后,我可以告诉您,现在您也会看到到处都是SQL语法错误:

foreach ($terms as $i => $each) 
{//use the index in a foreach loop, that's the easiest solution
    if ($i === 0)
    {
        $customerlistquery .= "concat(custsurname, custforename, custmidname) LIKE '%$each%' ORDER BY custsurname, custforename, custmidname";
    }
    else
    {
        $customerlistquery .= "OR concat(custsurname, custforename, custmidname) LIKE '%$each%' ORDER BY custsurname, custforename, custmidname";
    }
}
连接的每一位查询都以ORDERBY子句结束。SQL不会接受类似的查询

SELECT foo FROM db.bar WHERE x LIKE '%Y%' ORDER BY x,z OR x LIKE '%x%' ORDER BY x,z
因此,我建议您在循环后添加
orderby
子句:

foreach ($terms as $i => $each) 
{//use the index in a foreach loop, that's the easiest solution
    if ($i === 0)
    {
        $customerlistquery .= "concat(custsurname, custforename, custmidname) LIKE '%$each%'";
    }
    else
    {
        $customerlistquery .= "OR concat(custsurname, custforename, custmidname) LIKE '%$each%'";
    }
}
$customerlistquery .= ' ORDER BY custsurname, custforename, custmidname';
运行此查询后,如果查询速度非常慢,请不要感到惊讶:要使查询速度下降的前三个因素是:

  • 不良索引
  • 与通配符类似的
    的过度使用
  • 大量的
    子句

  • 如果您的查询具有这三个特征中的两个,那么SQL执行完整表扫描并将临时表写入磁盘的可能性为99%。那么,离理想还差得远。

    @newfurniture是对的,您第一次使用
    $i
    ,是这样的:
    $i++
    基本上,您将
    1
    添加到不存在的内容中:
    $i
    尚未声明,因此没有可以添加1的值

    是的,你可以把通知关掉,把它们藏起来。但是,您的日志会很快变得杂乱无章。因此,以这样的方式编写代码是一种很好的做法,它可以在
    E|u STRICT | E|u ALL
    设置下运行,而不会出现任何警告或通知

    解决了这个问题后,我可以告诉您,现在您也会看到到处都是SQL语法错误:

    foreach ($terms as $i => $each) 
    {//use the index in a foreach loop, that's the easiest solution
        if ($i === 0)
        {
            $customerlistquery .= "concat(custsurname, custforename, custmidname) LIKE '%$each%' ORDER BY custsurname, custforename, custmidname";
        }
        else
        {
            $customerlistquery .= "OR concat(custsurname, custforename, custmidname) LIKE '%$each%' ORDER BY custsurname, custforename, custmidname";
        }
    }
    
    连接的每一位查询都以ORDERBY子句结束。SQL不会接受类似的查询

    SELECT foo FROM db.bar WHERE x LIKE '%Y%' ORDER BY x,z OR x LIKE '%x%' ORDER BY x,z
    
    因此,我建议您在循环后添加
    orderby
    子句:

    foreach ($terms as $i => $each) 
    {//use the index in a foreach loop, that's the easiest solution
        if ($i === 0)
        {
            $customerlistquery .= "concat(custsurname, custforename, custmidname) LIKE '%$each%'";
        }
        else
        {
            $customerlistquery .= "OR concat(custsurname, custforename, custmidname) LIKE '%$each%'";
        }
    }
    $customerlistquery .= ' ORDER BY custsurname, custforename, custmidname';
    
    运行此查询后,如果查询速度非常慢,请不要感到惊讶:要使查询速度下降的前三个因素是:

  • 不良索引
  • 与通配符类似的
    的过度使用
  • 大量的
    子句
  • 如果您的查询具有这三个特征中的两个,那么SQL执行完整表扫描并将临时表写入磁盘的可能性为99%。那么,这就远远不理想了。

    $i在第一轮未定义,您需要初始化它,例如
    $i=0
    $i在第一轮未定义,您需要初始化它,例如
    $i=0