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
相关产品推荐
相关产品推荐

