0

ここで私のコードについて少し助けが必要です。これまでのところ、このページに移動すると、全体が表示されます。検索を設定してPOSTすると、それも機能します。しかし、-> 2つ以上の<-キーワードを追加すると、エラーが発生します。したがって、問題はフォアアーチループelse構造にあります。

その場合、次のエラーが発生します。

queryfoutSQL構文にエラーがあります。6行目の「ORDERBYcustsurname、custforename、custmidname」の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。

いろいろな作り方を試しましたが、どういうわけかうまくいかないようです。

私のコードは以下の通りです:

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
        ";
}

そして最後にもう1つ質問があります。PHPが未定義の変数について泣き言を言うのはなぜですか:i

Notice: Undefined variable: i in ...

これはすべての「使い捨て変数」の標準メッセージですか?

4

2 に答える 2

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";
    }
}

連結するクエリの各ビットは、ORDERBY句で終わります。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';

このクエリを実行した後は、非常に遅い場合でも驚かないでください。クエリを遅くする上位3つの項目は次のとおりです。

  1. インデックスが正しくない
  2. LIKEワイルドカードの乱用
  3. たくさんのOR条項

クエリにこれら3つの特性のうち2つがある場合、SQLが全表スキャンを実行して一時テーブルをディスクに書き込む可能性は99%です。それでは、理想からはほど遠い。

于 2012-10-17T15:26:52.680 に答える
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);

ただし、実際にはコードで変数を使用します。代わりに$i = 0;、ループに入る前に追加foreachして、実際の問題を修正してください。

于 2012-10-17T15:12:39.457 に答える