0

我正在使用他们的 API 将我的网站与另一个网站集成。从其中一个 API 调用中,我想将响应插入到表中。我正在使用 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,它是 API 响应的数组,其中包含文件的文件 ID、文件名、文件大小和 md5 值。我使用以下查询将文件 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_fileid2147483647.

为澄清起见,以下是 API 调用的示例响应:

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

这是相关的数据库行:

在此处输入图像描述

如您所见,rs_fileid列的所有字段值都是相同的,但它们应该是唯一的,并且 API 以唯一值响应。

有人知道会发生什么吗?谢谢你。

4

1 回答 1

2

请注意,2147483647是 32 位有符号整数的最大值——并且您的示例中的文件 ID 明显高于该值。不确定 PHP 将如何处理它,因为这取决于您的 PHP 是 32 位还是 64 位(以及它是否会费心尝试和 intify 数据),但MySQL 会将数字限制在它所用的字段范围内进入.

检查以确保您的数据库列是BIGINT或至少是UNSIGNED INT- 或者,除非您确实需要该列是数字,否则VARCHAR适当长度的字段也可以工作。

于 2012-06-12T18:18:09.867 回答