1

我有一些从 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();
}
?>

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

除了@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_ERRMODEPDO::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 代码完美无瑕,请继续努力!

于 2012-11-19T20:21:03.427 回答
1

带有数组元素的json编码字符串序列也不等于hole 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 回答