PDO查询返回行时返回0

时间:2011-12-08 18:25:14

标签: php mysql

我正在使用PHP PDO来运行查询。我有以下功能:

protected function isStoreRegistered($name, $street1 ,$city, $country_id, $id) {

if($id == '0') {
  $sql = " SELECT a.name, b.street1, b.city, c.id
           FROM tablea a
           LEFT JOIN tableb b ON a.fk_addressID = b.id
           LEFT JOIN tablec c ON b.fk_countryID = c.id
           WHERE a.name = '$name'
           AND b.street1 = '$street1'
           AND b.city = '$city'
           AND b.fk_countryID = '$country_id'";
  $result = $this->db->exec($sql);
} else {
  // some other query
}

return $result;     

}

发送给MySQL的查询如下所示:

 SELECT a.name, b.street1, b.city, c.id
 FROM sl_store a
 LEFT JOIN sl_address b ON a.fk_addressID = b.id
 LEFT JOIN sl_country c ON b.fk_countryID = c.id
 WHERE a.name = 'test store'
 AND b.street1 = 'Weselsgate 2'
 AND b.city = 'Oslo'
 AND b.fk_countryID = 'NO'

在Toad中运行此查询,返回1行。

但如果我执行print_r(result),则输出0(零)

我怎样才能找出这里有什么问题?

3 个答案:

答案 0 :(得分:2)

来自docs

  

PDO :: exec()不返回SELECT语句的结果。

由于您没有修改任何内容(没有插入,删除或更新),因此没有受影响的行,这是PDO::exec返回的行。

如果您希望数据使用预先准备的语句或PDO::query。如果您想要行数,请在您的选择中使用计数。

答案 1 :(得分:1)

如前所述和手册中所述,PDO::exec()不会返回SELECT语句的结果。相反,你应该尝试以下(注意参数绑定):

protected function isStoreRegistered($name, $street1 ,$city, $country_id, $id) {

if ($id == '0') {
  $sql = " SELECT a.name, b.street1, b.city, c.id
           FROM tablea a
           LEFT JOIN tableb b ON a.fk_addressID = b.id
           LEFT JOIN tablec c ON b.fk_countryID = c.id
           WHERE a.name = :name
           AND b.street1 = :street
           AND b.city = :city
           AND b.fk_countryID = :country";
  $stmt = $this->db->prepare( $sql );
  $vars = array(
    'name'      => $name,
    'street'    => $street1,
    'city'      => $city,
    'country'   => $country_id,
  );
  $result = $stmt->execute( $vars );
} else {
  // some other query
}

return $result;

答案 2 :(得分:0)

exec返回受语句影响的行数,
在你的情况下,因为你正在做一个选择

是零

docs: - http://php.net/manual/en/pdo.exec.php

你的sql没有以正确的方式使用PDO,
易受SQL注入攻击,
花了一些时间阅读parameters binding