0

次のコードは、同じような電話番号を持つ人を返します。完全に機能しますが、番号がない場合でも、この関数は情報を返します。つまり、同じような番号を持つ人が他にいない場合、特定のボックスを非表示にするチェックボックスをオンにできません。

関数

function getothers($tid,$criteria,$telephone,$telephone2,$elector){
            global $dbh;
            $tid = '-TID'.$tid;
             $sql = "SELECT * FROM electors WHERE ((telephone > 0 AND telephone IN ('$telephone','$telephone2'))  OR (telephone2 > 0 AND telephone2 IN ('$telephone','$telephone2'))) $criteria AND records NOT RLIKE '$tid' AND ID != '$elector'  LIMIT 10";
            $result = $dbh->query($sql);
            return $result;
        }

呼び出し

<?php $others = getothers($post['TID'],$post['criteria'],$elector['telephone'],$elector['telephone2'],$elector['ID']); ?>

動作しないライン

<?php if(!$others){?> 

$others結果がないにもかかわらず、まだ何かが含まれています。yPDOの行が欠落している可能性があると思います。何か案は?

print_r

PDOStatement Object ( [queryString] => SELECT * FROM electors WHERE ((telephone > 0 AND telephone IN ('02085414023 ','')) OR (telephone2 > 0 AND telephone2 IN ('02085414023 ',''))) AND (this_vi_street = '' AND this_vi_telephone = '') AND (mosaic IN ('A01','A02','A03','A04','A05','A07','B11','C15','C16','C17','C18','H46','J52','K57','K58','K60') OR last_vi IN ('C','P')) AND postal_vote != 1 AND records NOT RLIKE '-TID1' AND ID != '13' LIMIT 10 )
4

2 に答える 2

1

コメントによると、準備されたステートメントを使用したバージョン:

function getothers($tid, $criteria, $telephone, $telephone2, $elector) {
    global $dbh;

    $stmt = $dbh->prepare("SELECT *
                             FROM electors
                            WHERE ((telephone > 0 AND telephone IN (:telephone, :telephone2))
                                   OR (telephone2 > 0 AND telephone2 IN (:telephone, :telephone2)))
                                  $criteria
                                  AND records NOT RLIKE :tid
                                  AND ID != :elector
                            LIMIT 10";

    $stmt->execute(array(
        ':telephone'  => $telephone,
        ':telephone2' => $telephone2,
        ':tid'        => '-TID' . $tid,
        ':elector'    => $elector
    ));

    return $stmt->fetchAll();
}

このコードにはまだいくつかの悪い点があります。

  • DB接続を取得するために使用globalします。これは全体的に悪いアプリケーション構造です。おそらく、クラスを使用するか$dbh、通常の引数として関数に渡す必要があります。
  • $criteria準備済みステートメントに連結します。SQL ブロック全体を連結しないとクエリを準備できないような動的な条件が本当に必要ですか?
  • 関数の戻り値の実際の問題に必ずしも対処するとは限りません。
于 2012-07-02T13:31:54.473 に答える
0

たぶん次のようなことをします

$result = $dbh->query($sql);
if($result->rowCount()>0)
{
return $result;
}

return false;
于 2012-07-02T13:02:36.287 に答える