web-dev-qa-db-ja.com

空の結果を確認する(php、pdo、mysql)

ここで間違っていることを誰か教えてもらえますか?私は単純にテーブルから結果を取得し、それらを配列に追加しています。空の結果を確認するまで、すべてが期待どおりに動作します...

これは一致を取得し、配列に追加し、期待どおりに結果をエコーし​​ます。

$today = date('Y-m-d', strtotime('now'));

$sth = $db->prepare("SELECT id_email FROM db WHERE hardcopy = '1' AND hardcopy_date <= :today AND hardcopy_sent = '0' ORDER BY id_email ASC");

$sth->bindParam(':today',$today, PDO::PARAM_STR);

if(!$sth->execute()) {
    $db = null ;
    exit();
}

while ($row = $sth->fetch(PDO::FETCH_ASSOC)) {
    $this->id_email[] = $row['id_email'] ;
    echo $row['id_email'] ;
}

$db = null ;
return true ;

空の結果を確認しようとすると、コードは 'empty'を返しますが、一致する結果は得られません。

$today = date('Y-m-d', strtotime('now'));

$sth = $db->prepare("SELECT id_email FROM db WHERE hardcopy = '1' AND hardcopy_date <= :today AND hardcopy_sent = '0' ORDER BY id_email ASC");

$sth->bindParam(':today',$today, PDO::PARAM_STR);

if(!$sth->execute()) {
    $db = null ;
    exit();
}

if ($sth->fetchColumn()) {
    echo 'not empty';
    while ($row = $sth->fetch(PDO::FETCH_ASSOC)) {
        $this->id_email[] = $row['id_email'] ;
        echo $row['id_email'] ;
    }
    $db = null ;
    return true ;
}
echo 'empty';
$db = null ;
return false ;

いつものように、どんな助けも大歓迎です。ありがとう!

46
canoebrain

$sth->fetchColumn()を実行すると、結果の行が破棄されます。これは、結果があるかどうかを確認する方法ではありません。あなたがやる

if ($sth->rowCount() > 0) {
  ... got results ...
} else {
   echo 'nothing';
}

関連ドキュメントはこちら: http://php.net/manual/en/pdostatement.rowcount.php

88
Marc B

FetchAll()を使用するオプションがある場合、返される行がない場合は空の配列になります。

count($sql->fetchAll(PDO::FETCH_ASSOC))

返された行の数を返します。

10
josh123a123
$sql = $dbh->prepare("SELECT * from member WHERE member_email = '$username' AND member_password = '$password'");

$sql->execute();

$fetch = $sql->fetch(PDO::FETCH_ASSOC);

// if not empty result
if (is_array($fetch))  {
    $_SESSION["userMember"] = $fetch["username"];
    $_SESSION["password"] = $fetch["password"];
    echo 'yes this member is registered'; 
}else {
    echo 'empty result!';
}
8
Mahmoud Ali

これは古いスレッドですが、最近これに対処しなければならなかったので、私は重く考えていました。

SELECT文には移植性がないため、rowCountを使用しないでください。 isset関数を使用して、selectステートメントが機能したかどうかをテストします。

$today = date('Y-m-d', strtotime('now'));

$sth = $db->prepare("SELECT id_email FROM db WHERE hardcopy = '1' AND hardcopy_date <= :today AND hardcopy_sent = '0' ORDER BY id_email ASC");

//I would usually put this all in a try/catch block, but kept it the same for continuity
if(!$sth->execute(array(':today'=>$today))) 
{
    $db = null ;
    exit();
}

$result = $sth->fetch(PDO::FETCH_OBJ)

if(!isset($result->id_email))
{
    echo "empty";
}
else
{
    echo "not empty, value is $result->id_email";
}

$db = null;

もちろん、これは、データセットをループするときに発生する可能性があるため、単一の結果に対してのみです。

7
stubsthewizard

私がここで間違っているのは何ですか?

ほとんど全て。

$today = date('Y-m-d'); // no need for strtotime

$sth = $db->prepare("SELECT id_email FROM db WHERE hardcopy = '1' AND hardcopy_date <= :today AND hardcopy_sent = '0' ORDER BY id_email ASC");

$sth->bindParam(':today',$today); // no need for PDO::PARAM_STR

$sth->execute(); // no need for if
$this->id_email = $sth->fetchAll(PDO::FETCH_COLUMN); // no need for while

return count($this->id_email); // no need for the everything else

事実上、alwaysフェッチしたデータ(この場合は$this->id_email変数)クエリが何かを返したかどうかを示します。詳しくは私の PDOの記事 をご覧ください。

3

考慮すべきもう1つのアプローチ:

HTMLテーブルまたは他のデータベース依存コンテンツを構築するとき(通常AJAX呼び出しを介して)、マークアップで作業する前にSELECTクエリがデータを返したかどうかを確認するのが好きです。データがある場合は、単に「データが見つかりません...」またはその結果を返します。データがある場合は、先に進み、ヘッダーを作成してコンテンツをループします。データベースをMySQLに制限する可能性が高い場合でも、私は移植可能なコードを書くことを好むので、rowCount()は出ていませんが、代わりに列カウントをチェックします。

$stmt->execute();
$cols = $stmt->columnCount(); // no columns == no result set
if ($cols > 0) {
    // non-repetitive markup code here
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
1
lango

Marc Bの助けのおかげで、ここに私のために働いたものがあります(注:MarcのrowCount()の提案もうまくいく可能性がありますが、別のDBで動作しないか、何かが私のもので変更された場合、私は不安でした...また、彼のselect count(*)の提案も機能しますが、とにかくデータが存在する場合はデータを取得することになったので、私はこのようにした)

$today = date('Y-m-d', strtotime('now'));

$sth = $db->prepare("SELECT id_email FROM db WHERE hardcopy = '1' AND hardcopy_date <= :today AND hardcopy_sent = '0' ORDER BY id_email ASC");

$sth->bindParam(':today',$today, PDO::PARAM_STR);

if(!$sth->execute()) {
    $db = null ;
    exit();
}

while ($row = $sth->fetch(PDO::FETCH_ASSOC)) {
    $this->id_email[] = $row['id_email'] ;
    echo $row['id_email'] ;
}
$db = null ;

if (count($this->id_email) > 0) {
    echo 'not empty';
    return true ;
}
echo 'empty';
return false ;
0
canoebrain