2011-04-11 82 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錯誤沒有任何意義..

有趣的事情,我又有同樣的問題..並找到我自己的答案(很尷尬) 這是一個意外的數據問題(聽起來像更好的錯誤味精給我)。我真的認爲,應該再次看到錯誤信息

相關問題