使用PDO时问题爆炸了一个字符串数组

时间:2012-12-27 22:25:19

标签: php pdo implode

问题是,当我执行var_dump()时,我收到了所需的结果,但是当PDO处理时,它跳过其中一个数组条目,似乎我没有收到所需的结果。

  $bd = $userObj->fetchPanel(array('category_id'=>$cdata['id']));
                //echo '<pre>'; var_dump($bd); echo '</pre>';die;
                $barr = array();
                if(count($bd) > 0){
                foreach($bd as $bval){
                    $barr[] = $bval['id'];              
                }}

               echo '<pre>'; var_dump(implode(',', $barr)); echo '</pre>';

var_dump()返回 - string(7) "270,498" - 这就是所需要的。

                $bragdataarr = $db->dbh->prepare("SELECT p.id,p.brag,p.brag_desc,p.brag_id,p.user_id, p.panel_id,p.domainurl,p.type,p.price FROM ".USERS_BRAG." as p left join ".USERS." as u on p.user_id=u.id WHERE u.status !=0 AND p.panel_id IN (:imp) AND p.status = :status ORDER BY p.id DESC LIMIT :lim, :page");

                echo '<pre>'; var_dump(implode(',', $barr)); echo '</pre>';

var_dump()返回 - string(7) "270,498" - 这就是所需要的。

                $imp = implode(',',$barr);

                echo '<pre>'; var_dump($imp); echo '</pre>';

var_dump()返回 - string(7) "270,498" - 这就是所需要的。

                $brgdataarr->bindValue(':imp',$imp ? $imp : "",PDO::PARAM_STR);

echo '<pre>'; var_dump($bragdataarr->bindValue(':imp',$imp ? $imp : "",PDO::PARAM_STR)); echo '</pre>';

var_dump()返回 - bool(true) - 这是您想要的。但是,显示的只是字符串'270'而不是'270,498'。为什么会这样?

                $brgdataarr->bindValue(':status',1, PDO::PARAM_INT);                
                $brgdataarr->bindValue(':lim',$limit_start, PDO::PARAM_INT);
                $brgdataarr->bindValue(':page',$page_records, PDO::PARAM_INT);                  
                $brgdataarr->execute();                
                $brgdataarr = $brgdataarr->fetchAll(PDO::FETCH_ASSOC);

从我的故障排除中,我发现只有当我使用bindValue()进行内爆时才会发生这种情况。如果我在SQL语句中包含implode,则implode可以正常工作,但是当implode遇到它时我会收到空​​字符串错误。

示例:

 $brgdataarr = $db->dbh->prepare("SELECT p.id,p.brag,p.brag_desc,p.brag_id,p.user_id, p.panel_id,p.domainurl,p.type,p.price FROM ".USERS_BRAG." as p left join ".USERS." as u on p.user_id=u.id WHERE u.status !=0 AND p.panel_id IN (".implode(',',$barr).") AND p.status = :status ORDER BY p.id DESC LIMIT :lim, :page");

1 个答案:

答案 0 :(得分:0)

我认为这是因为围绕整数集的引号。此外,您的LIMIT语法可能会出现拼写错误。让我们使用标准LIMIT:limit OFFSET:offset synthax,更易读并且与每个数据库兼容。

$imp = $imp? implode(',',array_map($imp,array(PDO,'quote'))):"'-1'";

$brgdataarr = $db->dbh->prepare("SELECT p.id,p.brag,p.brag_desc,p.brag_id,p.user_id, p.panel_id,p.domainurl,p.type,p.price FROM ".USERS_BRAG." as p left join ".USERS." as u on p.user_id=u.id WHERE u.status !=0 AND p.panel_id IN (".$imp.") AND p.status = :status ORDER BY p.id DESC LIMIT :lim OFFSET :page");