mysqli_stmt_send_long_data în PHP

Trimite pe bucăți valoarea unui parametru foarte mare (fișier, text lung) înainte de execuție.

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

Ce face mysqli_stmt_send_long_data

Un pachet trimis la MySQL nu poate depăși setarea max_allowed_packet. Pentru valori mari, legi parametrul cu tipul b și o variabilă null, apoi trimiți datele în bucăți cu mysqli_stmt_send_long_data. Bucățile se adună pe server și sunt folosite la mysqli_stmt_execute.

$param_num este poziția semnului ?, începând de la 0.

Parametri

Parametru Descriere
$statement Interogarea pregătită.
$param_num Poziția parametrului, de la 0.
$data Bucata de date trimisă.

Ce returnează

true la succes.

Exemple

Exemplul 1: Salvarea unui fișier mare

Presupunem un tabel fisiere cu o coloană continut de tip LONGBLOB.

<?php
$conn = mysqli_connect("localhost", "ana", "parola_ta", "magazin");

$stmt = mysqli_prepare($conn, "INSERT INTO fisiere (nume, continut) VALUES (?, ?)");
$nume = "catalog.pdf";
$gol = null;
mysqli_stmt_bind_param($stmt, "sb", $nume, $gol);

$f = fopen("catalog.pdf", "rb");
while (!feof($f)) {
    mysqli_stmt_send_long_data($stmt, 1, fread($f, 1024 * 1024));
}
fclose($f);

mysqli_stmt_execute($stmt);
echo "Salvat cu id " . mysqli_stmt_insert_id($stmt);

Rezultat (cu un server MySQL, tabelul fisiere și un fișier catalog.pdf)

Salvat cu id 1

Greșeli frecvente

  • Dai datele direct în variabila legată cu b. Pentru tipul b, valoarea vine doar din send_long_data; variabila trebuie să rămână null.

Comenzi înrudite

  • mysqli_prepare: Pregătește o interogare SQL cu semne ? în loc de valori. Este metoda sigură împotriva SQL injection.
  • mysqli_stmt_reset: Resetează o interogare pregătită: renunță la rândurile necitite și la datele trimise cu send_long_data.