0

API を使用して自分のサイトを別の Web サイトと統合しています。API 呼び出しの 1 つから、応答をテーブルに挿入したいと考えています。cURL を使用して API をクエリし、PDO を使用してそれを MySQL データベースに挿入しています。

関連するコードは次のとおりです。

// Upload the file to RapidShare
$uploadID = mt_rand(1000000000, 9999999999);
$url = 'http://rs' . $uploadServer . '.rapidshare.com/cgi-bin/rsapi.cgi?uploadid=' . $uploadID;
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
$postFields = array('sub' => 'upload',
                    'login' => 'mylogin',
                    'password' => 'mypassword',
                    'uploadid' => $uploadID,
                    'filename' => $filename,
                    'filecontent' => '@' . $targetDir . '/' . $id);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
if(!$resp = curl_exec($ch)) {
    error('upload call failed');
}

$uploadDetails次に、ファイル ID、ファイル名、ファイル サイズ、およびファイルの md5 値を保持する API 応答の配列である変数を呼び出します。次のクエリを使用して、ファイル ID をデータベースに挿入しています。

// Database shinanagans
try {
    $dbh = new PDO('mysql:host=localhost;dbname=mytable', 'root', '');

    $query = 'INSERT INTO `files` (f_id, s_id, u_id, name, size, uploaded, rs_fileid)
              VALUES (?, (SELECT s_id FROM `servers` WHERE name = ? LIMIT 1), (SELECT u_id FROM `users` WHERE username = ?), ?, ?, ?, ?)';

    $sth = $dbh->prepare($query);
    $sth->execute(array($id, $server, 11, $uploadDetails[1], $uploadDetails[2], date('c'), $uploadDetails[0]));

    $dbh = null;
} catch(PDOException $e) {  
    error($e->getMessage());  
} 

各 API 応答には一意のファイル ID があります。それは確かです。また、API 呼び出しから正しい一意のファイル ID が返されていることもわかっています。応答をエコーすることで確認しました。ただし、何らかの理由で、PDO はrs_fileid列の下にこの値を挿入し続けます: 2147483647

明確にするために、API 呼び出しからのサンプル応答を次に示します。

Array
(
    [0] => 3294575677
    [1] => Untitled_1.png
    [2] => 478923
    [3] => ae83e53e5bf26406715daed0d44adc45
)

関連するデータベース行は次のとおりです。

ここに画像の説明を入力

ご覧のとおり、rs_fileid一意である必要がある列のすべてのフィールド値が同じであり、API は一意の値で応答しています。

何が起こっているのか知っている人はいますか?ありがとうございました。

4

1 に答える 1

2

2147483647は 32 ビットの符号付き整数の最大値であり、サンプルのファイル ID はそれを大幅に上回っていることに注意してください。PHP が 32 ビットか 64 ビットか (および、データをインティファイしようとするのが面倒かどうか) に依存するため、PHP がそれをどのように処理するかについてはわかりませんが、MySQL は数値をフィールドの範囲にクランプします。に

BIGINTデータベースの列が aまたは少なくともUNSIGNED INT-- または、その列が数値である必要が本当にない限りVARCHAR、適切な長さのフィールドも同様に機能することを確認してください。

于 2012-06-12T18:18:09.867 に答える