1
SELECT * FROM `orders` WHERE id LIKE %1%
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%1%' at line 1

PHP

$sql = "SELECT * FROM `orders` ";

switch ($_POST['criteria']) {

    case 'id':
        $sql .= "WHERE id LIKE %" . (int) $_POST['search_input'] . "%";
    break;
    case 'OCR':
        $sql .= "WHERE OCR LIKE %" . $db->quote($_POST['search_input']) . "%";
    break;
    case 'name':
        $arr = explode(' ', $_POST['search_input']);
        $firstname = $arr[0];

        if (isset($arr[1])) {
            $lastname = $arr[1];
        } else {
            $lastname = null;
        }

        $sql .= "WHERE firstname LIKE %" . $db->quote($firstname) . "% AND lastname LIKE %" . $db->quote($lastname) . "%";
    break;
}

echo $sql;

$stmt = $db->query($sql);

$rows = $stmt->fetchAll();

クエリが出力されていて、問題ないように見えますが、何らかの理由で構文エラーが発生しています (そうであると思います)。しかし、問題を特定できないようですか?

4

3 に答える 3

3

LIKE演算子は文字列関数です。そのため、単一引用符 (') で囲む必要があります。

SELECT * FROM `orders` WHERE id LIKE '%1%';
于 2013-08-11T15:26:40.010 に答える
3

文字列の周りに引用符がないため、クエリは次のようになります。

SELECT * FROM orders where id LIKE %55%

それ以外の:

SELECT * FROM orders where id LIKE '%55%'


$sql = "SELECT * FROM `orders` ";

switch ($_POST['criteria']) {

    case 'id':
        $sql .= "WHERE id LIKE '%" . (int) $_POST['search_input'] . "%'";
    break;
    case 'OCR':
        $sql .= "WHERE OCR LIKE '%" . $db->quote($_POST['search_input']) . "%'";
    break;
    case 'name':
        $arr = explode(' ', $_POST['search_input']);
        $firstname = $arr[0];

        if (isset($arr[1])) {
            $lastname = $arr[1];
        } else {
            $lastname = null;
        }

        $sql .= "WHERE firstname LIKE '%" . $db->quote($firstname) . "% AND lastname LIKE '%" . $db->quote($lastname) . "%'";
    break;
}

echo $sql;

$stmt = $db->query($sql);

$rows = $stmt->fetchAll();

この回答で問題は解決するはずですが、 で識別される一意の注文を探しているため、=代わりにを使用することを強くお勧めします。LIKEid

idスクリプトが現在書かれている方法では、55 の場合、55、255、5500、1559 の順序が得られます...

于 2013-08-11T15:30:07.497 に答える
2

パターンをシングルクォートで書いてください '' そして、私のように

         incorrect     SELECT * FROM `orders` WHERE id LIKE %1%
           correct-     SELECT * FROM `orders` WHERE id LIKE '%1%' 
于 2013-08-11T15:32:42.197 に答える