列数与第1行的值计数不匹配(列和值相等)

时间:2015-06-29 21:47:28

标签: php mysql

我收到错误: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());

3 个答案:

答案 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>