0

顧客テーブルから行を返すこの sql ステートメントがあります。ユーザーには、入力したいものを検索するオプションがあります。bindValue を使用して SQL インジェクションから保護しようとするまで、これは機能していました。ユーザーがテキストボックスを空白のままにしない限り、結果を返すことができません。以下は私のコードです。

モデル

function searchMyCusts($field, $query){          
    $data = null;
    $msg = null;
    $status = null;

    $sth = $this->db->prepare("SELECT ".CustomerFields::ID.",".CustomerFields::FirstName.",".CustomerFields::LastName.",".CustomerFields::PhoneNumber." FROM ".CustomerFields::TableName." WHERE '$field' LIKE :query");

    $sth->bindValue(':query', $query);

    if ($sth->execute()){
        $status = "success";
        $msg = "Customer entry successfully altered";            
        $data = $this->smartFetchAll($sth);


    }else{
        $status = "error";            
        $msg = "An error occurred. :".$sth->errorInfo()[2];
    }

    $jsonData = json_encode($this->buildResponseArray($status, $msg, $data));        
    return $jsonData;
}

最後の準備行では、値が渡されます。前述のように、クエリ変数を bindValue しようとするまで、これは機能していました。

ご意見をいただければ幸いです。前もって感謝します!

よろしく

4

1 に答える 1

1

以前はどのように機能したかわかりませんが、まず変更する必要があります

" WHERE '$field' LIKE :query"

" WHERE $field LIKE :query"

また

" WHERE `$field` LIKE :query"

:query列名はパターンと比較する単なるリテラル文字列になるため、列名を引用符で囲むことはできません。クエリは機能しますが、行が返されません。何もないか、バックティックします。

次に$query、準備する前に必要なすべてのワイルドカード記号を含める必要があります。例えば

$query = "%new%";

それがあなたのコードに当てはまるかどうかは明らかではありません

于 2013-05-11T21:09:58.850 に答える