PDO PDOStatement 最后总是输出 1

PDO PDOStatement always outputs 1 in the end

我是 PDO 的新手,一直在寻找一些答案,但没有找到。由于某种原因,PDOStatement 对象最后总是输出 1。

例如当我这样做时

$username = 'Alexander';
$sql = "
    SELECT username, email FROM user
    WHERE
        username = :username;
";

$stmt = $dbh->prepare($sql);
$stmt->bindParam(':username', $username);
$stmt->execute();
$result = $stmt->fetch(PDO::FETCH_ASSOC);

echo '<pre>', print_r($result), '</pre>';

它输出

Array
(
    [username] => Alexander
    [email] => alex@live.com
)
1

注意最后的1。例如,当我使用 rowCount() 来检查 更新语句后受影响的行我得到这样的东西

$username = 'martin';
$sql = "
    UPDATE user
    SET 
        username = :username
    WHERE id = 1;
";

$stmt = $dbh->prepare($sql);
$stmt->bindParam(':username', $username);
$stmt->execute();

$affected = $stmt->rowCount();

echo '<pre>', print_r($affected), '</pre>';

现在这不仅会输出 1,还会输出 11,因为无论如何最后都会有额外的 1。如果我再次执行该查询,我不仅会得到 0,还会得到 01。这正常吗?我怎么能再次区分 0、1 和 01,因为基本上每次都有额外的 1。我不明白这种行为,到底这个额外的1有什么意义?

您需要使用 print_r($var, 1) 来删除那些和 return 字符串而不是 true

manual中:

mixed print_r ( mixed $expression [, bool $return = false ] )

When the return parameter is TRUE, this function will return a string. Otherwise, the return value is TRUE.

所以只需添加该标志:

echo '<pre>', print_r($affected, 1), '</pre>';
//                               ^ or `true`