Signatur
Beschreibung
mysqli_stmt_send_long_data() ermöglicht es, große Datenwerte (z. B. Bilder, Dokumente oder lange Texte) in mehreren Blöcken an den MySQL-Server zu senden, anstatt sie als einzelnen, möglicherweise zu großen Wert zu übermitteln. Dies ist besonders nützlich, wenn der Wert die Grenzen von max_allowed_packet überschreiten würde oder wenn Daten aus einem Stream schrittweise gelesen werden.
Die Funktion muss für denselben Parameter ($param_num) mehrfach aufgerufen werden, bevor mysqli_stmt_execute() ausgeführt wird. Alle gesendeten Blöcke werden serverseitig zusammengesetzt. Der Parameter selbst muss vorher mit mysqli_stmt_bind_param() als b (Binary/BLOB) deklariert werden.
Die Funktion ist Teil der prozeduralen API; im objektorientierten Stil steht die Methode mysqli_stmt::send_long_data() zur Verfügung. Sie gibt true bei Erfolg zurück und false bei einem Fehler.
- Typischer Anwendungsfall: Hochladen großer Dateien in eine BLOB-Spalte
- Daten werden erst beim
execute()-Aufruf tatsächlich gespeichert - Mehrere Blöcke werden serverseitig konkateniert
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $statement Pflicht | mysqli_stmt | Das vorbereitete Statement-Objekt, das mit mysqli_prepare() oder mysqli_stmt_init() erzeugt wurde. |
|
| $param_num Pflicht | int | Nullbasierter Index des Parameters im vorbereiteten Statement, für den die Daten gesendet werden sollen. Der erste Parameter hat den Index 0. |
|
| $data Pflicht | string | Der zu sendende Datenblock als Zeichenkette. Kann binäre Daten enthalten. Weitere Aufrufe mit demselben param_num hängen die Daten serverseitig an. |
Rückgabewert
true zurück, wenn die Daten erfolgreich an den Server gesendet wurden, oder false bei einem Fehler (z. B. Verbindungsproblem oder ungültiger Parameter-Index).Beispiele
Großes Bild blockweise in eine BLOB-Spalte speichern
<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'testdb');
if ($mysqli->connect_errno) {
die('Verbindungsfehler: ' . $mysqli->connect_error);
}
$stmt = $mysqli->prepare('INSERT INTO uploads (filename, filedata) VALUES (?, ?)');
// Parameter binden: s = string, b = blob (long data)
$filename = 'bild.jpg';
$stmt->bind_param('sb', $filename, $blob);
// Datei in Blöcken von 8 KB lesen und senden
$fp = fopen('/pfad/zur/datei/bild.jpg', 'rb');
if ($fp === false) {
die('Datei konnte nicht geöffnet werden.');
}
$chunkSize = 8192; // 8 KB
while (!feof($fp)) {
$chunk = fread($fp, $chunkSize);
if ($chunk === false) break;
mysqli_stmt_send_long_data($stmt, 1, $chunk);
}
fclose($fp);
// Statement ausführen – alle Blöcke werden jetzt zusammengesetzt gespeichert
$stmt->execute();
echo 'Datei erfolgreich gespeichert. Eingefügte ID: ' . $mysqli->insert_id;
$stmt->close();
$mysqli->close();
Langen Text blockweise für eine TEXT-Spalte senden
<?php
$mysqli = mysqli_connect('localhost', 'user', 'password', 'testdb');
if (!$mysqli) {
die('Verbindungsfehler: ' . mysqli_connect_error());
}
$stmt = mysqli_prepare($mysqli, 'INSERT INTO artikel (titel, inhalt) VALUES (?, ?)');
$titel = 'Mein langer Artikel';
mysqli_stmt_bind_param($stmt, 'sb', $titel, $inhalt);
// Simulierter langer Text, der in 3 Blöcken gesendet wird
$block1 = str_repeat('Lorem ipsum ', 1000);
$block2 = str_repeat('dolor sit amet ', 1000);
$block3 = str_repeat('consectetur adipiscing. ', 500);
mysqli_stmt_send_long_data($stmt, 1, $block1);
mysqli_stmt_send_long_data($stmt, 1, $block2);
mysqli_stmt_send_long_data($stmt, 1, $block3);
mysqli_stmt_execute($stmt);
echo 'Artikel gespeichert. Zeilen betroffen: ' . mysqli_stmt_affected_rows($stmt);
mysqli_stmt_close($stmt);
mysqli_close($mysqli);
// Wichtig · Fallstricke
Wichtig: Der Parameter, für den mysqli_stmt_send_long_data() verwendet wird, muss in mysqli_stmt_bind_param() zwingend als Typ b (Binary/BLOB) deklariert sein – auch wenn es sich um Textdaten handelt.
Reihenfolge: Alle Aufrufe von mysqli_stmt_send_long_data() müssen vor dem Aufruf von mysqli_stmt_execute() erfolgen. Nach einem execute() wird der Puffer des Servers geleert; weitere Aufrufe beginnen wieder von vorn.
Blockgröße: Die Blockgröße sollte deutlich unterhalb von max_allowed_packet liegen (standardmäßig 4 MB oder 64 MB), um Verbindungsabbrüche zu vermeiden. Ein typischer Wert sind 8–64 KB pro Block.
Fehlerbehandlung: Bei einem Fehler gibt die Funktion false zurück. Den genauen Fehler erhält man über mysqli_stmt_error() bzw. die Eigenschaft $stmt->error.