2011-12-08 196 views
0

我正在使用PHP PDO運行查詢。我有以下功能:當它返回行時,PDO查詢返回0

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' 

Runnign此查詢蟾蜍,返回1行。

但是,如果我做了print_r(result),它輸出0(零)

我怎麼能找出什麼是錯在這裏?

+0

如果你打算downvote,至少寫下原因。是的,我知道它在手冊中明確指出它不適用於'SELECT'語句,但那是我在當下最熱門的事情。 – Steven

回答

2

docs

PDO :: EXEC()不從SELECT語句返回結果。

而且由於您不會修改任何內容(不插入,刪除或更新),因此不會有任何行受到影響,這就是PDO::exec返回的結果。

如果您希望數據使用準備好的語句或PDO::query。如果你想在你選擇的行數中使用計數。

+1

啊,你說得對。我認爲PDO :: exec()用於一般查詢。在其他代碼中,我只是用於特定的插入,刪除和更新。 – Steven

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; 
+0

是的,我使用'PDO:exec'有點快。我一直在使用它多次,但不是普通的SELECT。我最終使用了你在這裏提出的方法 - 這就是我在代碼中的其他方面所做的。 Soemtimes人忘了當下的熱度:) – Steven