You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP使用PDO预处理语句做用户名查重时count函数报错如何解决

错误原因

PDO 提供的 fetch(PDO::FETCH_ASSOC) 方法在查询结果无匹配行时,返回值为布尔值 false,而非空数组。当你校验的用户名不存在时,$row 被赋值为 false,此时调用 count($row) 就会触发类型错误——count() 仅支持传入实现了 Countable 接口的对象或者数组类型参数。
用户名存在时逻辑正常,是因为此时 fetch 返回了非空的关联数组,count() 可以正常统计数组长度。

修复方案

直接替换判断逻辑,不需要调用 count() 校验,直接判断 $row 是否为真值即可:存在匹配用户时 $row 是关联数组(真值),不存在时是 false(假值),逻辑完全匹配你的需求。

修改后的完整代码如下:

<?php 
include 'config.php';

// 校验用户名是否存在
$check = $con->prepare("select username from users where username = ?");
$check->bindParam(1, $username);
$username = $_POST['username'];
$check->execute();
$row = $check->fetch(PDO::FETCH_ASSOC);

if ($row) {
    echo -1;
} else {
    $sql = $con->prepare("insert into users(name,username,password) values(?,?,?)");
    $sql->bindParam(1, $name);
    $sql->bindParam(2, $username);
    $sql->bindParam(3, $password);
    $name = $_POST['name'];
    $username = $_POST['username'];
    // 注意:md5加密不安全,建议替换为password_hash()
    $password = md5($_POST['password']);
    $sql->execute();
    echo 1;
}
?>

额外优化建议

  • 可以直接用 rowCount() 方法判断匹配行数,逻辑更直观:if($check->rowCount() > 0)
  • 废弃 md5 做密码哈希,改用 PHP 内置的 password_hash() 生成密码哈希,验证时配套使用 password_verify(),安全性更高
  • 增加请求参数校验逻辑,先判断 $_POST 对应的字段是否存在,避免抛出未定义索引的Notice错误
  • 可增加 execute() 执行结果的判断,处理数据库操作异常的场景

内容的提问来源于stack exchange,提问作者Safina Siddique

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 01:45:03