我有一个登录系统,我最初检查用户名/密码组合是否正确,然后获取列以设置会话变量
这是我的代码
$sql='select uid,name from users where username=? and password=?';
$query=$con->prepare($sql);
$result=$query->execute(array($username,$password));
$query->setFetchMode(PDO::FETCH_ASSOC);
//check if a single row is returned
if(($query->fetchColumn())===1)
{
//set session variables
header('Location: lading_page.php');
}
else echo "Invalid username/password";
1) fetchColumn()
提供了错误的结果 3 (虽然我有单行匹配参数和每行15个coulmns),而如果{{ 1}}已经
$sql
正确答案 1 为什么?
2)我看到了php手册,我发现$sql='select count(*) from users where username=? and password=?';
仅针对DML查询进行了保护,它建议workaround for SELECT但每次登录需要2次查询。
我可以使用单一查询吗?
修改
现在我正在使用这样的东西,似乎工作正常,但问题很少。见评论
rowCount()
答案 0 :(得分:2)
尝试使用全部获取
$rows = $query->fetchAll(PDO::FETCH_ASSOC);
在你的情况下
$sql='select uid,name from users where username=? and password=?';
$query=$con->prepare($sql);
$result=$query->execute(array($username,$password));
// check if a single row is returned
// i guess to avoid the warnings you can just set the array befor like
// $row = array();
// or put @ befor the VARS in the TRUE statement
$rows = $query->fetchAll(PDO::FETCH_ASSOC));
/**
if you have more than one result you can look at them like this
foreach ($rows as $row)
{
echo $row['uid'];
}
**/
if((count($rows)===1)
{
echo $_SESSION['id']=@$rows['uid'];
echo $_SESSION['name']=@$rows['name'];
// header('Location: lading_page.php');
}
else echo "Invalid username/password";
答案 1 :(得分:0)
fetchColumn() - 从结果集的下一行返回单个列。它不是“select count(*)...”中的结果行数,而是结果行中(在您的情况下)第一列(uid)的值。