将PHP查询转换为PDO查询

时间:2012-11-19 20:16:43

标签: php pdo

我有一些从jquery接收变量并查询数据库的php。我最近了解到我需要使用PDO来防止SQL注入,所以我一直试图将我的查询转换为它。我是php的新手,所以这比我想象的要困难(尽管我读过的所有文章看起来都很简单)......数据库连接正常,'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();
}
?>

===== UPDATE ==============================

除了@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);
    }
});

3 个答案:

答案 0 :(得分:3)

让我从这开始,很高兴你正在努力改进旧的ext / mysql到PDO。做得好!

嗯,首先,您不需要检查错误!由于您已将PDO::ATTR_ERRMODE设置为PDO::ERRMODE_EXCEPTION,因此如果出现错误,则会抛出异常!所以你的if语句

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

多余。

其次,由于您已经将参数绑定到bindParam,因此使用该数组再次传递该参数也是多余的。

最后,如果您只期望一个结果,则可以删除while循环,甚至使用$result->fetchAll(PDO::FETCH_ASSOC)将所有结果提取到单个数组中。


现在对于真正的问题,你没有回应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代码是完美的,坚持下去!

答案 1 :(得分:1)

具有数组元素的json编码字符串序列也不等于孔json编码数组。用

替换while循环
echo json_encode($result->fetchAll());

答案 2 :(得分: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使用数组/括号表示法。