0

特定の列に特定の値を持つ行があるかどうかを確認したい。

多くの列をチェックするので、それぞれの関数を作成するのではなく、すべての関数を作成することにしましたspecific

    public function checkInfo($column, $parm)
    {
        $this->check = $this->pdo->prepare("SELECT * FROM recoveries WHERE :column = :parm");
        $this->check->execute(array( ":column" => $column, ":parm" => $parm ));

        if ($this->check->rowCount())
        {
            return true;
        }
        else
        {
            throw new exception ("Could not find recovery ".$parm.", ".$column."");
        }
    }

変数列:列名。

変数 parm: parm 名 (ユーザーがフォームに投稿したもの)。

そして、それが行数かどうかを確認する方法です:

    $column = 'recovery_email'; 
    try
    {
        $recover->checkInfo('recovery_email', $_POST['email']);
        echo
        '
            <form action="check.php" method="post">
                <input type="text" name="id">
                <button type="submit" class="btn">Continue</button>
            </form>
        ';
    }
    catch (Exception $t)
    {
        echo '<div class="alert alert-error">'.$t->getMessage().', <a href="check.php">Go back</a></div>';
    }

結果:

 Could not find recovery
  • 列名は正しいです。
  • そしてParmは正しいです(データベースから取得しました)。

問題:

正しい情報を入力していますが、行が見つからないというエラーが発生します。

質問

なぜそれが起こっているのですか?

どうすればこれを修正できますか?

4

1 に答える 1

0

列名をバインドできません。バインドされたパラメーターは、値でのみ機能します。

しかし、できたとしても、列がテーブルに存在しない場合、構文的に有効な列名であっても SQL エラーが発生します。

  • まず、列が存在し、クエリが許可されているかどうかを確認します。これを行うには多くの方法がありますが、最も簡単なのはin_array関数を使用することです。

  • 次に、文字列連結 (または補間) によって列名を SQL ステートメントに挿入し、列値のみをバインドします。

メソッドは次のようになります。

public function checkInfo($column, $parm)
{
    if(!in_array($column, array('recovery_email', 'my_column2', 'my_column3')))
    {
        throw new exception ("Unknown column: ".$column);
    }

    $this->check = $this->pdo->prepare("SELECT * FROM recoveries WHERE $column = :parm");
    $this->check->execute(array( ":parm" => $parm ));

    // ... 
}
于 2013-05-05T18:33:02.757 に答える