Position actuelle: Accueil> Derniers articles> Quelles sont les erreurs courantes lors de l'utilisation de mysqli_stmt :: send_long_data? Comment le localiser et le résoudre rapidement?

Quelles sont les erreurs courantes lors de l'utilisation de mysqli_stmt :: send_long_data? Comment le localiser et le résoudre rapidement?

gitbox 2025-08-16

1. Erreur 1: L'ordre d'appel de Send_long_data est incorrect


mysqli_stmt :: send_long_data doit être appelé avant l'exécution de l'instruction. Si vous essayez d'utiliser SEND_LONG_DATA après avoir appelé EXECUTE () , une erreur se produira. Les messages d'erreur courants incluent:

  • AVERTISSEMENT: mysqli_stmt :: send_long_data () s'attend à ce que le paramètre 1 soit une ressource, null donné.

Cette erreur est due au fait que la poignée de l'instruction SQL n'est pas correctement préparée lorsque SEND_LONG_DATA est appelée.

Solution <br> Assurez-vous d'utiliser Send_long_data pour transmettre de longues données avant d'exécuter des instructions SQL. L'ordre correct doit être:

 <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 large_data (content) VALUES (?)"</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">$data</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">0</span></span><span>, </span><span><span class="hljs-variable">$largeData</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__">execute</span></span><span>();  </span><span><span class="hljs-comment">// Instruction d&#39;exécution</span></span><span>
</span></span>

2. Erreur 2: Index de paramètres incorrect

Description du problème
send_long_data nécessite que l'index du paramètre soit spécifié correctement. Par exemple, s'il y a plusieurs espaces réservés dans une instruction SQL, l'indice de paramètre correct doit être passé.

  • AVERTISSEMENT: mysqli_stmt :: send_long_data () s'attend à ce que le paramètre 1 soit une ressource, null donné.

Cette erreur se produit généralement lorsqu'aucun index correct n'est spécifié, ce qui fait que PHP ne localise pas correctement les données.

Solution <br> Assurez-vous que l'index est spécifié correctement dans Send_long_data . L'index commence généralement à 0, indiquant le premier affichage dans l'instruction SQL. Par exemple:

 <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 large_data (content) VALUES (?)"</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">$data</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">0</span></span><span>, </span><span><span class="hljs-variable">$largeData</span></span><span>);  </span><span><span class="hljs-comment">// Passez correctement les données longues pour le premier espace personnel</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>

3. Erreur 3: La taille des données dépasse la limite de configuration MySQL

Description du problème
mysqli_stmt :: send_long_data est utilisé pour traiter les mégadonnées, mais si les données dépassent la taille maximale des données définies dans la configuration de MySQL, cela entraînera une défaillance de la transmission. Cela se manifeste généralement comme un message d'erreur:

  • Erreur MySQL: données trop longs pour la colonne.

Cette erreur est généralement liée au paramètre MAX_ALLOWED_PACKET , une option dans le fichier de configuration MySQL qui contrôle la taille maximale des paquets pour un seul envoi.

Solution <br> Pour résoudre ce problème, vous devez d'abord vérifier et ajuster le paramètre MAX_ALLOWED_PACKET dans le fichier de configuration MySQL. Vous pouvez afficher la configuration actuelle via la commande 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 la valeur actuelle est petite, vous pouvez ajouter la valeur de ce paramètre au fichier my.cnf ou my.ini et redémarrer le service 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>

4. Erreur 4: Déliachance du type de données

Description du problème
Lorsque SEND_LONG_DATA est utilisé pour envoyer des données longues, il est nécessaire de s'assurer que le type de données passées correspond au type d'espace réservé dans l'instruction SQL. Par exemple, si le type d'espace réservé est BLOB , les données passées doivent être des données binaires.

Si les types de données ne correspondent pas, une erreur peut être causée, par exemple:

  • AVERTISSEMENT: mysqli_stmt :: send_long_data () s'attend à ce que le paramètre 2 soit une chaîne, ressource donnée.

Solution <br> Assurez-vous que le type de données passés est cohérent avec le type d'espace réservé dans l'instruction SQL. Si le type de placement est une ( s ) chaîne (s), les données doivent être une chaîne; S'il s'agit de données binaires ( b ), les données doivent être en format binaire.

 <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 large_data (file_content) VALUES (?)"</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">"b"</span></span><span>, </span><span><span class="hljs-variable">$binaryData</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">0</span></span><span>, </span><span><span class="hljs-variable">$binaryData</span></span><span>);  </span><span><span class="hljs-comment">// Envoyer des données binaires</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>

5. Erreur 5: La connexion n'est pas active ou expirée

Description du problème
Send_long_data doit conserver une connexion de base de données active, ce qui entraînera une erreur si la connexion a chronométré ou est fermée pendant l'exécution. Le message d'erreur peut être:

  • Erreur: Connexion perdue à MySQL Server pendant la requête.

Ce problème se produit généralement lorsque la base de données n'est pas fonctionnelle pendant longtemps, ou lorsqu'une grande quantité de données est téléchargée, la connexion est interrompue.

Solution <br> Pour éviter les délais de connexion, assurez-vous que la connexion de la base de données reste active pendant le fonctionnement. Si le temps de transfert de données est long, vous pouvez éviter le délai d'attente en ajustant MAX_EXECUTURE_TRE DE PHP ou Wait_timeout de MySQL.

 <span><span><span class="hljs-title function_ invoke__">ini_set</span></span><span>(</span><span><span class="hljs-string">'max_execution_time'</span></span><span>, </span><span><span class="hljs-number">300</span></span><span>);  </span><span><span class="hljs-comment">// PHP Temps d&#39;exécution maximum 5 minute</span></span><span>
</span></span>

Dans le même temps, il est également possible d'envisager le traitement par lots lors de l'envoi d'une grande quantité de données pour éviter d'envoyer trop de données à la fois et provoquer une perte de connexions.

6. Erreur 6: Paramètres non liés correctement

Description de la question <br> Lors de l'exécution des instructions SQL, tous les paramètres doivent être correctement liés. Si une erreur se produit lorsque les paramètres de liaison, cela peut faire en sorte que SEND_LONG_DATA ne fonctionne pas correctement. Par exemple, si le paramètre de liaison Bind_Param est utilisé, mais que les données ne sont pas passées avec succès, un problème se produira.

Solution <br> Assurez-vous qu'avant d'exécuter l'instruction SQL, utilisez Bind_param pour lier correctement tous les paramètres nécessaires et vérifier la valeur de retour pour confirmer que la liaison est réussie.

 <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 large_data (content) VALUES (?)"</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">$data</span></span><span>);
</span><span><span class="hljs-keyword">if</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-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">0</span></span><span>, </span><span><span class="hljs-variable">$largeData</span></span><span>);  </span><span><span class="hljs-comment">// Assurez-vous d&#39;envoyer des données longues après les paramètres de liaison</span></span><span>
}
</span></span>