我正在创建一个 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()。
edit- 触发代码
$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;
}
正如@YourCommonSense已经提到的,原始PDO接口更清晰一些,但是问题可能是由于使用了函数PDOStatement::bindParam() http://php.net/manual/en/pdostatement.bindparam.php代替PDOStatement::bindValue() http://www.php.net/manual/en/pdostatement.bindvalue.php.
这两个之间的区别在于,第一个需要一个变量引用 http://php.net/manual/en/language.references.php,它不断地被覆盖在你的foreach
循环,而最后一个则取变量的实际值。
如果您正在寻找一些更友好的数据库连接界面,为什么不尝试一下DBAL学说 http://www.doctrine-project.org/projects/dbal.html?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)