4

プロジェクトで使用する PDO クラスを作成していますが、初めてなので、準備された SQL ステートメントにパラメーターをバインドできません。エラーは発生しません。これを実行するための機能は次のとおりです。

# ::bindParam
public static function bind()
{
    # get function arguments
    $args = func_get_args();

    # check for any arguments passed
    if (count($args) < 1)
    {
        return false;
    }

    foreach ($args as $params)
    {
        # named variables for convenience
        $parameter = $params[0];
        $variable = $params[1];
        $data_type = isset($params[2]) ? $params[2] : PDO::PARAM_STR;
        $length = isset($params[3]) ? $params[3] : null;

        # bind param to query
        Database::$statement->bindParam($parameter, $variable, $data_type, $length) or die('error');
    }
}

および準備された sql ステートメント:

SELECT * FROM `users` WHERE `email` = :email AND `password` = :password LIMIT 1

誰かが私を正しい方向に向けることができますか? この時点では、クエリはエラーを生成しません。bindParam() と prepare() しか使用していないため、そうではないかもしれませんが、問題はここにあると想定していることに注意してください。

編集- コードのトリガー

    $email = $_POST['email'];
    $password = $_POST['password'];

    $password = hash('sha256', $password);

    $this->db->prepare('SELECT * FROM `users` WHERE `email` = :email AND `password` = :password LIMIT 1');
    $this->db->bind(
        array(':email', $email),
        array(':password', $password)
    );
    $status = $this->db->execute();

    if ($status)
    {
        $result = $this->db->fetch('assoc');

        $this->template->user = $result;
    }
    else
    {
        $this->template->user = false;
    }
4

2 に答える 2

10

PDOStatement::bindParam()@YourCommonSenseが既に述べたように、生の PDO インターフェイスは少し明確ですが、問題はおそらくPDOStatement::bindValue().

これら 2 つの違いは、最初のものはループ内で常に上書きされる変数参照foreachを受け取り、最後のものは変数の実際の値を取ることです。


より使いやすいデータベース接続インターフェースを探しているなら、Doctrine DBALを試してみませんか?

于 2013-04-25T16:04:03.913 に答える
3

この関数を取り除くだけで、PDO は既にそれを持っています

$email = $_POST['email'];
$password = $_POST['password'];

$password = hash('sha256', $password);

$this->db->prepare('SELECT * FROM `users` WHERE `email` = :email AND `password` = :password LIMIT 1');
$stmt = $this->db->execute(array(':email'=> $email,':password' => $password));
$this->template->user = $this->db->fetch();

必要なコードはこれだけです (クラスの実行が通常の PDO 実行であると仮定します)

または、生の PDO で作成するには:

$email = $_POST['email'];
$password = $_POST['password'];
$password = hash('sha256', $password);

$sql  = 'SELECT * FROM users WHERE email = ? AND password = ? LIMIT 1';
$stmt = $this->db->prepare($sql);
$stmt->execute(array($email, $password));
$this->template->user = $stmt->fetch();

したがって、クラスには生の PDO よりも多くのコードが必要なようです。本当にこのクラスが必要ですか?

于 2013-04-25T15:40:18.043 に答える