2013-06-26 28 views
1

好吧,我認爲我已經嘗試了一切,閱讀Allot,但我似乎無法找到任何解決方案。我試圖創建一個腳本來打開一個XML文件並將其讀入我的數據庫。我發現了PHP PDO,因此我決定嘗試並使用它,但這會讓我失望。PHP PDO綁定問題

我創建以下數據庫表:

$sql = " 
DROP TABLE IF EXISTS eve_market_data; 
CREATE TABLE eve_market_data 
(
    `order` INT NOT NULL, 
    `region` INT NOT NULL, 
    `station` INT NOT NULL, 
    `range` INT, 
    `price` FLOAT(12,2) NOT NULL, 
    `vol_remain` INT, 
    `min_volume` INT, 
    `expires_date` DATE, 
    `reported_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `sell` INT NOT NULL, 
    PRIMARY KEY(`order`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8;"; 

下面的查詢應足以將數據加載到數據庫(據我所知雲):

$sql = " 
INSERT INTO `eve_market_data` 
(`order`, `region`, `station`, `range`, `price`, `vol_remain`, `min_volume`, `expires_date`, `reported_time`,`sell`) 
VALUES 
(
    :orderid, 
    :regionid, 
    :stationid, 
    :range, 
    :price, 
    :volremain, 
    :minvolume, 
    :expires, 
    :reportedtime, 
    :sell 
) 
ON DUPLICATE KEY UPDATE 
    `range` = :range, 
    `price` = :price, 
    `vol_remain` = :volremain, 
    `min_volume` = :minvolume, 
    `expires_date` = :expires, 
    `reported_time` = :reportedtime 
;"; 

然後下面的代碼應該加載到db:

$sth = $db->prepare($sql); 

for($i = 0; $i < count($so->order); $i++) 
{ 
$order = $so->order[$i]; 

echo "[{$i}] Inserting... " . $order['id']; 

$sth->bindParam(':orderid', $orderid = (int) $order['id']); 
$sth->bindParam(':regionid', $regionid = (int) $order->region); 
$sth->bindParam(':stationid', $stationid = (int) $order->station); 
$sth->bindParam(':range', $range = (int) $order->range); 
$sth->bindParam(':price', $price = (float) $order->price); 
$sth->bindParam(':volremain', $volremain = (int) $order->vol_remain); 
$sth->bindParam(':minvolume', $minvolume = (int) $order->min_volume); 
$sth->bindParam(':expires', $expires = (string) $order->expires); 
$sth->bindParam(':reportedtime', $reporttime = date('Y') . "-" . (string) $order->reported_time); 
$sth->bindParam(':sell', $sell = 1); 

if($sth->execute()) echo '<br/>Executed'; 

echo "<br/><br/>"; 

if($i === 7) break; 
} 

但由於某種原因,我的命令I D對於每個查詢都保持不變。我已經通過刪除'on duplicate'語句來測試它,並且每次執行查詢時都會顯示此錯誤:

警告:PDOStatement :: execute()[pdostatement.execute]:SQLSTATE [23000] :完整性約束違規:1062重複條目「2147483647」的關鍵「主要」在* /ECProcessor.php第65行

我一遍遍檢查的參數,並在代碼中看到它實際上是呼應的訂單ID,所以我絕對確定訂單ID正在改變。其他參數似乎更改得很好,生成的行包含除訂單ID以外的最後一個XML「行」所具有的所有其他數據。

有人知道問題是/可能是什麼嗎?提前致謝。

2147483647 @deceze是巧合的一個32位整數的最大可能的數目。我猜你試圖存儲一個比這個數字更大的數字,並且它在那裏最大。

+3

2147483647是巧合的一個32位整數的最大可能的數目。我猜你試圖存儲一個比這個數字更大的數字,並且它在那裏最大。 – deceze

+2

@deceze丁丁丁。 @Swahjak,爲'order'字段類型更改爲'bigint' – Prisoner

+0

嘎甚至沒有注意到:) – Dave

回答

-1
$sth = $db->prepare($sql); 

$sth->bindParam(':orderid', $orderid); 
$sth->bindParam(':regionid', $regionid); 
$sth->bindParam(':stationid', $stationid); 
$sth->bindParam(':range', $range); 
$sth->bindParam(':price', $price); 
$sth->bindParam(':volremain', $volremain); 
$sth->bindParam(':minvolume', $minvolume); 
$sth->bindParam(':expires', $expires); 
$sth->bindParam(':reportedtime', $reporttime); 
$sth->bindParam(':sell', $sell); 

for($i = 0; $i < count($so->order); $i++) { 
    $order = $so->order[$i]; 
    echo "[{$i}] Inserting... " . $order['id']; 

    $orderid = (int) $order['id']; 
    $regionid = (int) $order->region; 
    $stationid = (int) $order->station; 
    $range = (int) $order->range; 
    $price = (float) $order->price; 
    $volremain = (int) $order->vol_remain; 
    $minvolume = (int) $order->min_volume; 
    $expires = (string) $order->expires; 
    $reporttime = date('Y') . "-" . (string) $order->reported_time; 
    $sell = 1; 

    try { 
     $sth->execute(); 
     echo "executed successfully <br />"; 
    catch Exception $e) { 
     die("Oh noes! There's an error in the query!<br />"); 
    } 
} 

像這樣的事情也許綁定環路外的PARAMS然後就分配循環內的變量。