2012-10-17 47 views
0

我需要一些幫助,在這裏我的代碼。到目前爲止,當我進入頁面時,可以看到整個視圖。當我設置搜索並POST時,它也可以工作。但是,當我添加 - > 2或更多< - 關鍵字時,我收到錯誤。所以問題在於forearch循環其他構造。PHP搜索引擎循環失敗

在這種情況下,我得到這個錯誤:

查詢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抱怨未定變量:i

Notice: Undefined variable: i in ... 

這是每個「一次性變量」的標準消息嗎?

+2

** $ i **第一次未定義,您需要初始化它,例如'$ i = 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 

所以我建議你Concat的的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'; 

一旦你得到這個查詢運行,不感到驚訝,如果它死慢:前3,做事能降低查詢的降權是:

  1. 壞索引
  2. 使用通配符用眼過度LIKE
  3. 很多OR條款

如果查詢有這三個特點2,有99%的機會,SQL將執行全表掃描,寫一個臨時表磁盤。那麼遠非理想。

1

關於您的SQL錯誤 - 您正在通過術語列表來構建WHERE子句。但是,在每次迭代中,您追加的查詢還包含一個ORDER BY子句。用一個術語,這將工作正常。 2+條款和你有無效的SQL。

嘗試更新循環只追加WHERE -clause項目並添加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); 

但是,你實際使用的代碼中的變量;相反,請在輸入foreach循環之前添加$i = 0;以解決實際問題。

+0

令人驚歎!非常感謝!!! –