1

ええと、私はこれに数時間取り組んできましたが、私の人生では、何が悪いのかわかりません。コードは次のとおりです。

$str = "%" . $_POST['str'] . "%";
$offset = (int) $_POST['offset'];

try {
    $stmt = $dbh->prepare("SELECT * FROM Spells WHERE :col LIKE :str ORDER BY :sort LIMIT 10 OFFSET :offset");
    $stmt->bindParam(":col",$_POST['col']);
    $stmt->bindParam(":str",$str);
    $stmt->bindParam(":offset",$offset, PDO::PARAM_INT);
    $stmt->bindParam(":sort",$_POST['sort']);

    $stmt->execute();
}
catch (PDOException $e) {
    echo "MySQL error: " . $e->getMessage() . "<br/>";
    die();
}

データベースへの接続は正常に機能し、エラーは発生しません。%検索フィールドに入力すると(クエリのように出力され%%%ます)、期待どおりに結果が返されます。

phpMyAdmin で同じクエリを試みましたが、問題なく動作します。以前は正常に機能していた非推奨の関数からこのスクリプトを更新していますmysql_*

以前の非推奨のクエリの例:

$sql = "SELECT * FROM Spells WHERE " . $col . " LIKE '%" . $str . "%' ORDER BY " . $sort . " LIMIT 10 OFFSET " . $offset;

すでに述べたように、私はこのサイトでも検索を行っており、解決策を見つけようとしています。MySQL でさえ、何も機能していませんCONCAT('%',:str,'%')

これをテストしているサーバーは、php バージョン 5.3.17 で実行されています。

私の質問は、私が明確にしなかった場合に備えて、ここで何が間違っているのですか? 疑問に思っている人のために (これを入れたと思っていたのに、どうやら入れていなかったようです)、エラーメッセージはありません。

4

1 に答える 1

2

問題は、識別子の代わりにパラメーターを使用できないことです。これは、列またはテーブル名をパラメータ化できないことを意味します。

クエリが実行されたときの基本的な外観は次のとおりです。

SELECT * FROM Spells WHERE 'some_column_name' LIKE '%something%'...

検索と並べ替えの列名のホワイトリストを作成し、それらを使用してクエリを作成します。これは非常に簡単な例です

$search = array('col1', 'col2', 'col3');
$defaultSearch = 'col1';

$sort = array('col1', 'col2');
$defaultSort = 'col1';

$col = in_array($_POST['col'], $search) ? $_POST['col'] : $defaultSearch;
$sort = in_array($_POST['sort'], $sort) ? $_POST['sort'] : $defaultSort;

$sql = sprintf('SELECT * FROM Spell WHERE %s LIKE :str ORDER BY %s LIMIT 10 OFFSET :offset',
    $col, $sort);

$stmt = $dbh->prepare($sql);
// bind :str and :offset, and so on
于 2012-10-17T01:58:58.453 に答える