3

试图将我所有的旧mysql_*操作转换为新的,并且据我所知,改进了 PDO,但是这个查询似乎不会成功运行,我试图从用户名 = $username 的表 PEOPLE 中选择所有(以前被宣布$username = $_SESSION['username'];

$query = "SELECT  * FROM people WHERE username=?";
$stmt = $conn->prepare($query);
$stmt->bindParam(1, $username);   
$stmt->execute();
$num_rows = $stmt->fetchColumn();

if ($num_rows == 1) {
    // ...
}

工作代码是:

$query = "SELECT  * FROM people 
             WHERE username=?";
$stmt = $conn->prepare($query);
$stmt->bindParam(1, $username);   
$stmt->execute();
$num_rows = $stmt->fetchColumn();
$user = $stmt->fetchObject();

if ($user) {

//do something

}
4

4 回答 4

2
$query = "SELECT * FROM people WHERE username = :username";
$stmt = $conn->prepare($query);
$stmt->bindParam(':username', $username);   
$stmt->execute();

while ($row = $stmt->fetchObject()) {
    // do stuff
}
于 2012-09-07T20:08:04.990 回答
2

使用PDOStatement::rowCount作为 num_rows 和PDOStatement::fetch(PDO::FETCH_ASSOC)作为 fetch_assoc 等效项。

于 2012-09-07T20:09:19.863 回答
2

$stmt->fetchColumn不获取行数;在这种情况下,它将从结果集的第一行中获取第一列。因为这不等于1通常你的测试会失败。

在这种情况下,实际上也不需要计算返回的行数,因为您期望的是 1 或 0(如果用户名不存在)。所以你可以简单地做:

$stmt->execute();
$user = $stmt->fetchObject();
if (!$user) {
    // not found
}
else {
    echo "User $user->username found!";
}

if(!$user)测试有效,因为如果没有要获取的$user行将是false(请参阅文档fetchObject)。

于 2012-09-07T20:06:20.053 回答
1

你要

if ($stmt->num_rows == 1) {

反而。

于 2012-09-07T20:08:46.830 回答