我有一种情况,我必须在共享主机提供商上更新网站。该站点具有CMS。使用FTP上传CMS的文件非常简单。
我还必须导入一个大的数据库文件(相对于PHP脚本而言)(大约2-3
MB未压缩)。Mysql已关闭,无法从外部访问,因此我必须使用FTP上传文件,然后启动PHP脚本将其导入。可悲的是,我无权访问mysql
命令行功能,因此必须使用本地PHP进行解析和查询。我也不能使用LOAD
DATA
INFILE。我也不能使用任何类型的交互式前端(例如phpMyAdmin),它需要以自动化方式运行。我也不能使用mysqli_multi_query()
。
是否有人知道或拥有已经编码的简单解决方案,该解决方案可以 可靠地
将此类文件拆分为单个查询(可能有多行语句)并运行查询。由于可能遇到很多陷阱,我想避免自己开始摆弄它(如何检测字段分隔符是否是数据的一部分;如何处理备注字段中的换行符;等等上)。有
必须 是这个现成的解决方案。
这是一个内存友好的函数,该函数应该能够 在单个查询中拆分大文件,而无需一次打开整个文件 :
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;
}
我在一个大型phpMyAdmin 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;
并分别输出:
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;
PHP 是一门复杂的语言,经过多年折腾,使其不同版本之间高度不一致,有时还有些 bug。每个版本都有自己独有的特性、多余和怪异之处,也很难跟踪哪个版本有哪些问题。
老项目遗留了一些代码,VUE页面里面的代码太长了 想把TS代码拆分出来,请问最佳实践是什么样子的? 旧代码:
我正在尝试导入。使用此命令行将sql文件转换为MySQL <代码>mysql-u用户名-p数据库名 这是myfile.sql样本 我的文件包含一些日期,但其中一些日期错误。因此,上面的命令返回一个错误。 导入的最佳方式是什么?我应该删除日期错误的行吗?是否有办法只导入正确的行,而忽略有错误的行? 谢谢你的帮助
问题内容: 在我们当前的自动化中(使用Selenium / WebDriver / Java),我们使用 非常 广泛。例如: 根据定义,可以使用以下内容找到选择器:using,id,名称,className,css,tagName,linkText,partialLinkText和xpath。 最近,我们的前端开发人员提议我们实现一个以’test =’开头的新属性类。我认为这是一个好主意,因为我们
我希望一些帮助处理一个奇怪的边缘案例与我正在构建的一个分页API。 与许多API一样,这个API分页了大量的结果。如果查询/foos,将得到100个结果(即foo#1-100),以及一个指向/foos?page=2的链接,该链接将返回foo#101-200。 不幸的是,如果在API使用者进行下一个查询之前从数据集中删除了foo#10,/foos?page=2将抵消100并返回foos#102-20
问题内容: 我正在尝试在PHP中创建类似CMS的系统。使它尽可能模块化和可扩展。 有人可以为我提供在PHP中创建事件侦听器系统(例如Drupal系统的非常简化的版本),创建钩子并在一个简短的示例中实现它们的最佳实践方案也很不错。 问题答案: 嗯,从实现角度看,确实有三种不同的方法可以做到这一点(请注意,这些是面向对象的设计模式,但是您可以根据需要在功能上或过程上实现它们)。 1.观察者模式 您可以