sql >> データベース >  >> RDS >> Mysql

PHPとMySqlでのアップロードサイズの問題

    SQLクエリがおそらく max_allowed_pa​​cket サイズこの場合、サーバーは切断されます。
    mysqli_stmtに関心があるかもしれません。 ::send_long_data これにより、max_allowed_pa​​cketより長いパラメーターをチャンクで送信できます。

    更新:「どうすれば変更できますか?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();
    


    1. OSX10.7Lion上のMySQLgem

    2. リーダーが閉じているときに読み取りが無効になります

    3. SQLServerレプリケーションのセットアップと構成

    4. SQLで小数点以下2桁に丸める