Position actuelle: Accueil> Derniers articles> Quelle est la fonction mysqli_stmt :: send_long_data? Quelle est son utilisation et ses précautions de base?

Quelle est la fonction mysqli_stmt :: send_long_data? Quelle est son utilisation et ses précautions de base?

gitbox 2025-08-28

Quelle est la fonction mysqli_stmt :: send_long_data? Quelle est son utilisation et ses précautions de base?

Dans l'extension MySQLI de PHP, MySQLI_STMT :: SEND_LONG_DATA est une fonction utilisée pour envoyer les mégadonnées (telles que le grand texte, les grandes données binaires, etc.) à une base de données MySQL. Lors de la gestion de l'insertion de données à grande échelle, la méthode conventionnelle Bind_param () peut être limitée par la taille des données, et Send_long_data () est particulièrement importante. Cet article présentera l'utilisation de base de MySQLI_STMT :: Send_long_data et des précautions lors de l'utilisation.

1. Prototype de fonction

 <span><span>mysqli_stmt::</span><span><span class="hljs-title function_ invoke__">send_long_data</span></span><span>(</span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$param_nr</span></span><span>, </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$data</span></span><span>): </span><span><span class="hljs-keyword">bool</span></span><span>
</span></span>
  • $ param_nr : le numéro de paramètre des données à envoyer. Il correspond à la position du ? Payholder dans l'instruction SQL, en comptant à partir de 0.

  • $ data : représente les mégadonnées à envoyer, généralement une grande chaîne ou des données binaires.

Valeur de retour: renvoyez True sur le succès et FAUX en échec.

2. Utilisez des scénarios de Send_long_data

Send_long_data est principalement utilisé pour transférer de grandes quantités de données aux bases de données MySQL. Normalement, MySQLI_STMT :: bind_param () est utilisé pour lier les paramètres, mais si la quantité de données est grande (par exemple, le contenu d'un grand fichier, de grands champs de texte, etc.), il sera limité par max_allowed_packet dans le fichier de configuration PHP. Pour éviter cette limitation, la méthode Send_long_data peut être utilisée pour envoyer des morceaux de données à la base de données MySQL.

3. Utilisation de base

Supposons que nous ayons une table avec la structure suivante:

 <span><span><span class="hljs-keyword">CREATE</span></span><span> </span><span><span class="hljs-keyword">TABLE</span></span><span> files (
    id </span><span><span class="hljs-type">INT</span></span><span> AUTO_INCREMENT </span><span><span class="hljs-keyword">PRIMARY</span></span><span> KEY,
    name </span><span><span class="hljs-type">VARCHAR</span></span><span>(</span><span><span class="hljs-number">255</span></span><span>),
    file_data LONGBLOB
);
</span></span>

Dans ce tableau, nous stockons le nom de fichier et les données binaires de fichiers correspondantes. Nous insérons de grandes données de fichiers via les étapes suivantes.

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// Créer une connexion de base de données</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli</span></span><span>(</span><span><span class="hljs-string">"localhost"</span></span><span>, </span><span><span class="hljs-string">"username"</span></span><span>, </span><span><span class="hljs-string">"password"</span></span><span>, </span><span><span class="hljs-string">"database"</span></span><span>);

</span><span><span class="hljs-comment">// Vérifiez la connexion</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;connect_error) {
    </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"Échec de la connexion: "</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;connect_error);
}

</span><span><span class="hljs-comment">// Préparer SQL Déclaration</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"INSERT INTO files (name, file_data) VALUES (?, ?)"</span></span><span>);

</span><span><span class="hljs-comment">// Lier le premier paramètre(nom de fichier)</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"s"</span></span><span>, </span><span><span class="hljs-variable">$name</span></span><span>);

</span><span><span class="hljs-comment">// Lire les données du fichier</span></span><span>
</span><span><span class="hljs-variable">$filePath</span></span><span> = </span><span><span class="hljs-string">'large_file.txt'</span></span><span>;
</span><span><span class="hljs-variable">$fileData</span></span><span> = </span><span><span class="hljs-title function_ invoke__">file_get_contents</span></span><span>(</span><span><span class="hljs-variable">$filePath</span></span><span>);

