Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Upload-Größenproblem in PHP und MySql

Ihre SQL-Abfrage überschreitet wahrscheinlich das max_allowed_packet Größe, in diesem Fall trennt sich der Server.
Sie könnten an mysqli_stmt interessiert sein ::send_long_data Dadurch können Sie Parameter, die länger als max_allowed_packet sind, in Blöcken senden.

Update:"Wie kann ich es ändern? Ist die Verwendung von mysqli die einzige Option?"
Afaik, der Wert kann nicht pro Sitzung geändert werden, d.h. wenn Sie die Serverkonfiguration nicht ändern können (my.cnf oder Startparameter) ist der Wert schreibgeschützt. Bearbeiten:Wie der Kommentar andeutet, können Sie den globalen Wert des MySQL-Servers ändern, nachdem er gestartet wurde, wenn Sie die richtigen Berechtigungen .PDO/PDO_MYSQL (ab phpversion 5.3.0) scheint nicht send_long_data zu unterstützen, aber da bin ich mir auch nicht sicher. Das würde mysqli übrig lassen als einzige Möglichkeit. Mir ist kürzlich aufgefallen, dass Wez Furlong Verbundener Stapelüberlauf. Da er einer der Autoren der PDO-Implementierung ist, weiß er es vielleicht (obwohl er nicht die Datei pdo_mysql geschrieben hat Modul).

(Völlig ungetestetes und hässliches) Beispiel

// $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();