我正在尝试将帖子上的内部数据库更新到第三方平台。我已成功为另一个变量更新了相同的数据库但是当我在其中添加此变量时,所有中断。这是mysqli更新声明:
@$mysqli->query("UPDATE `tableName` SET `columnID`=" . (int)$columnID . ',`columnID2`=' . (int)$columnID2 . ',`columnID3`=' . (int)$columnID3 . ',`columnID4`=' . $columnID4 . ' WHERE `id`=' . (int)$id . ' LIMIT 1');
由于某种原因,如果我取出columnID4它会工作,但是当我在语句中包含columnID4时它不起作用。
我在$ columnID4上做了一个var转储,它每次都返回我期望的值。
当我做的时候
echo $mysqli->error;
我在“字段集”中收到一条消息“Array”未知数组。
以下是我设置字段的代码。
if ($query->num_rows == 1) {
$columnID4 = $query->fetch_assoc();
} else {
$columnID4 = 0;
}
答案 0 :(得分:0)
通过盯着构建SQL字符串的PHP代码来调试SQL总是很困难。相反,在构建之后查看SQL !
提示:永远不要使用@
错误抑制运算符。最好修复错误,而不是压制错误。
我不喜欢PHP开发人员使用字符串连接的习惯。它使代码难以阅读,并且很容易出错。以下两种不同的方法可以使代码更加健壮:
解决方案1:
使用sprintf()将变量插入到SQL字符串中。这允许您分别使用%d
和%f
将变量强制转换为整数或小数。
$sql = sprintf("UPDATE `tableName` SET `columnID`=%d, `columnID2`=%d,
`columnID3`=%d, `columnID4`=%f WHERE `id`=%d LIMIT 1",
$columnID, $columnID2, $columnID3, $columnID4, $id);
error_log("sql = $sql");
$mysqli->query($sql);
解决方案2:使用mysqli_stmt::bind_param()的绑定参数。使用SQL时,这是一种推荐的做法。变量永远不会触及您的SQL代码,因此无法破解查询语法。
$sql = "UPDATE `tableName` SET `columnID`=?, `columnID2`=?,
`columnID3`=?, `columnID4`=? WHERE `id`=? LIMIT 1";
error_log("sql = $sql");
$stmt = $mysqli->prepare($sql);
$stmt->bind_param("iiidi", $columnID, $columnID2, $columnID3, $columnID4, $id);
$stmt->execute();
答案 1 :(得分:0)
我的问题的解决方案是将if语句更改为以下内容:
if ($query->num_rows == 1) {
$array = $query->fetch_assoc();
$columnID4 = $array['num'];
} else {
$columnID4 = 0;
}
问题是我收到了一个数组对象,而且代码不知道该怎么做,也无法找到我要求的那个数组中的特定信息。