我的代码需要一些帮助。到目前为止,当我进入页面时,可以看到整个视图。当我设置搜索并发布它时,它也可以。但是当我添加 - > 2个或更多< - 关键字,我收到错误。所以问题出现在forearch循环的其他构造中。
在这种情况下,我收到此错误:
query fout你的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在第6行的“ORDER BY custsurname,custforename,custmidname”附近使用正确的语法
我尝试了许多构建方法,但似乎无论如何都不起作用。
我的代码如下:
if(isset($_POST['search']))
{
$search = $_POST['search'];
$terms = explode(" ", $search);
$customerlistquery = "
SELECT *
FROM customer
LEFT JOIN company
ON customer.compid=company.compid
WHERE
";
foreach ($terms as $each)
{
$i++;
if ($i == 1)
{
$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";
}
}
}
else
{
$customerlistquery = "
SELECT *
FROM customer
LEFT JOIN company
ON customer.compid=company.compid
ORDER BY custsurname, custforename, custmidname
";
}
还有最后一个问题。为什么PHP抱怨未定义的变量:我?
Notice: Undefined variable: i in ...
这是每个“一次性变量”的标准信息吗?
答案 0 :(得分:2)
@newfurniturey是正确的,第一次使用$i
时,就在这里:$i++;
基本上,您将1
添加到不存在的内容:$i
没有没有声明,所以没有值可以添加1。
是的,你可以关闭通知,只是隐藏它们。但是,您的日志会很快变得杂乱无章。因此,优良作法是以这样的方式编写代码,使其在E_STRICT | E_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";
}
}
您连接的每个查询位都以ORDER BY子句结束。 SQL不接受看起来像
的查询SELECT foo FROM db.bar WHERE x LIKE '%Y%' ORDER BY x,z OR x LIKE '%x%' ORDER BY x,z
所以我建议你在循环之后连接ORDER BY
子句:
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';
一旦你运行了这个查询,如果它的死慢,不要感到惊讶:减慢查询速度的三大要点是:
LIKE
OR
条款如果您的查询具有这三个特征中的2个,那么SQL将有99%的可能执行全表扫描并将临时表写入磁盘。那么远非理想。
答案 1 :(得分:1)
关于您的SQL错误 - 您正在循环查看术语列表以构建WHERE
子句。但是,在每次迭代中,您追加的查询还包含ORDER BY
子句。使用单个术语,这将工作正常。 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";
我也改变了你的循环以完成相同的任务,但没有重复的代码。
要解决有关undefined variable
警告的问题,当您尝试使用变量而不声明它时会发生这种情况。在$i
的情况下,您永远不会定义它(例如$i = 0;
),但是您使用$i++
- 这会导致警告。
您可以使用以下方式关闭这些通知:
error_reporting(E_ALL ^ E_NOTICE);
但是,您实际上在代码中使用了该变量;相反,在进入$i = 0;
循环之前添加foreach
以修复实际问题。