“列数与第1行的值计数不匹配”来自以下代码:
function rememberData($_POST) {
foreach ($_POST as $key => $value) {
$_SESSION[$key] = $value;
}
return $_SESSION;
}
以上是我将$ _POST存储到$ _SESSION中的方法。我在不同的页面上调用该方法。只需发布它即可显示该过程。
$columns = implode(",", array_keys($_SESSION));
$values = implode(",", array_values($_SESSION));
$sql = "INSERT INTO table ($columns) VALUES ('$values')";
// Execute query
if (mysqli_query($connection,$sql)) {
echo "$key column was added";
} else {
echo "Error adding columns: " . mysqli_error($connection);
}
我使用foreach将表单中的所有$ _POST数据存储到$ _SESSION中。当我var_dump会话时,数据与键完全匹配。我知道这不安全,但并不重要。有谁知道为什么我继续得到这个MYSQL错误?
编辑:添加了我如何设置$ _SESSION。我这样做,所以我可以访问多个页面的POST数据。
编辑2:下面告诉我,我有一个语法错误:你的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以便在'“name”,“Date0”,“Day0”,“UnitHours0”,“ProjectHours0”,“QwestMark0”,“TotalTickets0”,'第1行附近使用正确的语法
所以我认为这是开头和结尾的单引号,但如果我修剪它们就不会消失。它必须只是显示信息的浏览器?我的代码中没有任何单引号。这是由var_dump确认的。
foreach ($_SESSION as $key => $value) {
$columns .= "\"$key\"" . ",";
$values .= "\"$value\"" . ",";
}
$columns = rtrim($columns, ",");
$values = rtrim($values, ",");
echo $sql = "INSERT INTO tables ($columns) VALUES ($values)";
// Execute query
if (mysqli_query($connection,$sql)) {
echo "$key column was added";
} else {
echo mysqli_error($connection);
}
答案 0 :(得分:1)
您将整个$值放入引号,使其成为单个字符串,而其每个值应为单独的字符串。
$sql = "INSERT INTO table ($columns) VALUES ('$values')";
^ here ^
这将呈现,例如:
$sql = "INSERT INTO table ('column1', 'column2') VALUES ('value1, value2')";
意味着第一列的值为'value1, value2'
,第二列没有值。相反,它应该看起来像:
$sql = "INSERT INTO table ('column1', 'column2') VALUES ('value1', 'value2')";
因此,只有当$ _SESSION有一个或没有元素时,你的代码才会起作用。
答案 1 :(得分:0)
为什么要引用键,如果有的话应该是反引号。
对于双引号值,单引号更常见:
foreach ($_SESSION as $key => $value) {
$columns .= "`$key`" . ",";
$values .= "'$value'" . ",";
}
至于准备查询它不仅仅是为了安全性,如果你有不好的字符(例如单引号),它将破坏查询,所以至少使用mysqli_real_escape_string
。