Хорошо, я думаю, что я пробовал все и читал выделение, но я не могу найти никакого решения. Я пытаюсь создать скрипт, который открывает 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 разрядного целого числа. Я бы предположил, что вы пытаетесь сохранить число, большее, чем это, и оно максимизируется.
2147483647 по совпадению максимально возможное число 32-битного целого. Я бы предположил, что вы пытаетесь сохранить число, большее, чем это, и оно максимизируется. – deceze
@deceze ding ding ding. @Swahjak, измените тип столбца на 'order' на' bigint' – Prisoner
gah даже не заметил, что :) – Dave