【问题标题】:PHP, Error 1136 : Column count doesn't match value count at row 1 [duplicate]PHP,错误 1136:列计数与第 1 行的值计数不匹配 [重复]
【发布时间】:2011-04-11 04:51:17
【问题描述】:

我得到这个异常:

Error 1136 : Column count doesn't match value count at row 1

表结构:

create table gb_entries (
    id int(4) not null auto_increment,
    username varchar(40) not null,
    name varchar(40),
    gender varchar(40),
    dob int(40),
    email varchar(40),
    primary key (id) 
);

使用此 PHP 代码:

// Add a new entry to the database
function addEntry($username, $name, $gender, $dob, $email) {
  $connection = mysql_open();
  $insert = "insert into gb_entries " . 
      "values ('$username', '$name', '$gender', '$dob', '$email')";
  $result = @ mysql_query ($insert, $connection)
      or showerror();
  mysql_close($connection)
      or showerror();
}

// Return an array of database entries that contain $name anad $email
function getEntries($username,$name,$gender,$dob,$email) {
  // Sanitise user input to prevent SQL injection attacks
  $username = mysql_escape_string($username);
  $name = mysql_escape_string($name);
  $gender = mysql_escape_string($gender);
  $dob = mysql_escape_string($dob);
  $email = mysql_escape_string($email);


  // Open connection and select database
  $connection = mysql_open();

  // Construct query
  $query = 
    "select username, name, gender, dob, email from gb_entries where 0=0 ";
  if (! empty($username)) {
      $query .= "AND username LIKE '%$username%' ";
  }
   if (! empty($name)) {
      $query .= "AND name LIKE '%$name%' ";
  }
  if (! empty($gender)) {
      $query .= "AND gender LIKE '%$gender%' ";
  }
  if (! empty($dob)) {
      $query .= "AND dob LIKE '%$dob%' ";
  }
  if (! empty($email)) {
      $query .= "AND email LIKE '%$email%' ";
  }


  $query .= "ORDER BY id";
  // echo $query;

  // Execute query
  $result = @ mysql_query($query, $connection)
      or showerror();

  // Transform the result set to an array (for Smarty)
  $entries = array();
  while ($row = mysql_fetch_array($result)) {
      $entries[] = $row;
  }

  mysql_close($connection)
      or showerror();
  return $entries;
}

异常是什么意思?

【问题讨论】:

  • 嗨!您可以通过在每行之前放置 4 个空格来格式化代码 (编辑器顶部的 {} 按钮就是这样做的);这次我已经为你做了;;有关格式化帖子的更多信息,请参阅stackoverflow.com/editing-help

标签: php mysql


【解决方案1】:

正如它所说,列数与值数不匹配。您在六列表上提供五个值。由于您没有为 id 提供值,因为它是自动递增的,因此会出错 - 您需要指定要插入的特定列:

$insert = "insert into gb_entries (username, name, gender, dob, email) " . 
      "values ('$username', '$name', '$gender', '$dob', '$email')"

另外,我真的很讨厌 WHERE 0=0 这条线。我知道为什么你这样做,但我个人觉得这样做更干净(警告:空气代码!):

$query = "select username, name, gender, dob, email from gb_entries ";

$where = array();
if (! empty($username)) {
      $where[] = "username LIKE '%$username%'"; // add each condition to an array
// repeat for other conditions

// create WHERE clause by combining where clauses, 
// adding ' AND ' between conditions, 
// and append this to the query if there are any conditions 
if (count($where) > 0) {
  $query .= "WHERE " . implode($where, " AND "); 
}

这是个人偏好,因为查询优化器肯定会自行删除 0=0,因此不会对性能产生影响,但我只是希望我的 SQL 尽可能少地被黑客攻击。

【讨论】:

  • 如果没有 where 子句,这将产生一个无效的查询。在追加到查询之前,您需要检查 $where 数组计数。
  • @Phil:我在您发表评论之前抓住了implode 部分,但没有看到没有条件的悬挂“WHERE”。您会注意到我确实 打算处理这个问题,因为我事先创建了数组以确保它存在,但是在我编写该部分时忘记添加实际签入。我现在把它加进去。谢谢。
  • @Phil:我添加了count() 检查。还有什么我错过的吗?
【解决方案2】:

如果在尝试向表中插入行时发生错误,请尝试在插入查询中指定字段列表——这样,values 子句中的数据数量将与预期的数量相匹配列。

否则,MySQL 需要六列:它需要 id 列——您没有为其指定值。


基本上,而不是这个:

$insert = "insert into gb_entries " . 
  "values ('$username', '$name', '$gender', '$dob', '$email')";

使用类似的东西:

$insert = "insert into gb_entries (username, name, gender, dob, email) " . 
  "values ('$username', '$name', '$gender', '$dob', '$email')";

【讨论】:

    【解决方案3】:

    我遇到了类似的问题。列数是正确的。问题是我试图在一个 INT 字段中保存一个字符串(值有引号)。所以你的问题可能来自你在'$ dob'周围的单引号。我知道,生成的mysql错误没有意义..

    有趣的是,我又遇到了同样的问题..在这里找到了我自己的答案(很尴尬) 这是一个意外的数据问题(对我来说听起来像是更好的错误消息)。我真的认为,应该再次查看该错误消息

    【讨论】:

      【解决方案4】:

      修改这一行有帮助吗?

      $insert = "insert into gb_entries (username, name, gender, dob, email) " . 
            "values ('$username', '$name', '$gender', '$dob', '$email')";
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-07
        • 1970-01-01
        相关资源
        最近更新 更多