SQLクエリがおそらく
mysqli_stmtに関心があるかもしれません。 ::send_long_data
これにより、max_allowed_packetより長いパラメーターをチャンクで送信できます。
更新:「どうすれば変更できますか?mysqliを使用することが唯一のオプションですか?」
セッションごとに値を変更することはできません。つまり、サーバー構成を変更できない場合(my.cnfまたは起動パラメータ)値は読み取り専用になります。編集:コメントが示唆しているように、適切な権限
.PDO / PDO_MYSQL(phpversion 5.3.0以降)は見えません send_long_dataをサポートしますが、それについてもわかりません。これにより、mysqli
が残ります。 唯一のオプションとして。最近、 WezFurlong
に気づきました。 スタックオーバーフローに参加しました。彼はPDO実装の作成者の一人なので、知っているかもしれません(ただし、彼はpdo_ mysql を作成していません)。 モジュール)。
(完全にテストされておらず、醜い)例
// $mysqli = new mysqli(....
$fp = fopen($_FILES['binFile']['tmp_name'], 'rb') or die('!fopen');
//$result = $mysqli->query('SELECT @@max_allowed_packet') or die($mysqli->error);
//$chunkSize = $result->fetch_all();
//$chunkSize = $maxsize[0][0];
$chunkSize = 262144; // 256k chunks
$stmt = $mysqli->prepare('INSERT INTO foo (desc, bindata) VALUES (?,?)') or die($mysqli->error);
// silently truncate the description to 8k
$desc = 8192 < strlen($_POST['txtDescription']) ? $_POST['txtDescription'] : substr($_POST['txtDescription'], 0, 8192);
$stmt->bind_param('sb', $desc, null);
while(!feof($fp)) {
$chunk = fread($fp, $chunkSize);
$stmt->send_long_data(1, $chunk) or die('!send_long_data.'.$stmt->error);
}
$result = $stmt->execute();