LOAD DATA LOCAL INFILE コマンド用のコールバック関数を設定する

# mysqli::set_local_infile_handler

# mysqli_set_local_infile_handler

(PHP 5, PHP 7)

mysqli::set_local_infile_handler -- mysqli_set_local_infile_handler — LOAD DATA LOCAL INFILE コマンド用のコールバック関数を設定する

### 説明

オブジェクト指向型

mysqli::set_local_infile_handler ( mysqli `$link` , callable `$read_func` ) : bool

手続き型

mysqli_set_local_infile_handler ( mysqli `$link` , callable `$read_func` ) : bool

LOAD DATA LOCAL INFILE コマンド用のコールバック関数を設定します。

コールバック関数では、LOAD DATA LOCAL INFILE で指定したファイルの内容を読み込んで、それを LOAD DATA INFILE で使用できる形式に変換します。

返されるデータは、 LOAD DATA で指定した書式にマッチする必要があります。

### パラメータ

`link`

  手続き型のみ: mysqli_connect() あるいは mysqli_init() が返すリンク ID。

`read_func`

  以下のパラメータを受け取るコールバック関数あるいはオブジェクトのメソッド。

  `stream`

    SQL の INFILE コマンドに関連付けられた PHP ストリーム

  `&buffer`

    入力を書き換えた内容を保存する文字列バッファ

  `buflen`

    バッファに格納する最大文字数

  `&errormsg`

    エラーが発生した場合にエラーメッセージを保存する場所

コールバック関数の返り値は、`buffer` に書き込んだ文字数となります。エラー発生時は負の値を返します。

### 返り値

成功した場合に `TRUE` を、失敗した場合に `FALSE` を返します。

### 例

例1 mysqli::set_local_infile_handler() の例

オブジェクト指向型

`<?php
$db = mysqli_init();
$db->real_connect("localhost","root","","test");
function callme($stream, &$buffer, $buflen, &$errmsg)
{
$buffer = fgets($stream);
echo $buffer;
// 大文字に変換し、"," を [TAB] に変換します
$buffer = strtoupper(str_replace(",", "\t", $buffer));
return strlen($buffer);
}
echo "Input:\n";
$db->set_local_infile_handler("callme");
$db->query("LOAD DATA LOCAL INFILE 'input.txt' INTO TABLE t1");
$db->set_local_infile_default();
$res = $db->query("SELECT * FROM t1");
echo "\nResult:\n";
while ($row = $res->fetch_assoc()) {
echo join(",", $row)."\n";
}
?>`

手続き型

`<?php
$db = mysqli_init();
mysqli_real_connect($db, "localhost","root","","test");
function callme($stream, &$buffer, $buflen, &$errmsg)
{
$buffer = fgets($stream);
echo $buffer;
// 大文字に変換し、"," を [TAB] に変換します
$buffer = strtoupper(str_replace(",", "\t", $buffer));
return strlen($buffer);
}
echo "Input:\n";
mysqli_set_local_infile_handler($db, "callme");
mysqli_query($db, "LOAD DATA LOCAL INFILE 'input.txt' INTO TABLE t1");
mysqli_set_local_infile_default($db);
$res = mysqli_query($db, "SELECT * FROM t1");
echo "\nResult:\n";
while ($row = mysqli_fetch_assoc($res)) {
echo join(",", $row)."\n";
}
?>`

上の例の出力は以下となります。

    Input:
    23,foo
    42,bar

    Output:
    23,FOO
    42,BAR

### 参考

- mysqli_set_local_infile_default() - load local infile コマンド用のユーザー定義ハンドラを削除する