MysqlHelper
是一个便捷的通过PHP导入和导出Mysql数据库表结构和数据
的工具,可以快速实现mysql的数据库的导入和导出.
mysqlli
扩展,开箱即用
长期稳定
和持续更新
通过Composer导入类库
composer require zjkal/mysql-helper
方式一: 常规方法
use zjkal\MysqlHelper;
$mysql = new MysqlHelper('root', 'root', 'testdatabase', '127.0.0.1', '3306', 'utf8mb4', 'wp_');
方式二: 实例化后,通过setConfig方法设置数据库配置
$mysql = new MysqlHelper();
$mysql->setConfig(['username' => 'root', 'password' => 'root', 'database' => 'testdatabase']);
MysqlHelper针对常用的框架做了兼容,可以直接使用框架的数据库配置, 比如ThinkPHP
框架或Laravel
框架
$mysql = new MysqlHelper();
$config = config('database.connections.mysql');
$mysql->setConfig($config);
//导出数据库(包含表结构和数据)
$mysql->exportSqlFile('test.sql');
//仅导出数据库表结构
$mysql->exportSqlFile('test.sql', false);
//导出指定表的结构和数据
$mysql->exportSqlFile('test.sql', true, ['table1', 'table2']);
__PREFIX__
占位符代替//导入数据库
$mysql->importSqlFile('test.sql');
//导入数据库,并自动替换表前缀
$mysql->importSqlFile('test.sql', 'wp_');
1个G的sql,导入稳定吗?
没测试过, 这个包的初衷主要是为webman-admin写插件的时候, 导入install.sql文件
php8.1 用这个有bug 出现了
ErrorException: mysqli::real_escape_string(): Passing null to parameter
导入还是导出? 能不能把完整的错误给我粘一下, 我去找找问题
对了, 会不会哪个参数传了null呢? 比如host, username, password, port等
导出, 没有null的 我都打印了,你可以尝试装下8试试就知道了, 我修改过现在是可以用的了, 是因为php8不支持了这个操作
我把你的注释了 改成这样子了
// if ($withData) {
// // 导出表数据
// fwrite($outputFile, "-- 表数据:$table\n");
// $result = $conn->query("SELECT FROM $table");
// while ($row = $result->fetch_assoc()) {
// dump($row);
// $columns = implode("','", array_map([$conn, 'real_escape_string'], array_values($row)));
// fwrite($outputFile, "INSERT INTO $table VALUES ('$columns');\n");
// }
// if (empty($row)) {
// fwrite($outputFile, "/ " . $table . "表没有数据 /\n");
// }
// }
if ($withData) {
// 导出表数据
fwrite($outputFile, "-- 表数据:$table\n");
$result = $conn->query("SELECT FROM $table");
if ($result) { // 检查查询是否成功执行
while ($row = $result->fetch_assoc()) {
$escapedValues = array_map(function ($value) use ($conn) {
return $conn->escape_string(strval($value));
}, $row);
$columns = implode("','", $escapedValues);
$insertStatement = "INSERT INTO $table VALUES ('$columns');\n";
fwrite($outputFile, $insertStatement);
}
if ($result->num_rows === 0) {
fwrite($outputFile, "/ " . $table . "表没有数据 /\n");
}
$result->free(); // 释放结果集内存
} else {
fwrite($outputFile, "/ 查询失败或者表不存在 /\n");
}
}
有点奇怪, 我刚刚又用PHP8.0和PHP8.1都做了测试, 可以正常导出, 难道和mysql版本有关吗? 你用的是什么版本的mysql呢?
mysql 8.1.0
我已经查到大概问题了, 也参考你的代码做了一些修改, 跟php版本不大, 主要是这个函数mysql_real_escape_string, 莫名其妙的就是有问题, 也是从网上搜了挺多人遇到的错误才发现的. 所以不再使用它了.
mysql_real_escape_string 这个函数我一开始就说了呀 就是这个函数的问题呀
就是就是, 你说的对, 是我自己陷入了PHP版本的差异中
我已经发新版了, composer update一下继续用吧, 真心感谢