2013-12-13 23 views
-5

這裏是代碼...PHP插入值到MySQL數據庫......但它的雙

function create_table($file){ 

    global $my_prepare_sql; 

    $db = new PDO('myloginaccess', 'pasw'); 
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //Error Handling 

    $table_to_make = basename($file,'.TXT'); 

    // delete la table 
    $sql = "DROP TABLE IF EXISTS $table_to_make"; 
    $db->exec($sql); 
    print("Table EXIST and DELETED.<br/>"); 

    $db->exec($my_prepare_sql[$table_to_make]['create']); 
    print("Created table : $table_to_make<br/>"); 

    $stmt = $db->prepare($my_prepare_sql[$table_to_make]['insert']) or die ('prepare FAIL'); 

    //Lire le fichier 
    $handle = fopen($file, "r"); 
    if ($handle) { print("<br/>File Open.<br/>"); } 

    while (($data = fgetcsv($handle)) !== FALSE) { 
     $nb_col = '['.count($data).'] '; 
     $stmt->execute($data); 
    } 

    echo 'Nombre de collonnes : '.$nb_col .'<br/>'; 

    if (fclose($handle)) { print("File closed.<br/>");} 

    return $db; 
} 

,這是表:

//--- BUREAUX -------------------------------------------------------- 
$my_prepare_sql['BUREAUX']['create'] = 
"CREATE TABLE BUREAUX ( 
CODE nvarchar (24), 
FIRME_CODE nvarchar (24), 
NOM_LEGAL nvarchar (80), 
NO_CIVIQUE nvarchar (20), 
NOM_RUE nvarchar (120), 
BUREAU nvarchar (20), 
MUNICIPALITE nvarchar (100), 
PROVINCE nvarchar (20), 
CODE_POSTAL nvarchar (12), 
TELEPHONE_1 nvarchar (40), 
POSTE_1 int, 
TELEPHONE_2 nvarchar (40), 
POSTE_2 int, 
TELEPHONE_FAX nvarchar (40), 
COURRIEL nvarchar (300), 
SITE_WEB nvarchar (300), 
DIRECTEUR_CODE nvarchar (20) 
)"; 

$my_prepare_sql['BUREAUX']['insert'] = 
"INSERT INTO BUREAUX (
CODE, 
FIRME_CODE, 
NOM_LEGAL, 
NO_CIVIQUE, 
NOM_RUE, 
BUREAU, 
MUNICIPALITE, 
PROVINCE, 
CODE_POSTAL, 
TELEPHONE_1, 
POSTE_1, 
TELEPHONE_2, 
POSTE_2, 
TELEPHONE_FAX, 
COURRIEL, 
SITE_WEB, 
DIRECTEUR_CODE) 
values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; 

問題,表中的所有值aa,bb,bb,cc,cc是否爲aa,bb,cc,爲什麼?

+0

這是一個令人驚訝的寫得很糟糕,並提出了一些在SO上享有盛譽的人提出的問題。 –

+0

這不要求基本的調試嗎?在插入之前測試輸出,看看'fgetcsv()'返回什麼? –

+0

你能告訴我什麼是壞的? @scrowler,因爲我使用PDO語法 – menardmam

回答

1

重複兩次相同的數據會指向循環中的錯誤或稱爲兩次(等)的函數。
因此,我們很難調試,因爲我們無法訪問所有涉及的代碼,以便對源數據流執行基本測試,從而獲得雙重數據。

您可以輕鬆地接近它自己:

MySQL是最後一行,在那裏你說的數據被加倍。因此,不要插入到數據庫中,而是要回顯數據,看看它是否會產生相同的問題(我認爲它會)。

如果它不回顯相同的雙重問題,那麼你的問題是在某處的Mysql代碼或Mysql本身。
回答所有與Mysql有關的變數(等),查看問題開始的位置。

如果它回聲出同樣的雙重問題,那麼你已經消除了Mysql。

你知道這與mysql無關(我將假定它不是),然後通過你的代碼回溯。

它是循環嗎?數據容器(數組,變量,對象是什麼)在它中有兩次這些值嗎?
回聲的容器。

源數據是否有兩次?

只能是幾件事情。通過您的代碼回溯並逐一檢查每個階段,您最終將確定問題的起點。

+0

沒有問題是在fetchAll – menardmam

+0

不知道你爲什麼說「不」我把這種可能性包括在我的流程中來檢查。很高興你把它分類。 – James

+0

這幫我找到了BUG:http://www.php。net/manual/en/pdostatement.fetch.php問題是我不知道PDO語法足夠! – menardmam

0

這是我的問題......它不是一個功能錯誤!

http://www.php.net/manual/en/pdostatement.fetchall.php

Fetch all of the remaining rows in the result set: 
Array 
(
    [0] => Array 
     (
      [NAME] => pear 
      [0] => pear 
      [COLOUR] => green 
      [1] => green 
     ) 

    [1] => Array 
     (
      [NAME] => watermelon 
      [0] => watermelon 
      [COLOUR] => pink 
      [1] => pink 
     ) 

) 

我將其改變爲:使用fetchall(PDO :: FETCH_ASSOC);和BINGO

我的天,我討厭PDO符號...太神祕了!