2010-06-02 44 views
2

認爲(標題)是我遇到的問題。我建立了一個MySQL連接,我讀了一個XML文件,然後通過遍歷元素將這些值插入表中。問題是,不是隻插入1條記錄,有時我插入2或3或4.這似乎取決於我讀過的以前的值。我想我正在重新初始化變量,但我想我錯過了一些東西 - 希望有一些簡單的東西。如何防止PHP變量成爲數組或對象?

這是我的代碼。我原本有20列,但我縮短了包含的版本,使其更易於閱讀。

$ctr = 0; 
$sql = "insert into csd (id,type,nickname,hostname,username,password) ". 
     "values (?,?,?,?,?,?)"; 
$cur = $db->prepare($sql); 

for ($ctr = 0; $ctr < $expected_count; $ctr++) { 
    unset($bind_vars,$dat); 

    $lbl = "csd_{$ctr}"; 

    $dat['type']  = (string) $ref->itm->csds->$lbl->type; 
    $dat['nickname'] = (string) $ref->itm->csds->$lbl->nickname; 
    $dat['hostname'] = (string) $ref->itm->csds->$lbl->hostname; 
    $dat['username'] = (string) $ref->itm->csds->$lbl->username; 
    $dat['password'] = (string) $ref->itm->csds->$lbl->password; 

    $bind_vars = array($id,$dat['$type'], $dat['$nickname'], $dat['$hostname'], 
         $dat['$username'], $dat['$password']); 
    print_r ($bind_vars); 
    $res = $db->execute($cur, $bind_vars); 
} 

P.S.我還爲這個SimpleXML添加了標籤,因爲這就是我正在閱讀該文件的方式,儘管上面沒有包含該代碼。它看起來像這樣:

$ref = simplexml_load_file($file); 

更新:我身邊改變了代碼按照建議,現在它並不總是相同的模式,但同樣打破了。當我在插入之前顯示綁定數組時,它看起來像這樣。請注意,我前後也算行,所以有0行,然後我插入1,則有2個:

0 CSDs on that ITEM now. 
Array 
(
    [0] => 2 
    [1] => 0 
    [2] => 
    [3] => X 
    [4] => XYZ 
    [5] => 
    [6] => 
    [7] => 
    [8] => audio 
    [9] => 
    [10] => 192.168.0.50 
    [11] => 192.168.0.3 
    [12] => 255.255.255.0 
    [13] => 255.255.255.0 
    [14] => 
    [15] => 
    [16] => 
    [17] => 21 
    [18] => 5 
    [19] => Y 
    [20] => /dir 
) 
2 CSDs on that ITEM now. 
+0

什麼是輸出應該是&錯誤在哪裏? – apis17 2010-06-02 13:16:39

+0

執行'print_r($ bind_vars)'並檢查數組是否正確。 – 2010-06-02 13:16:56

+0

我最初的想法是,如果我可以將這些變量聲明爲INTEGERS和STRINGS,那麼我就不會將它們自動成爲數組的問題,只是因爲我向它們添加了另一個值。但是,我可能會錯過一些東西。 – MJB 2010-06-02 13:17:18

回答

0

不知道確切的答案,但是這也許有助於

$ctr = 0; 
$sql = "insert into csd (id,type,nickname,hostname,username,password) ". 
     "values (?,?,?,?,?,?)"; 
$cur = $db->prepare($sql); 

for ($ctr = 0; $ctr < $expected_count; $ctr++) { 

    //list ( $lbl, $type, $nickname, $hostname, $username, $password) = ""; 
    //$bind_vars = array(); 
    // use unset 
    unset($bind_vars,$dat); 

    $lbl = "csd_{$ctr}"; 

    $dat['type']  = $ref->itm->csds->$lbl->type; 
    $dat['nickname'] = $ref->itm->csds->$lbl->nickname; 
    $dat['hostname'] = $ref->itm->csds->$lbl->hostname; 
    $dat['username'] = $ref->itm->csds->$lbl->username; 
    $dat['password'] = $ref->itm->csds->$lbl->password; 

    $bind_vars = array($id,$dat['$type'],$dat['$nickname'],$dat['$hostname'],$dat['$username'],$dat['$password']); 
    $res = $db->execute($cur, $bind_vars); 

    # this is a separate function which works, but which only 
    # does SELECTS and cannot be the problem. I include it because I 
    # want to count the total rows. 

    printf ("%d CSDs on that ITEM now.\n", CountCSDs($id_to_sync)); 
} 

或者你應該首先檢查/回顯$expected_count值以確定正確的計數

+0

我檢查了預期的計數,它是正確的。所以我循環正確的次數 - 這只是我每次插入太多記錄。你的答案是否意味着未設置比僅設置值「」更好?我會試試看。 – MJB 2010-06-02 13:36:06

+0

完全相同的行爲。我有一個expected_count爲5的XML文件,每個插入後的計數變爲2,4,5,8,9。它應該去1,2,3,4,5。 – MJB 2010-06-02 13:50:06

+0

只是一個想法。我不確定,但如果失敗了,也許還有另一種方法,如果你能給我另一個線索,說明發生什麼事情和結果應該是什麼。 – apis17 2010-06-02 13:51:24

0

原來腳本是由cron作業運行的,但是有人在用另一個cron作業運行我的腳本,因此它有時會創建兩次儘可能多的記錄,有時卻不是噸。而且我看到的越多,創建的代碼越難以解決,它得到的速度越慢,所以它越糟糕。

換句話說,當我沒有看它時,它比我看過它的時候效果更好。

幫助所有那些試圖幫助我的人!

+0

這是正確的答案,但我接受了上面的答案,因爲這樣做可以讓我看到更好的情況,這讓我發現它運行了兩次。由於其他用戶正在寫入不同的日誌文件,因此我沒有馬上注意到。 – MJB 2010-06-02 19:48:05

+0

終於!它是同時工作和運行的。也許我們下次應該照顧cron工作:) – apis17 2010-06-03 03:26:48

+0

是的,我看了劇本的存放位置,但是和其他cron作業不同,所以我錯過了。 – MJB 2010-06-03 03:54:01