我试图建立一个方法来检查用户是否存在,如果他们存在,从数据库返回他们的id。在过去,我总是在查询后使用mysql_fetch_array,然后我会使用array_shift($result_array)来获取id。这对于准备好的语句来说是一个挑战。下面看看我的方法:
<?php
require_once("db.php");
class User extends Database{
public $dbFields = array('username', 'password');
public $tableName = "users";
public $id;
public $username;
public $password;
// public function auth($user, $pass){
// $this->username = $user;
// $this->password = $pass;
// }
public function authenticate($username = '', $password = ''){
if(!empty($username) && !empty($password)){
$stmt = "SELECT * FROM users ";
$stmt .= "WHERE username =:username ";
$stmt .= "AND password =:password ";
$stmt = $this->db->prepare($stmt);
if($result = $stmt->execute(array(':username' => $username, ':password' => $password))){
if ($result = $stmt->fetch(PDO::FETCH_ASSOC)){
return $result;
} else {
return print("false");
}
}else{
return print("false false");
}
}
}
}
?>
这可能不相关,但这是表单页面:
if (isset($_POST['submit'])){
$username = $_POST['username'];
$password = $_POST['password'];
$user = new User();
$user->authenticate($username, $password);
}
?>
<html>
<head>
<title>test</title>
</head>
<body>
<form action = "test.php" method= "POST" accept-charset="utf-8" >
<p>Username
<input type="text" name="username" maxlength="30" value="" />
</p>
<p>Password
<input type="password" name="password" maxlength="30" value="" />
</p>
<p><input type="submit" name="submit" value="Continue →"></p>
</form>
</body>
</html>
我已经成功地在我所有的其他db方法上使用了pdo,所以如果我能帮助它,我真的不想切换回标准的mysql语句。任何建议吗?
编辑:按照Chris的建议修改了execute array的语法
php在单引号分隔的字符串中不展开变量
使用类似
的内容array(':username' => $username, ':password' => $password)
除此之外,您的变量$result是一个关联数组,就像您习惯的那样。
return $result['id'];
注意,print函数返回1的值。我真的不认为您希望从身份验证函数返回这个值。如何判断1是某人的用户id,还是它是print的返回值?返回布尔值false以表示失败。
在准备好的语句中需要一个输出变量。语法一般为:
创建过程过程名称(OUTPUTVARNAME DBTYPE out)
,但在不同的数据库实现中会有所不同。试一试:http://www.php.net/manual/en/book.pdo.php # 68398