Javascript PDO fetchAll、fetch及其在解码JSON数组中的使用

Javascript PDO fetchAll、fetch及其在解码JSON数组中的使用,javascript,php,pdo,json,Javascript,Php,Pdo,Json,我无法使用解码的json数组运行此函数。 例如,我尝试使用PDO prepared语句获取数组: *注意:$user与解码的json数组一起传递 public function get_pagnated_qs($user){ ////////////////////////Actual $sth = $this->dbh->prepare("SELECT a.quest_id, a.quest_title, a.quest_desc, b.q

我无法使用解码的json数组运行此函数。 例如,我尝试使用PDO prepared语句获取数组: *注意:
$user
与解码的json数组一起传递

public function get_pagnated_qs($user){     
        ////////////////////////Actual
        $sth = $this->dbh->prepare("SELECT a.quest_id, a.quest_title, a.quest_desc, b.qcat_name,c.qtype_title FROM eq_question_s AS a INNER JOIN eq_question_category AS b ON a.qcat_id = b.qcat_id INNER JOIN eq_question_type AS c ON a.qtype_id=c.qtype_id ORDER BY quest_id LIMIT ?, ?");
        $sth->execute(array($user->start, $user->per_page));
        $result = json_encode($sth->fetchAll());
        return $result;
}
它不会生成对象(我在JavaScript端回显对象时发现)

另一方面,如果我用实际数字(即
0,3
)替换这两个
,那么一切都会正常工作

函数的作用是将$result作为编码的json返回给客户端,以进行处理并格式化为表

我不知道这段代码是否有任何错误

让我们假设我已经将json数组正确地解码为对象,否则会有太多的代码让人沮丧

也许一些见解会有所帮助,但我不想让任何人失望

接受实际返回和生成表单(函数的一部分)的客户端js是:

函数显示问题列表(jsonData){
警报('pagED RAN!');
警报(jsonData);
console.log(jsonData);
变量表='CategoryTypeQuestionQuestionQuestionDescription';
$.each(jsonData,函数(索引,用户){
表+='';
table+=''+user.qcat_name+'';
});
$('div#content').html(表格);
}

谢谢

关于准备好的语句,您必须了解一些事情。字符“?”不仅仅是占位符,它指的是查询的实际参数,如条件或值。关键是当MySQL准备查询时,它知道当查询实际执行时,条件会转到这里,或者该值将更新为以下内容:

$stmt = $db->prepare("SELECT * FROM table WHERE column=?");
$stmt = $db->prepare("UPDATE table SET column=? WHERE keyColumn=?");
这些都是可以准备和理解的正确陈述。但这些不是简单的变量,例如,你不能这样做:

$stmt = $db->prepare("SELECT * FROM ? Where column='1726'");
它们是参数,不像php中的
$whater
那样是可变的,它们不是简单地被你给它们的任何值所取代(sql注入仍然是一个巨大的问题),sql将它们作为参数对待,它们有特定的位置可以使用,并且限制?,?不是其中之一,遗憾的是:p

在执行以下操作之前,只需将其分配给变量:

public function get_pagnated_qs($user){     
        ////////////////////////Actual
        $start = $user->start;
        $perPage = $user->per_page;
        $sth = $this->dbh->prepare("SELECT a.quest_id, a.quest_title, a.quest_desc, b.qcat_name,c.qtype_title FROM eq_question_s AS a INNER JOIN eq_question_category AS b ON a.qcat_id = b.qcat_id INNER JOIN eq_question_type AS c ON a.qtype_id=c.qtype_id ORDER BY quest_id LIMIT $user, $perPage");
        $sth->execute();
        $result = json_encode($sth->fetchAll());
        return $result;
}

你可以尝试
var\u dump($user)
当这是一个
start
per\u page
的对象时,否则就会出现另一个问题。你不应该仅仅假设你的查询可以工作。你应该a)验证
$sth
prepare()之后实际包含一个有效的
PDOStatement
对象
被调用b)验证
fetchAll()
在调用
execute()
c)处理代码无法正常运行时的所有错误情况-记录错误,以便查看问题所在。哼。。。是否真的可以将“?”绑定到SQL的LIMIT参数?我以为这只是变量。如果这是真的,那么您的查询不可能返回任何包含两个参数的数据?你刚刚解决了我在6个小时内遇到的问题。。。衷心感谢!顺便说一句,你是如何对PDO有如此深刻的理解的?我应该从哪里开始更好地理解它?有什么好的来源吗?我的意思是,比php官方网站上的pdo文档更好?我阅读了mysql开发人员的pdo教程,它真的有关于准备语句、使用语句、错误管理等的所有基本指南。也通过尝试:)谢谢你的参考!感谢:)
public function get_pagnated_qs($user){     
        ////////////////////////Actual
        $start = $user->start;
        $perPage = $user->per_page;
        $sth = $this->dbh->prepare("SELECT a.quest_id, a.quest_title, a.quest_desc, b.qcat_name,c.qtype_title FROM eq_question_s AS a INNER JOIN eq_question_category AS b ON a.qcat_id = b.qcat_id INNER JOIN eq_question_type AS c ON a.qtype_id=c.qtype_id ORDER BY quest_id LIMIT $user, $perPage");
        $sth->execute();
        $result = json_encode($sth->fetchAll());
        return $result;
}