現在の位置: ホーム> 最新記事一覧> mysqli_stmt :: send_long_data関数は何ですか?その基本的な使用法と予防策は何ですか?

mysqli_stmt :: send_long_data関数は何ですか?その基本的な使用法と予防策は何ですか?

gitbox 2025-08-28

mysqli_stmt :: send_long_data関数は何ですか?その基本的な使用法と予防策は何ですか?

PHPのmysqli拡張機能では、 mysqli_stmt :: send_long_dataは、 MySQLデータベースにビッグデータ(大きなテキスト、大きなバイナリデータなど)を送信するために使用される関数です。大規模なデータ挿入を処理する場合、従来のbind_param()メソッドはデータサイズによって制限される場合があり、 send_long_data()が特に重要です。この記事では、mysqli_stmt :: send_long_dataの基本的な使用法と使用時の予防策を紹介します。

1。関数プロトタイプ

<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 :送信されるデータのパラメーター番号。それは?の位置に対応しますか? SQLステートメントのプレースホルダー。0からカウントされます。

  • $データ:送信されるビッグデータ、通常は大きな文字列またはバイナリデータを表します。

返品値:成功の真のリターン、および失敗にfalseを返します。

2。send_long_dataのシナリオを使用します

send_long_dataは、主に大量のデータをMySQLデータベースに転送するために使用されます。通常、 mysqli_stmt :: bind_param()はパラメーターのバインドに使用されますが、データの量が大きい場合(たとえば、大きなファイル、大きなテキストフィールドなどのコンテンツなど)、PHP構成ファイルのmax_allowed_pa​​cketによって制限されます。この制限を回避するために、 send_long_dataメソッドを使用して、MySQLデータベースにデータのチャンクを送信できます。

3。基本的な使用法

次の構造を持つテーブルがあるとします。

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

この表には、ファイル名と対応するファイルバイナリデータを保存します。次の手順に大きなファイルデータを挿入します。

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// データベース接続を作成します</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">// 接続を確認してください</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">"接続に失敗しました: "</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;connect_error);
}

</span><span><span class="hljs-comment">// 準備する SQL 声明</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">// 最初のパラメーターをバインドします(ファイル名)</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">// ファイルデータを読み取ります</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">// ビッグデータを送信します</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">// 设置ファイル名</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">// 埋め込む SQL 声明</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">// 接続を閉じます</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>

上記のコードでは、ファイル名( sは文字列タイプを表します)をbind_param()メソッドにバインドします。ファイルデータはsend_long_data()メソッドを介して送信されるため、大きなファイルデータを送信できます。

4. send_long_dataの作業メカニズム

  • チャンクでデータを送信するsend_long_dataはチャンクでmysqlにデータを送信し、従来のbind_param()のようにすべてのデータを一度にバインドしません。データが大きい場合、 send_long_dataを使用すると、過度のメモリ使用量とPHP実行時間制限を回避できます。

  • ビッグデータのサポートsend_long_dataは、特に大きなファイルをアップロードまたは挿入する場合、主にLongblobおよびLongtextタイプのデータ送信に使用されます。

  • パラメーター番号send_long_dataパラメーター番号を使用して、送信されるデータブロックを識別します。数値は0から始まるため、 send_long_dataが複数回呼び出される場合、正しいパラメーター番号を確認する必要があります。

5。注意すべきこと

  1. MySQL構成の制限send_long_dataを使用する場合、mysql構成のmax_allowed_pa​​cketパラメーターのサイズに注意を払う必要があります。送信されたデータがこの制限を超えると、挿入が失敗します。次のSQLステートメントを使用して、現在の構成を確認できます。

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

    この値を変更する必要がある場合は、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. PHP構成の制限:さらに、PHP構成ファイルのupload_max_filesizeおよびpost_max_sizeパラメーターも、ファイルアップロードのサイズを制限する場合があります。 send_long_dataを使用する場合、これらの構成が十分に大きいことを確認してください。

  3. データベース接続のタイムアウト設定send_long_dataはチャンクでビッグデータを送信するため、長期データベース操作が接続タイムアウトを引き起こす可能性があります。これは、MySQLまたはPHPのタイムアウト設定を調整することで回避できます。

  4. データ送信の順序send_long_dataの呼び出し順序は、バインディングパラメーターの順序と一致しています。複数の呼び出しが行われたら、毎回送信されるデータが正しいパラメーター番号に対応することを確認してください。

6。概要

mysqli_stmt :: send_long_dataは非常に実用的な機能です。特に、大規模なファイルやビッグデータを挿入する必要がある場合は、従来のパラメーター結合方法の制限を効果的に解決できます。この機能を合理的に使用することにより、メモリやトランスミッションタイムアウトが不十分な問題を回避しながら、ビッグデータのスムーズな挿入を確保できます。ただし、データ送信が制限されていないことを確認するために、MySQLとPHPの関連する構成にも注意を払う必要があります。