</span><span><span class="hljs-comment">// Envoyer les mégadonnées</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">send_long_data</span></span><span>(</span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-variable">$fileData</span></span><span>);

</span><span><span class="hljs-comment">// 设置nom de fichier</span></span><span>
</span><span><span class="hljs-variable">$name</span></span><span> = </span><span><span class="hljs-title function_ invoke__">basename</span></span><span>(</span><span><span class="hljs-variable">$filePath</span></span><span>);

</span><span><span class="hljs-comment">// mettre en œuvre SQL Déclaration</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();

</span><span><span class="hljs-comment">// Fermer la connexion</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

Dans le code ci-dessus, nous lions le nom de fichier ( s représente le type de chaîne) via la méthode bind_param () . Les données de fichier sont envoyées via la méthode Send_long_data () , afin que les données de fichiers grandes puissent être transmises.

4. Le mécanisme de travail de Send_long_data

  • Envoyer des données en morceaux : Send_long_data enverra des données à MySQL en morceaux et ne liera pas toutes les données à la fois comme le Bind_param traditionnel () . Lorsque les données sont grandes, l'utilisation de Send_long_data peut éviter une utilisation excessive de la mémoire et des délais d'exécution PHP.

  • Prend en charge les types de Big Data : Send_long_data est principalement utilisé pour la transmission de données des types Longblob et LongText, en particulier lors du téléchargement ou de l'insertion de fichiers volumineux.

  • Numéro de paramètre : Send_long_data utilise le numéro de paramètre pour identifier le bloc de données à envoyer. Le nombre commence à partir de 0, donc lorsque Send_Long_Data est appelé plusieurs fois, vous devez assurer le numéro de paramètre correct.

5. Choses à noter

  1. Limitations de configuration MySQL : Lorsque vous utilisez SEND_LONG_DATA , vous devez faire attention à la taille du paramètre MAX_ALLOWED_PACKET dans la configuration MySQL. Si les données transmises dépassent cette limite, l'insertion échouera. Vous pouvez vérifier la configuration actuelle via l'instruction SQL suivante:

     <span><span><span class="hljs-keyword">SHOW</span></span><span> VARIABLES </span><span><span class="hljs-keyword">LIKE</span></span><span> </span><span><span class="hljs-string">'max_allowed_packet'</span></span><span>;
    </span></span>

    Si vous devez modifier cette valeur, vous pouvez le modifier dans le fichier de configuration MySQL:

     <span><span><span class="hljs-attr">max_allowed_packet</span></span><span>=</span><span><span class="hljs-number">64</span></span><span>M
    </span></span>
  2. Limitations de configuration PHP : En outre, les paramètres upload_max_filesize et post_max_size dans le fichier de configuration PHP peuvent également limiter la taille des téléchargements de fichiers. Lorsque vous utilisez SEND_LONG_DATA , assurez-vous que ces configurations sont suffisamment grandes.

  3. Paramètre de délai d'expiration pour la connexion de la base de données : Étant donné que Send_long_data transmettra les mégadonnées en morceaux, les opérations à long terme de la base de données peuvent entraîner un délai d'expiration de la connexion. Cela peut être évité en ajustant les paramètres de délai d'expiration pour MySQL ou PHP.

  4. L'ordre de transmission de données : l'ordre de l'appel de Send_long_data est cohérent avec l'ordre des paramètres de liaison. Lorsque plusieurs appels sont effectués, assurez-vous que les données envoyées à chaque fois correspondent au numéro de paramètre correct.

6. Résumé

mysqli_stmt :: send_long_data est une fonction très pratique, en particulier lorsqu'il est nécessaire d'insérer des fichiers volumineux ou des mégadonnées, il peut résoudre efficacement les limites des méthodes de liaison des paramètres traditionnels. En utilisant cette fonction raisonnablement, nous pouvons assurer l'insertion fluide des mégadonnées, tout en évitant le problème de la mémoire insuffisante ou du délai d'expiration de transmission. Cependant, vous devez également faire attention à la configuration pertinente de MySQL et PHP lorsque vous l'utilisez pour garantir que la transmission des données n'est pas limitée.