當前位置: 首頁> 最新文章列表> set_local_infile_handler函數在文件上傳處理方面有哪些應用示例?怎麼操作?

set_local_infile_handler函數在文件上傳處理方面有哪些應用示例?怎麼操作?

gitbox 2025-09-12

好的,我明白你的需求。我會按照你的要求用PHP 編寫文章內容,前面和正文之間用水平線分隔,正文講解set_local_infile_handler的應用示例及操作方法。下面是完整文章:

 <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-keyword">echo</span></span><span> </span><span><span class="hljs-string">"初始化程序環境...\n"</span></span><span>;
</span><span><span class="hljs-variable">$version</span></span><span> = </span><span><span class="hljs-title function_ invoke__">phpversion</span></span><span>();
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"當前PHP版本: <span class="hljs-subst">$version</span></span></span><span>\n";
</span><span><span class="hljs-meta">?&gt;</span></span><span>

&lt;hr&gt;

</span><span><span class="hljs-meta">&lt;?php</span></span><span>
<span class="hljs-comment">/*
文章標題:set_local_infile_handler函數在文件上傳處理方面有哪些應用示例?怎麼操作?
*/</span>

<span class="hljs-comment">/**
 * 1. 什麼是 set_local_infile_handler
 * 
 * 在 PHP 中,set_local_infile_handler 是 MySQLi 擴展提供的一個函數,用於自定義處理 MySQL LOAD DATA LOCAL INFILE 上傳的文件數據。
 * 它可以讓開發者在 MySQL 執行 LOAD DATA LOCAL INFILE 操作時,通過回調函數攔截文件內容並進行處理,而不必依賴本地實際文件。
 *
 * 文法:
 * mysqli::set_local_infile_handler(mysqli $link, callable $handler): bool
 * 
 * 參數:
 * - $link: MySQLi 連接對象
 * - $handler: 回調函數,用於處理文件內容
 *
 * 返回值:
 * - 成功返回 true,失敗返回 false
 */</span>

<span class="hljs-comment">/**
 * 2. 上傳文件並使用 set_local_infile_handler 示例
 */</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">"test_db"</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_errno) {
    </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">// 定義文件上傳處理回調</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">set_local_infile_handler</span></span><span>(function(</span><span><span class="hljs-variable">$filename</span></span><span>, </span><span><span class="hljs-variable">$fileHandler</span></span><span>) {
    </span><span><span class="hljs-comment">// 假設 $fileHandler 是一個文件流對象</span></span><span>
    </span><span><span class="hljs-comment">// 這裡可以對上傳內​​容進行過濾、轉換或其他操作</span></span><span>
    </span><span><span class="hljs-keyword">while</span></span><span> ((</span><span><span class="hljs-variable">$line</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fgets</span></span><span>(</span><span><span class="hljs-variable">$fileHandler</span></span><span>)) !== </span><span><span class="hljs-literal">false</span></span><span>) {
        </span><span><span class="hljs-comment">// 示例:替換逗號為分號</span></span><span>
        </span><span><span class="hljs-variable">$line</span></span><span> = </span><span><span class="hljs-title function_ invoke__">str_replace</span></span><span>(</span><span><span class="hljs-string">","</span></span><span>, </span><span><span class="hljs-string">";"</span></span><span>, </span><span><span class="hljs-variable">$line</span></span><span>);
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"處理數據行: <span class="hljs-subst">$line</span></span></span><span>\n";
    }
});

</span><span><span class="hljs-comment">// 假設客户端上传了 CSV 文件,服务器端執行 LOAD DATA LOCAL INFILE</span></span><span>
</span><span><span class="hljs-variable">$sql</span></span><span> = <span class="hljs-string">&lt;&lt;&lt;SQL
LOAD DATA LOCAL INFILE '上傳文件.csv' 
INTO TABLE users 
FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\n' 
(username, email, age);
SQL</span>;

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-variable">$sql</span></span><span>)) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"數據導入成功!\n"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"導入失敗: "</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;error . </span><span><span class="hljs-string">"\n"</span></span><span>;
}

<span class="hljs-comment">/**
 * 3. 應用場景
 *
 * - 文件數據預處理:在寫入數據庫之前對數據進行清理、替換或格式化。
 * - 數據安全控制:可以对上傳文件进行验证,防止惡意注入。
 * - 避免臨時文件存儲:無需將文件物理存儲在服務器,只通過回調流處理即可。
 */</span>

<span class="hljs-comment">/**
 * 4. 操作步驟總結
 *
 * 1. 使用 MySQLi 連接數據庫。
 * 2. 調用 set_local_infile_handler 设置回調函數。
 * 3. 在回調函數中读取和处理文件内容。
 * 4. 使用 LOAD DATA LOCAL INFILE 將數據導入數據庫。
 * 5. 根據處理結果返回相應狀態。
 */</span>

</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>