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

正如@YourCommonSense 已经提到的那样,原始 PDO 接口更清晰一些,但是问题可能是由于使用 functionPDOStatement::bindParam()而不是PDOStatement::bindValue().

这两者之间的区别在于,第一个采用变量引用,它在循环中不断被覆盖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 回答