2011-04-11 190 views
1

我得到这个异常:PHP,错误1136:列计数不在行匹配值计数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代码:

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

表的结构

// 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; 
} 

这个异常是什么意思?

+0

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

回答

7

就像它说的那样,列数与值数不匹配。您在六列表格中提供了五个值。既然你不是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尽可能少的黑客。

+0

如果没有where子句,则会生成无效查询。在追加查询之前,您需要检查'$ where'数组的数量。 – Phil 2011-04-11 05:11:28

+0

@菲尔:我在你的评论之前发现了'implode'部分,但没有找到没有任何条件的'WHERE'。你会注意到我打算处理这个事情,因为我事先创建了数组以确保它存在,但是当我写这部分时忘记添加实际的检查。我现在补充一下。谢谢。 – AgentConundrum 2011-04-11 05:14:16

+0

@Phil:我加了'count()'检查。还有什么我错过了吗? – AgentConundrum 2011-04-11 05:15:50

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')"; 
0

是否修改该行帮助?

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

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

有趣的事情,我又有同样的问题..并找到我自己的答案(很尴尬) 这是一个意外的数据问题(听起来像更好的错误味精给我)。我真的认为,应该再次看到错误信息

相关问题