首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PDO - bindParam无效

PDO - bindParam无效
EN

Stack Overflow用户
提问于 2013-04-25 15:26:28
回答 2查看 10.8K关注 0票数 4

我正在创建一个PDO类,用于我的项目,但是由于我是新手,所以我无法将参数绑定到准备好的sql语句,而没有任何错误。下面是实现它的功能:

代码语言:javascript
复制
# ::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语句:

代码语言:javascript
复制
SELECT * FROM `users` WHERE `email` = :email AND `password` = :password LIMIT 1

有人能给我指明正确的方向吗?此时,查询不会产生错误。请注意,我假设问题在这里,尽管可能不是,因为我只使用bindParam()和prepare()。

编辑触发器代码

代码语言:javascript
复制
    $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;
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-25 16:04:03

正如@YourCommonSense已经提到的,原始的PDO接口有点清晰,但是问题可能是由于使用了函数PDOStatement::bindParam()而不是PDOStatement::bindValue()

这两者的区别是,第一个是可变参考,它经常在foreach循环中被覆盖,而最后一个是变量的实际值。

如果您正在寻找更友好的数据库连接接口,为什么不尝试原则DBAL

票数 10
EN

Stack Overflow用户

发布于 2013-04-25 15:40:18

只要去掉这个函数,PDO就已经有了

代码语言:javascript
复制
$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制作它:

代码语言:javascript
复制
$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更多的代码。你确定你真的需要这门课吗?

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16218797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档