PDO准备语句不返回结果

问题描述:

有人可以向我解释为什么函数1中的prepare语句不返回结果,但函数2中的查询语句确实返回结果(12)。PDO准备语句不返回结果

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

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

+1

它被执行。 '$ stm-> execute()'除了OP在execute语句之前请求受影响的行之外。所以它返回0. – Mouser 2015-01-09 23:21:50

+0

@Mouser谢谢! – GolezTrol 2015-01-09 23:25:07

+0

谢谢,这不是我第一次这么做......知道它必须是简单的东西,因为类似的代码在过去有效。 – Artie 2015-01-09 23:56:58

根据文档:

PDOStatement对象:: rowCount时()返回受 最后删除行,插入或更新语句由相应 PDOStatement对象对象所执行的数目。

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

你可以通过调用SELECT COUNT(*) FROM graves WHERE dod_month = 'January' AND dod_day = '9' ORDER BY dod_year DESC

设法扭转在第一个查询语句的顺序如下简单QUERTY行数:

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

是的,这是...谢谢。我的经验是,查询语句将返回结果而不发出执行,并且在函数2中不需要执行 – Artie 2015-01-10 00:03:22