我有一个带有用户名和密码的登录数据库,以及一个输入用户名和密码类型的html文件。
在我班级登录:
class login
{
protected $_username;
protected $_password;
public function __construct($username, $password) //$username and $password values will be from the $_POST['username and password'] when the user submits the username and password
{
$this->username = $username;
$this->password = md5($password);
}
public function login()
{
try {
$pdo = dbConnect::getConnection();
$smt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$smt->bindParam(1, $this->username);
$smt->execute();
echo "<pre>";
print_r($smt->fetch(PDO::FETCH_OBJ)); //testing if $smt will return results..yes it returned
if($smt->fetch()) {
print_r($smt->fetch(PDO::FETCH_OBJ)); //doesn't return ??this is my question... all other arguments inside this if loop is not executed..
while($row = $smt->fetch(PDO::FETCH_OBJ)) {
echo "one";
if($row->password == $this->password) {
header("Location: admin.php");
}
else {
echo '<div class="alert alert-error alert-block"><button type="button" class="close" data-dismiss="alert">×</button><h4>Error!</h4>username and password do not match!</div>';
}
}
}
else {
echo '<div class="alert alert-error alert-block"><button type="button" class="close" data-dismiss="alert">×</button><h4>Error!</h4>Username does not exist!</div>';
}
}
catch (PDOException $e) {
die($e->getMessage());
}
}
}
问题是在PDO中,它不会返回我在if($ smt-&gt; fetch()之后请求的数据,用于知道查询是否在获取之前返回了结果.. ,print_r返回数据...我无法继续我的代码,因为这...我对OOP和PDO的新内容这就是为什么我不能处理这个不同于mysql或mysqli函数..我是PDO的新手,也是我正在使用sqlite在这里..
答案 0 :(得分:1)
您正在多次抓取:
print_r($smt->fetch(PDO::FETCH_OBJ)); //testing if $smt will return results..yes it returned
if($smt->fetch()) {
print_r($smt->fetch(PDO::FETCH_OBJ)); //doesn't return ??this is my question... all other arguments inside this if loop is not executed..
while($row = $smt->fetch(PDO::FETCH_OBJ)) {
这些行中的每一行都将尝试从返回的数据中获取下一行。但是您的查询看起来只返回一行。此行将由第一个print_r()
打印。然后,当您在if()
中再次获取时,将不会有任何内容,因此它将返回false
,if
将失败。
您可以使用$smt->fetchAll()
返回数组中的所有结果。然后,您可以测试此数组是否包含任何元素,并遍历它以打印结果。
$results = $smt->fetchAll(PDO::FETCH_OBJ);
if (count($results)) {
foreach ($results as $row) {
print_r($row);
if($row->password == $this->password) {
header("Location: admin.php");
}
else {
echo '<div class="alert alert-error alert-block"><button type="button" class="close" data-dismiss="alert">×</button><h4>Error!</h4>username and password do not match!</div>';
}
}
}
else {
echo '<div class="alert alert-error alert-block"><button type="button" class="close" data-dismiss="alert">×</button><h4>Error!</h4>Username does not exist!</div>';
}
虽然我不明白你为什么要使用循环,但是你可以非常肯定查询永远不会返回超过1行。我总是看到这个,我不明白,除非程序员只是从其他返回多行的查询中复制代码,并且他们不明白循环是不必要的。