1

わかりました、すべてを試して割り当てを読んだと思いますが、解決策が見つからないようです。XML ファイルを開いてデータベースに読み込むスクリプトを作成しようとしています。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
;";

次に、次のコードでデータベースにロードする必要があります。

$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;
}

しかし、何らかの理由で、オーダー ID は各クエリで同じままです。「on duplicate」ステートメントを削除してこれをテストしたところ、クエリが実行されるたびにこのエラーが表示されます。

警告: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[23000]: 整合性制約違反: 1062 65 行目の* /ECProcessor.phpのキー 'PRIMARY' のエントリ '2147483647' が重複しています

パラメータを何度もチェックしましたが、コードに見られるように、実際には注文IDがエコーされているため、注文IDが変更されていることは間違いありません。他のパラメーターは問題なく変更されているようで、結果の行には、注文 ID を除いて、最後の XML の「行」が行う他のすべてのデータが含まれています。

問題が何であるか、またはその可能性があることを誰かが知っていますか? 前もって感謝します。

解決

@ deceze 2147483647 は、偶然にも 32 ビット整数の可能な最大数です。それよりも大きな数値を保存しようとしていると思いますが、それは最大です。

4

1 に答える 1

-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 />");
    }
}

このようなものは、おそらくループの外側でパラメーターをバインドし、ループ内で変数を割り当てるだけです。

于 2013-06-26T13:01:26.310 に答える