PHP函数count()报错及数据库更新异常求助
PHP函数报错:count()警告与数据库更新错误解决方向
一、count()警告问题(第42行)
报错信息
[19-Sep-2023 12:01:52 UTC] PHP Warning: count(): Parameter must be an array or an object that implements Countable in /home/zho018qfnx0i/public_html/addContactsToList.php on line 42
问题原因
代码中count($response['contacts']['success'])的参数$response['contacts']['success']并非数组或可计数对象。大概率是对接的第三方接口(如SendinBlue)返回结构发生了变化——之前稳定返回数组,现在可能返回单个值、null或其他非可计数类型。
修复方案
在调用count()前先做类型校验,确保参数符合要求:
// 替换原第42行的判断逻辑 if (isset($response['contacts']['success']) && is_countable($response['contacts']['success']) && count($response['contacts']['success']) == 1) {
如果接口现在返回的是单个成功标识而非数组,可简化判断逻辑:
if (isset($response['contacts']['success']) && !empty($response['contacts']['success'])) {
二、数据库更新错误
报错信息
Error updating record: Unknown column 'invalid_parameter' in 'field list'
问题原因
更新status的SQL语句未给字符串类型的$error添加单引号:
$sql = "UPDATE contacts SET status=$error WHERE id=".$row['id'];
当$error为invalid_parameter这类字符串时,SQL会将其解析为列名而非字段值,导致数据库找不到对应列。同时这种直接拼接SQL的方式存在SQL注入风险。
修复方案
- 临时快速修复:给
$error添加单引号
$sql = "UPDATE contacts SET status='$error' WHERE id=".$row['id'];
- 推荐安全方案:使用预处理语句(彻底规避注入风险)
$stmt = $conn->prepare("UPDATE contacts SET status=? WHERE id=?"); // 绑定参数:"s"表示字符串类型,"i"表示整数类型 $stmt->bind_param("si", $error, $row['id']); $stmt->execute(); if ($stmt->affected_rows > 0) { echo "Record updated successfully"; } else { echo "Error updating record: ".$stmt->error; } $stmt->close();
额外建议
- 原代码中多处直接拼接SQL(如
sendinBlueId= $sendinBlueId),均存在SQL注入风险,建议统一替换为预处理语句。 - 可以在调用第三方接口后添加日志记录,输出
$response的完整结构,便于排查接口返回结构变化的问题。
内容的提问来源于stack exchange,提问作者mickdeez
相关产品推荐
相关产品推荐

