【问题标题】:PDO prepare statement not returning results [closed]PDO准备语句不返回结果[关闭]
【发布时间】:2015-01-09 23:17:10
【问题描述】:

谁能给我解释一下为什么下面的function1中的prepare语句没有返回结果,但是function2中的查询语句确实返回了结果(12)。

class Test
{   function function1($db)
    {
        //date_default_timezone_set('America/Chicago'); // CDT
        $month = "January";  //date('F');
        $day = "9";  //date('j');
        // let's query for died today
        $stm = $db->prepare("SELECT * FROM graves WHERE dod_month = ? AND dod_day = ? ORDER BY  dod_year DESC");
        $stm->bindValue(1, $month, PDO::PARAM_STR);
        $stm->bindValue(2, $day, PDO::PARAM_STR); 
      // $stm = $db->query("SELECT * FROM graves WHERE dod_month = 'January' AND dod_day = '9' ORDER BY  dod_year DESC");
        $affected_rows = $stm->rowCount();

        $stm->execute();

        var_dump($affected_rows,$month,$day);
    }

function function2($db)
{
        //date_default_timezone_set('America/Chicago'); // CDT
        //$month = "January";  //date('F');
        //$day = "9";  //date('j');
        // let's query for died today
       // $stm = $db->prepare("SELECT * FROM graves WHERE dod_month = ? AND dod_day = ? ORDER BY  dod_year DESC");
       // $stm->bindValue(1, $month, PDO::PARAM_STR);
        //$stm->bindValue(2, $day, PDO::PARAM_STR); 
        $stm = $db->query("SELECT * FROM graves WHERE dod_month = 'January' AND dod_day = '9' ORDER BY  dod_year DESC");
        $affected_rows = $stm->rowCount();

        $stm->execute();

        var_dump($affected_rows);
    }        


}

var_dump 的结果是:

int 0

字符串“一月”(长度=7)

字符串“9”(长度=1)

int 12

【问题讨论】:

    标签: php pdo


    【解决方案1】:

    因为在第一个函数中,实际执行语句的行是在得到行数之后执行的。

    【讨论】:

    • 已执行。 $stm->execute() 除了 OP 在执行语句之前请求受影响的行。所以它返回 0。
    • 谢谢,这不是我第一次这样做了......知道它必须是简单的,因为过去曾有类似的代码。
    【解决方案2】:

    尝试将第一个查询中的语句顺序颠倒如下:

    $stm->execute();    
    $affected_rows = $stm->rowCount();
    

    【讨论】:

    • 是的,就是这样...谢谢。我的经验是查询语句会返回结果而不发出执行,而在function2中不需要执行
    【解决方案3】:

    根据文档:

    PDOStatement::rowCount() 返回受 相应的最后执行的 DELETE、INSERT 或 UPDATE 语句 PDOStatement 对象。

    如果关联的 PDOStatement 执行的最后一条 SQL 语句是 SELECT 语句,某些数据库可能会返回行数 由该语句返回。但是,不能保证这种行为 适用于所有数据库,不应依赖于便携式 应用程序。

    您可以通过调用SELECT COUNT(*) FROM graves WHERE dod_month = 'January' AND dod_day = '9' ORDER BY dod_year DESC 来简单地查询行数

    【讨论】:

      猜你喜欢
      • 2014-09-15
      • 1970-01-01
      • 1970-01-01
      • 2015-07-13
      • 2014-08-04
      • 2021-08-02
      • 1970-01-01
      相关资源
      最近更新 更多