0

私はこれに苦労しており、select ステートメントがレコードを見つけた場合に 1 または true を返そうとしています。その安全性のために、PDO を使用して MSSQL Server と PHP を使用しています。fetchColumn() を使用するのが適切なステートメントではないことはわかっていますが、他のほとんどすべてを試したため、ここであきらめました。

これが私のコードです。

public function activate($email, $email_code) {
        $query = $this->db->prepare("SELECT * FROM users WHERE (email = ? AND email_code = ? AND confirmed = ?)");

        $query->bindValue(1, $email);
        $query->bindValue(2, $email_code);
        $query->bindValue(3, 0);

        try{

            $query->execute();
            $rows = $query->fetchColumn();// HERE I AM NOT SURE WHAT TO USE ??? HELP!
            if($rows == 1){


                $query_2 = $this->db->prepare("UPDATE users SET confirmed =? WHERE email = ?");
                $query_2->bindValue(1, 1);
                $query_2->bindValue(2, $email);             

                $query_2->execute();
                return true;

            }else{
                return false;
            }

        } 
            catch(PDOException $e){
            die($e->getMessage());
        }

    }
4

1 に答える 1

1

現在のコードの問題 (パラメーターのプレースホルダーを引用符で囲むことを除く) は、fetchColumn()おそらく何らかの ID である結果セットの最初の列の値を取得し、その値が 1 に等しくないことです。そのため、常に偽になる。

rowCount()代わりに使用することで修正できたはずですfetchColumn()

$rows = $query->rowCount();

ここで、行が存在するかどうかを確認するために、すべての列で結果セットを実際に取得する必要はありません。を使用するだけCOUNT(*)です。正確に1つの列を含む1つの行が返され、その値は後で取得されますfetchColumn()

変更してみる

$query = $this->db->prepare("SELECT * FROM users WHERE (email = ? AND email_code = ? AND confirmed = ?)");

$query = $this->db->prepare("SELECT COUNT(*) FROM users WHERE (email = ? AND email_code = ? AND confirmed = ?)");

if($rows == 1){

(何らかの理由で重複がある場合の安全のため)

if($rows > 0) {

更新

rowCount()関数のより簡潔なバージョンの影響を受ける行数を返すため、次のUPDATEようになります

public function activate($email, $email_code) {
    $sql = 'UPDATE users 
              SET confirmed = 1 
            WHERE email = ?
              AND email_code = ?
              AND confirmed = 0';

    $rows = 0;

    try{
        $query = $this->db->prepare($sql);

        $query->bindValue(1, $email);
        $query->bindValue(2, $email_code);

        $query->execute();
        $rows = $query->rowCount();
        $query = null;
    } catch(PDOException $e) {
        die($e->getMessage());
    }
    return ($rows > 0);
}

0:および1for confirmedcolumnのような静的な値をバインドする必要はありません。

于 2013-06-14T02:49:02.827 に答える