我有一些从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);
}
});
答案 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使用数组/括号表示法。