2011-12-08 14 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(ゼロ)を出力

がどのように私はここで間違っているものを見つけることができますか? docsから

+0

少なくともdownvoteを行う場合は、少なくとも理由を書きます。はい、私は、SELECT文ではうまくいかないことをマニュアルに明記していますが、それは瞬時に忘れたものでした。 – Steven

答えて

2

PDO :: execの()SELECTステートメントからの結果を返しません。

そしてyoureのPDO::execが返さない何かである、影響を受けた行がない(何の挿入、削除、または更新)何かを変更しないではないからです。

データには準備済みの文またはPDO::queryを使用します。行数が必要な場合は、選択した行数を使用します。あなたが選択

ドキュメントをやっているので、

+1

ああ、あなたが正しいです。私はPDO :: exec()が一般的なクエリのためだと考えました。他のコードでは、私はちょうどspecdialの挿入、削除と更新を使用しています。 – Steven

0

exec文によって影響を受ける行の数を返して、あなたのケースで
は、ゼロである: - http://php.net/manual/en/pdo.exec.phpあなたのSQLが適切にPDOを使用していない

前回述べたような方法、
は、SQLインジェクションのための脆弱性があり、
parameters binding

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では使用していません。私はあなたがここで示唆した方法を使用して終了しました - それは私がコード内の他の文字列で行ったことです。今の暑さの中で誰かが忘れてしまいます:) – Steven

関連する問題