2013-06-26 3 views
1

Хорошо, я думаю, что я пробовал все и читал выделение, но я не могу найти никакого решения. Я пытаюсь создать скрипт, который открывает 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 остается неизменным для каждого запроса. Я проверил это путем удаления «на дубликат» заявления и показывает эту ошибку каждый раз запрос выполняется:

Внимание: PDOStatement :: Execute() [pdostatement.execute]: SQLSTATE [23000] : Целостность нарушение ограничения: 1062 Дублированного запись «2147483647» для ключа «PRIMARY» в * /ECProcessor.php по линии 65

Я снова и снова проверил параметры и, как видно в коде на самом деле эхо идентификатор заказа, поэтому я абсолютно уверен, что идентификатор заказа меняется. Другие параметры, похоже, очень хорошо меняются, и в результате строка содержит все другие данные, которые последняя строка XML содержит только идентификатор заказа.

Кто-нибудь знает, в чем проблема/может быть? Заранее спасибо.

Решение

@deceze 2147483647 является совпадению максимально возможное количество 32 разрядного целого числа. Я бы предположил, что вы пытаетесь сохранить число, большее, чем это, и оно максимизируется.

+3

2147483647 по совпадению максимально возможное число 32-битного целого. Я бы предположил, что вы пытаетесь сохранить число, большее, чем это, и оно максимизируется. – deceze

+2

@deceze ding ding ding. @Swahjak, измените тип столбца на 'order' на' bigint' – Prisoner

+0

gah даже не заметил, что :) – 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 вне цикла, то просто присвоить переменные внутри цикла.

Смежные вопросы