我收到错误:Column count doesn't match value count at row 1
我认为,如果列数和值不相等,通常会发生此错误,但在我的代码中它们是......(3)。
这是我的PHP代码:
$tempsongtitel = $_POST['songtitle'];
$tempinterpret = $_POST['interpret'];
$templink = $_POST['link'];
$query = mysql_query("insert into tMusic (Songtitel, Interpret, Link) values ('$tempsongtitel, $tempinterpret, $templink')") or die(mysql_error());
答案 0 :(得分:0)
你错过了一些报价。应该是:
$query = mysql_query("insert into tMusic (Songtitel, Interpret, Link) values ('$tempsongtitel', '$tempinterpret', '$templink')") or die(mysql_error());
否则,您试图将所有三个POST值插入第一个字段。
此外,mysql_扩展已被弃用,并且即将推出,并且非常不鼓励,特别是如果您要创建新软件。
我想你首先要清理你的数据吗?您是不是真正接受用户输入并将其直接放入数据库,是吗?即使您没有进行任何数据验证,也应该在查询中转义数据......最简单,最简单的方法是使用参数化查询。
答案 1 :(得分:0)
根本原因是您的值全部在一组引号中而不是单独引用。我认为这是一个非常常见的错误,根据我的经验,这是一个很容易犯的错误,但在扫描代码时并不是很明显。您可以像这样修复它(快速修复,仍使用已弃用的mysql,但转发后的值):
$tempsongtitel = mysql_escape_string($_POST['songtitle']);
$tempinterpret = mysql_escape_string($_POST['interpret']);
$templink = mysql_escape_string($_POST['link']);
$query = mysql_query("insert into tMusic (Songtitel, Interpret, Link)
values ('$tempsongtitel', '$tempinterpret', '$templink')") or die(mysql_error());
如果可以的话,更新代码以使用PDO会好得多。你可以使用这样的预备语句:
$stmt = $pdo->prepare("INSERT INTO tMusic (Songtitel, Interpret, Link) VALUES (?, ?, ?)");
$stmt->bindValue(1, $tempsongtitel);
$stmt->bindValue(2, $tempinterpret);
$stmt->bindValue(3, $templink);
$stmt->execute();
使用此数据库扩展而不是旧的mysql函数的许多好处中,不应该在代码中出现这样的错误。在准备好的语句中,参数标记周围没有引号,所以如果你有VALUES ('?, ?, ?')
,甚至VALUES ('?', '?', '?')
在尝试绑定值时会出现绑定错误,问题会变得很明显快。
答案 2 :(得分:0)
我发现,即使它不是100%必要而且耗时更长,正确引用和回填一切有助于防止这种情况发生。
$myQuery = "INSERT INTO `tMusic` (
`Songtitel`,
`Interpret`,
`Link`
) VALUES (
'$tempsongtitel',
'$tempinterpret',
'$templink'
);";
$runQuery = mysqi_query($DBi, $myQuery) or die(mysqli_error($DBi));
您使用的格式取决于您,但这有助于我确保我有一对一的关系并且我已经引用了所有内容。
当然,使用mysqli_*
代替已弃用的mysql_*
函数,假设您已正确设置$tempsongtitel
,$tempinterpret
和$templink
。 / p>