1

jquery から変数を受け取り、DB にクエリを実行する php があります。最近、SQL インジェクションなどを防ぐために PDO を使用する必要があることを知ったので、クエリを PDO に変換しようとしています。とにかく私はphpに不慣れなので、これは思ったよりも難しいことがわかりました(私が読んだすべての記事は非常に簡単に見えましたが)... DB接続は機能しており'name'、正しい値を受け取っていますが、以前のようなページ。.を含むループに関係していると思いますjson_encode。以下は私の古いphpで、それをPDO形式に変換しようとしています。

古い PHP:

$dbstylename = $_POST['name'];
$result = mysql_query("SELECT * FROM style where stylename like '$dbstylename'");
$array = mysql_fetch_row($result);

echo json_encode($array);

mysql_close($con);
?>

新しい PDO 試行:

<?php

include 'db.php';

try {
    $dbConnection = new PDO('mysql:host=$dbhost;dbname=$dbhost;', $user, $pass);
    $dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    #Prepare the query
    $dbstylename = $_POST['name'];
    $result = $dbConnection->prepare('SELECT * FROM style where stylename like :dbstylename');
    #bind
    $result->bindParam(':dbstylename', $dbstylename, PDO::PARAM_STR);
    #execute
    if ($result->execute(array($dbstylename))) {
        while ($row = $result->fetch()) {
            json_encode($row);
        }
    }
} catch(PDOException $e) {
    echo 'ERROR: ' . $e->getMessage();
}
?>

================更新==============================

@MadaraUchihaの優れた回答とフォローアップのヘルプに加えて、jQueryをこれから変更する必要がありました(PDOの前に機能していました):

$.ajax({
    url: '../test.php',
    type: 'POST',
    data: {'name' : target},
    dataType: 'json',
    success: function(data) {
        var styleid = data[0];
        var stylename = data[1];
        var stylecss = data[2];
        $('#codeTest').html("<b>id: </b><br />"+styleid+"<br /><b> stylename: </b><br />"+stylename+"<br /><b> stylecss: </b><br />"+stylecss);
    }
});

これに:

$.ajax({
    url: '../test.php',
    type: 'POST',
    data: {'name' : target},
    dataType: 'json',
    success: function(data) {
        var styleid = data.styleid;
        var stylename = data.stylename;
        var stylecss = data.stylecss;
        $('#codeTest').html("<b>id: </b><br />"+styleid+"<br /><b> stylename: </b><br />"+stylename+"<br /><b> stylecss: </b><br />"+stylecss);
    }
});
4

3 に答える 3

3

まず始めに、古い ext/mysql から PDO への改善に取り組んでいるのは素晴らしいことです。素晴らしい!

まず、エラーをチェックする必要はありません。に設定PDO::ATTR_ERRMODEしたのでPDO::ERRMODE_EXCEPTION、エラーが発生すると例外がスローされます。だからあなたのif文

if ($result->execute(array($dbstylename))) {

冗長です。

第 2 に、既にパラメーターを でバインドしているbindParamため、配列でパラメーターを再度渡すことも冗長です。

最後に、1 つの結果のみを期待する場合は、whileループを削除するか、または を使用$result->fetchAll(PDO::FETCH_ASSOC)してすべての結果を 1 つの配列にフェッチすることもできます。


実際の問題としてjson_encode()、最初のスクリプトで使用していたように、 の結果をエコーし​​ていません (結果に対して何もせずに呼び出しているだけです)。

上記のすべてを考慮して、コードを修正しました。

<?php

include 'db.php';

try {

    $dbConnection = new PDO('mysql:host=$dbhost;dbname=$dbhost;', $user, $pass);
    $dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    #Prepare the query
    $dbstylename = $_POST['name'];
    $result = $dbConnection->prepare('SELECT * FROM style where stylename like :dbstylename');
    #bind
    $result->bindParam(':dbstylename', $dbstylename, PDO::PARAM_STR);
    #execute
    $result->execute();
    $row = $result->fetch(PDO::FETCH_ASSOC);
    echo json_encode($row);

} catch(PDOException $e) {
    echo 'ERROR: ' . $e->getMessage();
}
?>

それ以外は、あなたの PDO コードは完璧です。それを維持してください!

于 2012-11-19T20:21:03.427 に答える
1

また、配列要素を持つ json エンコードされた文字列のシーケンスは、ホール json エンコードされた配列と等しくありません。while ループを次のように置き換えます

echo json_encode($result->fetchAll());
于 2012-11-19T20:26:37.487 に答える
0

元の投稿で、jQuery の変更について言及しました。ただし、マニュアルで PDO についてもう少し詳しく調べたところ (具体的にはhttp://www.php.net/manual/en/pdostatement.fetch.php$row = $result->fetch(PDO::FETCH_ASSOC); )、 @MadaraUchiha の回答を変更した場合、$row = $result->fetch(PDO::FETCH_BOTH);維持できることがわかりました。配列/ブラケット表記を使用した私の元のjQuery。

于 2012-11-21T20:52:57.963 に答える