2012-03-07 18 views
0

我遇到了將子數組數值插入到mysql表中的問題。我收到以下錯誤。列數與第1行的值計數不匹配 - PHP子數組

列數並不在行1

不知道我做錯了匹配值計數。

這是我的表

CREATE TABLE IF NOT EXISTS `tbl_tourn_results` (
    `fld_tr` char(10) NOT NULL, 
    `fld_id_tr` char(5) NOT NULL, 
    `fld_score` smallint(6) DEFAULT NULL, 
    `fld_hole` smallint(6) DEFAULT NULL, 
    `fld_T_Time` varchar(10) DEFAULT NULL, 
    PRIMARY KEY (`fld_tourn_id_tr`,`fld_gPlayer_id_tr`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

這是一個陣列的樣品。

Array 
(
    [0] => Array 
     (
      [fld_tr] => HONDA 
      [fld_id_tr] => RoMcI 
      [fld_score] => -12 
      [fldr_hole] => F 
     ) 

    [1] => Array 
     (
      [fld_tr] => HONDA 
      [fld_id_tr] => TiWoo 
      [fld_score] => -10 
      [fld_hole] => F 
     ) 

    [2] => Array 
     (
      [fld_tr] => HONDA 
      [fld_id_tr] => TiWoo 
      [fld_score] => -10 
      [fld_hole] => F 
     ) 

    [3] => Array 
     (
      [fld_tr] => HONDA 
      [fld_id_tr] => TiWoo 
      [fld_score] => -10 
      [fld_hole] => F 
     ) 
) 

這是我用來插入的代碼。

<?php 
//Each 'sub-array' will become a row in the table 
foreach($result as $row){ 
    $i = 0; 
    //3 (not 4!) is the highest key in each sub-array 
    while($i <= 3){ 
     //MySQL likes each value wrapped in apostrophes 
     $row[$i] = '\'' . $row[$i] . '\''; 
     $i++; 
    } 
    //Convert the sub-array into a comma-separated string 
    $row = implode(",", $row); 
    //MySQL query inserts the sub-array into a new row in the table 
    mysql_query("INSERT INTO tbl_results (fld_tr, fld_id_tr, fld_score, fld_hole) VALUES({$row}) ") or die(mysql_error()); 
} 
?> 

我收到以下錯誤消息。 列數並不在行1

+0

「調試是第一次編寫代碼的兩倍,因此,如果您儘可能巧妙地編寫代碼,則根據定義,您的調試不夠聰明。」 -Brian Kernighan – 2012-03-07 03:56:29

+0

http://htmlfixit.com/cgi-tutes/tutorial_MySQL_Error_Invalid_Query_Column_Count_Does_Not_Match_Value_Count.php – Ben 2012-03-07 03:58:21

+0

'$ result'從哪裏來?如果來自另一個查詢,請考慮使用['INSERT ... SELECT'語法](http://dev.mysql.com/doc/refman/5.5/en/insert-select.html)或甚至連接。 – Gumbo 2012-03-07 06:54:58

回答

1

匹配值計數如果我沒有記錯的話,每個$row是一個關聯數組,用鑰匙fl_tr,fl_id_tr等

在這種情況下,當你說$row[$i] = '\'' . $row[$i] . '\'';,因爲$row[$i]是空的,所以你完全沒有包含引號。此外,它爲每一行創建了鍵$i,並將其設置爲'',因此您最後會得到數組中的八個總值:四個原始值與關聯鍵以及新數字鍵與斜槓。當然,這會導致列數不匹配。

你可以foreach循環在PHP中做的有趣的事情是foreach($row as $key => $value) {,其中$key$value成爲數組中每個元素的鍵和值。它也適用於數字數組。

所以,你可以用以下替換整個while循環(現有foreach環路):

foreach($row as $key => $value) { 
    $row[$key] = "'$value'"; 
} 

而且希望這應該爲你工作。

編輯:作爲@DCoder指出(見下面的評論),這將是包裝mysql_real_escape_string各地$value如果構建您使用的是數組,當你還沒有逃脫你的價值觀是一個好主意。

+0

大多數情況下都是正確的,但對於sql注入,$ row [$ key] =「'」並不一定是安全的。 mysql_real_escape_string($ value)。 「'」;'或PDO比較好。 – DCoder 2012-03-07 06:02:50

+0

@DCoder我同意,但沒有添加'mysql_real_escape_string',因爲它不在原始問題中,我們也不知道他得到的數組來自哪裏。我將作爲一個註釋編輯它。 – Rick 2012-03-07 06:45:36

相關問題