PHPのmysqli拡張機能では、 mysqli_stmt :: send_long_dataは、 MySQLデータベースにビッグデータ(大きなテキスト、大きなバイナリデータなど)を送信するために使用される関数です。大規模なデータ挿入を処理する場合、従来のbind_param()メソッドはデータサイズによって制限される場合があり、 send_long_data()が特に重要です。この記事では、mysqli_stmt :: send_long_dataの基本的な使用法と使用時の予防策を紹介します。
<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を返します。
send_long_dataは、主に大量のデータをMySQLデータベースに転送するために使用されます。通常、 mysqli_stmt :: bind_param()はパラメーターのバインドに使用されますが、データの量が大きい場合(たとえば、大きなファイル、大きなテキストフィールドなどのコンテンツなど)、PHP構成ファイルのmax_allowed_packetによって制限されます。この制限を回避するために、 send_long_dataメソッドを使用して、MySQLデータベースにデータのチャンクを送信できます。
次の構造を持つテーブルがあるとします。
<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"><?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>->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>->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>-></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>-></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>-></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>-></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>-></span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
上記のコードでは、ファイル名( sは文字列タイプを表します)をbind_param()メソッドにバインドします。ファイルデータは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が複数回呼び出される場合、正しいパラメーター番号を確認する必要があります。
MySQL構成の制限: send_long_dataを使用する場合、mysql構成のmax_allowed_packetパラメーターのサイズに注意を払う必要があります。送信されたデータがこの制限を超えると、挿入が失敗します。次の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>
PHP構成の制限:さらに、PHP構成ファイルのupload_max_filesizeおよびpost_max_sizeパラメーターも、ファイルアップロードのサイズを制限する場合があります。 send_long_dataを使用する場合、これらの構成が十分に大きいことを確認してください。
データベース接続のタイムアウト設定: send_long_dataはチャンクでビッグデータを送信するため、長期データベース操作が接続タイムアウトを引き起こす可能性があります。これは、MySQLまたはPHPのタイムアウト設定を調整することで回避できます。
データ送信の順序: send_long_dataの呼び出し順序は、バインディングパラメーターの順序と一致しています。複数の呼び出しが行われたら、毎回送信されるデータが正しいパラメーター番号に対応することを確認してください。
mysqli_stmt :: send_long_dataは非常に実用的な機能です。特に、大規模なファイルやビッグデータを挿入する必要がある場合は、従来のパラメーター結合方法の制限を効果的に解決できます。この機能を合理的に使用することにより、メモリやトランスミッションタイムアウトが不十分な問題を回避しながら、ビッグデータのスムーズな挿入を確保できます。ただし、データ送信が制限されていないことを確認するために、MySQLとPHPの関連する構成にも注意を払う必要があります。