54

私はここで何が間違っているのですか?テーブルから結果を取得し、それらを配列に追加するだけです。空の結果を確認するまで、すべてが期待どおりに機能します...

これにより一致が取得され、配列に追加され、期待どおりに結果がエコーされます。

$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;

空の結果をチェックしようとすると、コードは「空」を返しますが、一致する結果が得られなくなります。

$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;
4

8 に答える 8

102

あなたがそうするとき、あなたは結果行を捨てています$sth->fetchColumn()。それはあなたが結果があるかどうかをチェックする方法ではありません。あなたがやる

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

関連するドキュメントは次のとおりです:PDOStatement :: rowCount

于 2012-11-20T17:01:28.260 に答える
14

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

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

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

于 2016-05-16T14:40:22.587 に答える
11

移植性がないため、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 I 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;

もちろん、データセットをループする場合と同様に、これは 1 つの結果のみを対象としています。

最近これに対処しなければならなかったので、私は検討すると思いました。

于 2014-12-02T22:03:58.967 に答える
3

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

ほとんど全部。

$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

事実上、取得したデータ (この場合は変数) を常に$this->id_email保持して、クエリが何かを返したかどうかを判断します。詳しくはPDO に関する私の記事を参照してください

于 2016-05-16T15:03:44.403 に答える
2

考慮すべきもう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)) {
于 2015-05-31T09:40:32.443 に答える
0

Marc B の助けのおかげで、これが私のために働いたものです (注: Marc の rowCount() 提案も機能する可能性がありますが、別のデータベースで機能しない可能性や、私の何かが変更された場合...また、彼の 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;
于 2012-11-20T17:51:05.743 に答える