2012-08-15 14 views
21

行が存在しない場合は条件を設定したいと思っています。PDO/PHP - 行が存在するかどうかを調べる

$stmt = $conn->prepare('SELECT * FROM table WHERE ID=?'); 
$stmt->bindParam(1, $_GET['id'], PDO::PARAM_INT); 
$stmt->execute(); 
$row = $stmt->fetch(PDO::FETCH_ASSOC); 

if (count($row) == 0)if($stmt->rowCount() < 0)を試みたが、それらのどれも機能しません。

+1

[ '$ stmt->をrowCount()'](http://php.net/manual/en/pdostatement.rowcount.php)すべきです* '0'より小さいかどうかをチェックすることは役に立ちません - * '0'または* '1'より小さい* – DaveRandom

+1

@DaveRandom docsはすべてのドライバではないことを示しています'SELECT'が' rowCount'を返すようにします。どうやら実際には 'columnCount'を使っているはずです。 –

+0

@arxanas公正な点ですが、行数を取得するために2つのクエリを率直に実行しています(マニュアルが示唆しているように)のはすごい解決策です。 '$ rowCount = count($ rows = $ stmt-> fetchAll())'はそれより優れた解決策であり、行がない場合でも '0'を返します。 – DaveRandom

答えて

53

戻り値を直接確認することができます。

$stmt = $conn->prepare('SELECT * FROM table WHERE ID=?'); 
$stmt->bindParam(1, $_GET['id'], PDO::PARAM_INT); 
$stmt->execute(); 
$row = $stmt->fetch(PDO::FETCH_ASSOC); 

if(! $row) 
{ 
    die('nothing found'); 
} 

/* 
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC); // Same here 
if(! $rows) 
{ 
    die('nothing found'); 
} 
*/ 

あなたは、単にMySQLを返す必要がありを取得せずにをチェックについて尋ねている場合1COUNT()コマンドを使用しますか)。

$sql = 'SELECT 1 from table WHERE id = ? LIMIT 1'; 
//$sql = 'SELECT COUNT(*) from table WHERE param = ?'; // for checking >1 records 
$stmt = $conn->prepare($sql); 
$stmt->bindParam(1, $_GET['id'], PDO::PARAM_INT); 
$stmt->execute(); 

if($stmt->fetchColumn()) die('found'); 
+8

あなたの解決策はうまくいくが、 'PDOStatement :: fetch'が配列を返すのは当てはまりません。それ以上の行がない場合は、次の結果を返し、 'false'を返します。それで空の結果セットがあるときに '$ row'がfalseになるのです。 –

+0

@ matthias.p、訂正していただきありがとうございます。私は 'fetch()'を使用していないので、空の配列に関する私の文は 'fetchAll()'からのものでした。 – Xeoncross

+0

ありがとう!それが私が探していたものです。私は結果が配列で返されていることを知っていたので、関数を使うか、別のSQLクエリを実行する代わりに変数をチェックするのが最良の方法だと思っていました。 – xperator

7
if($stmt->rowCount() == 0) 

行の数がすべてでいずれにしてもゼロより小さくすることはできませんから、正常に動作する必要があります。

マニュアルから:ほとんどのデータベースでは

PDOStatement::rowCount()SELECT文によって影響を受けた行の 数を返しません。その代わり、 返される行数を取得するために PDOStatement::fetchColumn()を使用し、その後、あなたの意図SELECT文と同じ 述語でSELECT COUNT(*)文を発行する PDO::query()を使用しています。これにより、アプリケーションは正しい処理を実行できます。

私はそれを読むことをお勧めしますhere。私は私のオブジェクトクラスで使用するものHERESに

+1

すでにarxanasとしては、 'rowCount'を使ってselect文で返された行を検出してはいけません。 –

+0

MySQLを使用している場合は問題ありませんが、それ以外の場合は完全に正しいです。 – DannyCruzeira

+2

ああ、私は間違ったサインを使っていました。私はそれがより大きいときに存在すれば、私はちょうど0よりも小さくするべきだと思った!笑 – xperator

0

function exists_by_id() { 
    // check if object exists by id 
    $stm = DB::$pdo->prepare('select count(*) from `table` where `column`=:column'); 
    $stm->bindParam(':column', $this->column); 
    $stm->execute(); 
    $res = $stm->fetchColumn(); 

    if ($res > 0) { 
     return true; 
    } 
    else { 
     return false; 
    } 
} 
関連する問題