在 PHP 中优化 MySQL 数据库导入:可靠地拆分查询
在 Web 开发领域,会出现更新共享服务器上托管的网站的情况需要更新数据库。然而,无法从外部访问MySQL带来了挑战。为了解决这个问题,需要通过 PHP 导入 MySQL 文件。本文探讨了一种有效的解决方案,将大型 MySQL 数据库文件拆分为单独的查询并使用 PHP 导入它们。
问题陈述
目标是开发一种可靠的方法将大型数据库文件拆分为单独的查询,而无需同时打开整个文件。限制包括 MySQL 命令行函数、LOAD DATA INFILE、phpMyAdmin 和 mysqli_multi_query() 不可用。
解决方案:SplitSQL 函数
解决方案在于内存- 称为 SplitSQL 的友好函数,它逐行迭代文件并识别查询分隔符。它将行累积到数组中,直到遇到分隔符,形成完整的查询。然后该函数执行查询并提供有关其成功或失败的反馈。
实现
<code class="php">function SplitSQL($file, $delimiter = ';') { set_time_limit(0); if (is_file($file) === true) { $file = fopen($file, 'r'); if (is_resource($file) === true) { $query = array(); while (feof($file) === false) { $query[] = fgets($file); if (preg_match('~' . preg_quote($delimiter, '~') . '\s*$~iS', end($query)) === 1) { $query = trim(implode('', $query)); if (mysql_query($query) === false) { echo '<h3>ERROR: ' . $query . '</h3>' . "\n"; } else { echo '<h3>SUCCESS: ' . $query . '</h3>' . "\n"; } while (ob_get_level() > 0) { ob_end_flush(); } flush(); } if (is_string($query) === true) { $query = array(); } } return fclose($file); } } return false; }</code>
测试和输出
使用大型 phpMyAdmin SQL 转储进行测试后,SplitSQL 函数产生了成功的结果。输入输出示例如下:
测试数据
<code class="sql">CREATE TABLE IF NOT EXISTS "test" ( "id" INTEGER PRIMARY KEY AUTOINCREMENT, "name" TEXT, "description" TEXT ); BEGIN; INSERT INTO "test" ("name", "description") VALUES (";;;", "something for you mind; body; soul"); COMMIT; UPDATE "test" SET "name" = "; " WHERE "id" = 1;</code>
输出
SUCCESS: CREATE TABLE IF NOT EXISTS "test" ( "id" INTEGER PRIMARY KEY AUTOINCREMENT, "name" TEXT, "description" TEXT ); SUCCESS: BEGIN; SUCCESS: INSERT INTO "test" ("name", "description") VALUES (";;;", "something for you mind; body; soul"); SUCCESS: COMMIT; SUCCESS: UPDATE "test" SET "name" = "; " WHERE "id" = 1;
结论
SplitSQL 函数提供了一个可靠的解决方案,用于将大型 MySQL 数据库文件拆分为单独的查询并使用 PHP 执行它们。它有效地解决了上述限制并实现了数据库更新的自动导入。这种方法可确保共享托管环境中的无缝数据库维护。
以上是如何使用 PHP 将大型 MySQL 文件导入共享托管环境?的详细内容。更多信息请关注PHP中文网其他相关文章!