使用PHP中的PDO在单个查询中获取该行的行数和数据

时间:2014-01-27 13:43:14

标签: php mysql sql pdo

我有一个登录系统,我最初检查用户名/密码组合是否正确,然后获取列以设置会话变量

这是我的代码

$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()

2 个答案:

答案 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)的值。