ここで間違っていることを誰か教えてもらえますか?私は単純にテーブルから結果を取得し、それらを配列に追加しています。空の結果を確認するまで、すべてが期待どおりに動作します...
これは一致を取得し、配列に追加し、期待どおりに結果をエコーします。
$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 ;
いつものように、どんな助けも大歓迎です。ありがとう!
$sth->fetchColumn()
を実行すると、結果の行が破棄されます。これは、結果があるかどうかを確認する方法ではありません。あなたがやる
if ($sth->rowCount() > 0) {
... got results ...
} else {
echo 'nothing';
}
関連ドキュメントはこちら: http://php.net/manual/en/pdostatement.rowcount.php
FetchAll()を使用するオプションがある場合、返される行がない場合は空の配列になります。
count($sql->fetchAll(PDO::FETCH_ASSOC))
返された行の数を返します。
$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!';
}
これは古いスレッドですが、最近これに対処しなければならなかったので、私は重く考えていました。
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;
もちろん、これは、データセットをループするときに発生する可能性があるため、単一の結果に対してのみです。
私がここで間違っているのは何ですか?
ほとんど全て。
$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の記事 をご覧ください。
考慮すべきもう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)) {
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 ;