【问题标题】:PDO fetchAll, fetch and its usage with decoded JSON arrayPDO fetchAll、fetch 及其与解码的 JSON 数组的用法
【发布时间】:2013-12-27 00:42:42
【问题描述】:

我无法让这个函数使用解码的 json 数组运行。 例如,我尝试使用 PDO 准备语句获取一个数组: *注意:$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是:

function showListOfPaginatedQuestions(jsonData) {
    alert('pagED RAN!');
    alert(jsonData);
    console.log(jsonData);
    var table = '<table width="600" cellpadding="5" class="table table-hover table-bordered"><thead><tr><th scope="col">Category</th><th scope="col">Type</th><th scope="col">Question</th><th scope="col">Question Description</th><th scope="col"></th></tr></thead><tbody>';

    $.each( jsonData, function( index, user){     
        table += '<tr>';
        table += '<td class="edit" field="qcat_id" user_id="'+user.quest_id+'">'+user.qcat_name+'</td>';
});
$('div#content').html(table);
}

谢谢

【问题讨论】:

  • 如果是startper_page的对象,你可以试试var_dump($user),否则就没有问题了。
  • 你永远不应该假设你的查询有效。您应该 a) 在调用 prepare() 后验证 $sth 是否确实包含有效的 PDOStatement 对象 b) 在调用 execute() 时验证 fetchAll() 不返回 false c) 在代码返回时处理所有错误情况不要走上幸福的道路 - 记录错误,以便您了解问题所在。
  • 哼...真的可以绑定'吗?到 SQL 的 LIMIT 参数?我认为这仅适用于变量。如果这是真的,那么您的查询不可能发回带有两个的任何数据?代替 LIMIT 分隔符

标签: javascript php pdo json


【解决方案1】:

关于准备好的语句,您必须了解一些事情。性格 '?'不是简单的占位符,它指的是查询的实际参数,例如条件或值。重点是,当 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 中的 $whatever 那样的变量,它们不会简单地被您赋予它们的任何值替换(那时 sql 注入仍然是一个大问题) SQL 将它们视为参数,并且它们具有特定的位置你可以使用它们,还有 LIMIT ?,?可悲的是,不是其中之一: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;
}

【讨论】:

  • 你刚刚解决了我 6 个小时的挫败问题......真诚地感谢你!顺便说一句,您是如何对 PDO 有如此深刻的理解的?我应该从哪里开始更好地理解它?有什么好的来源吗?我的意思是,比php官网的pdo文档好?
  • 我阅读了 mysql 开发人员的 PDO 教程wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers 它确实包含有关准备语句、使用它们、错误管理等的所有基本准则。也可以尝试:)
  • 感谢参考!赞赏:)
猜你喜欢
  • 2014-11-05
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
  • 2018-06-22
  • 2013-08-20
  • 2014-01-23
  • 2014-11-19
  • 1970-01-01
相关资源
最近更新 更多