PHP搜索引擎循环失败
我需要一些代码方面的帮助。到目前为止,当我转到页面时,可以看到整个视图。当我设置搜索并发布它时,它也可以工作。但是,当我添加-->2或更多关于SQL错误的时,您正在遍历一个术语列表以构建一个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)
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