Start · Sprachen · PHP · Referenz · mysqli_stmt_send_long_data

mysqli_stmt_send_long_data

Funktion

Sendet Daten für einen gebundenen Parameter blockweise an den MySQL-Server, um sehr große Werte (z. B. BLOBs oder Texte) aufgeteilt zu übertragen.

seit PHP 5.0.0 Kategorie: db

Signatur

mysqli_stmt_send_long_data(mysqli_stmt $statement, int $param_num, string $data): bool

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

Typ
bool
Beschreibung
Gibt 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();
Datei erfolgreich gespeichert. Eingefügte ID: 1

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);
Artikel gespeichert. Zeilen betroffen: 1

// 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.