PHP搜索引擎循环失败

时间:2012-10-17 15:09:06

标签: php loops search-engine

我的代码需要一些帮助。到目前为止,当我进入页面时,可以看到整个视图。当我设置搜索并发布它时,它也可以。但是当我添加 - > 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 ...

这是每个“一次性变量”的标准信息吗?

2 个答案:

答案 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';

一旦你运行了这个查询,如果它的死慢,不要感到惊讶:减慢查询速度的三大要点是:

  1. 错误索引
  2. 使用通配符过度使用LIKE
  3. 很多OR条款
  4. 如果您的查询具有这三个特征中的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以修复实际问题。