MySQL错误:“列数与第1行的值计数不匹配” - 初学者帮助

时间:2011-03-14 21:12:21

标签: php mysql

基本上,php&正在使用MySQL。我是初学者。

我要做的是将用户注册到我的数据库,因此将表单输入存储到我的users_tb。

当我尝试将值插入表单时出现此错误:

“列数与第1行的值计数不匹配”

我认为这是因为我没有插入user_id值(这是自动增量),所以我尝试在我的查询中插入''用于user_id,但仍然没有运气。

这是查询:

$query = "INSERT INTO users_tb (user_id, user_status, user_gender, user_firstname, user_surname, student_number,
    user_email, user_dob, user_name, user_pass) 
    VALUES('','$status','$gender','$firstname','$surname','$hnumber','$dob','$username','$password')";
    mysql_query($query) or die(mysql_error());
    mysql_close();

是否有帮助。如果您需要任何其他代码,请说。

只是为了确保插入不必与字段在表中的顺序相同吗?

非常感谢,

6 个答案:

答案 0 :(得分:13)

你错过了一个值。

对于这么多列的查询(如果你只插入一行),我建议使用以下INSERT语法,它更容易阅读,不太可能导致问题。

$query = "INSERT INTO users_tb SET
          user_status    = '". mysql_real_escape_string($status) ."',
          user_gender    = '". mysql_real_escape_string($gender) ."',
          user_firstname = '". mysql_real_escape_string($firstname) ."',
          user_surname   = '". mysql_real_escape_string($surname) ."',
          student_number = '". mysql_real_escape_string($hnumber) ."',
          user_email     = '". mysql_real_escape_string($email) ."',
          user_dob       = '". mysql_real_escape_string($dob) ."',
          user_name      = '". mysql_real_escape_string($username) ."',
          user_pass      = '". mysql_real_escape_string($password) ."'";
mysql_query($query) or die(mysql_error());
mysql_close();

答案 1 :(得分:6)

您缺少user_email的值。

$query = "INSERT INTO users_tb
          (
              user_status,
              user_gender,
              user_firstname,
              user_surname,
              student_number,
              user_email,
              user_dob,
              user_name,
              user_pass
          ) 
          VALUES
          (
              '$status', 
              '$gender',
              '$firstname',
              '$surname',
              '$hnumber',
              '$email',    -- <--- you forgot this!
              '$dob',
              '$username',
              '$password'
          )";

只是提醒一下:如果你还没有这样做,你应该使用mysql_real_escape_string来逃避这些值。

答案 2 :(得分:2)

Mark Byers回答了问题部分,但没有解决这个问题:

  

只是为了确保插入不必与字段在表中的顺序相同吗?

不,它们不必与表中的列具有相同的顺序,但是列列表和值列表必须在计数和数据类型中匹配。你遇到的问题是Mark发现的问题;您错过了user_email的值,这意味着dob值正在尝试进入该列。 MySQL发现您列出的列没有足够的值,并将错误报告给您。

Column count doesn't match value count实际上是一个非常明确的消息,这对于数据库引擎来说是不寻常的。 :)

答案 3 :(得分:1)

您可以使用此简单函数从$ _POST数组和允许字段列表中创建查询:

function dbSet($fields) {
  $set='';
  foreach ($fields as $field) {
    if (isset($_POST[$field])) {
      $set.="`$field`='".mysql_real_escape_string($_POST[$field])."', ";
    }
  }
  return substr($set, 0, -2); 
}

像这样使用

$table  = "users_tb";
$fields = explode(" ","user_status user_gender user_firstname user_surname student_number user_email user_dob user_name user_pass");
$query  = "INSERT INTO $table SET ".dbSet($fields);
mysql_query($query) or trigger_error(mysql_error()." in ".$query);

当然假设HTML表单字段名称与SQL表字段名称匹配,这是非常方便的考虑

答案 4 :(得分:0)

您有10个要插入的字段,但是您只提供了9个值

答案 5 :(得分:0)

列出10列,但只有9个值。