加入收藏 | 设为首页 | 会员中心 | 我要投稿 北几岛 (https://www.beijidao.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

PHP数据库转储脚本 – 有什么问题吗?

发布时间:2021-07-06 05:19:19 所属栏目:大数据 来源: https://www.jb51.cc
导读:我找到了一个PHP函数来转储其他人编写的MysqL数据库,然后将其清理并格式化了一下.我想知道我是否可以批评它.我已经运行它,在wordpress博客上测试它并且数据库完全恢复,但是想要了解代码. 具体来说,我正在寻找反馈: 任何可能破坏数据的东西 – 没有正确逃脱

我找到了一个PHP函数来转储其他人编写的MysqL数据库,然后将其清理并格式化了一下.我想知道我是否可以批评它.我已经运行它,在wordpress博客上测试它并且数据库完全恢复,但是想要了解代码.

具体来说,我正在寻找反馈:

>任何可能破坏数据的东西 – 没有正确逃脱等
>违反任何最佳做法/原则
>安全问题
>你可能会看到任何其他问题

注意:我不想使用MysqLdump,我想从代码中完全生成这个sql备份.我也意识到文件名可以随机生成,但sql文件也会上传到dropBox,我想用相同的名称对它进行版本控制.

谢谢!

码:

  // Variables
  $dbHost = 'DBHOST';
  $dbUser = 'DBUSER';
  $dbPassword = 'DBPASSWORD';
  $dbName = 'DBNAME';
  $tables = '*';
  $fileName = 'mydatabase.sql';


  // Logic
    $link = @MysqL_connect($dbHost, $dbUser, $dbPassword);
    $db = @MysqL_select_db($dbName, $link);

if(!$link || !$db)
 die("Database Error");

//get all of the tables
if($tables == '*') {

$tables = array();
$result = MysqL_query('SHOW TABLES');

while($row = MysqL_fetch_row($result)) {
  $tables[] = $row[0];
    }
}

else $tables = is_array($tables) ? $tables : explode(',',$tables);


// Loop through tables    
foreach($tables as $table) {

    $result = MysqL_query('SELECT * FROM '. $table);
    $num_fields = MysqL_num_fields($result);
    $return.= 'DROP TABLE IF EXISTS ' . $table . ';';
  $createTable = MysqL_fetch_row(MysqL_query('SHOW CREATE TABLE ' . $table));
    $return .= "nn" . $createTable[1] . ";nn";

    for ($i = 0; $i < $num_fields; $i++) 
    {
        while($row = MysqL_fetch_row($result))
        {

            $return.= 'INSERT INTO ' . $table . ' VALUES(';

            for($j = 0; $j < $num_fields; $j++) {

        $row[$j] = addslashes($row[$j]);
        $row[$j] = ereg_replace("n","n", $row[$j]);

        if (isset($row[$j])) { 
          $return .= '"' . $row[$j] . '"' ; 
        } 

        else { 
          $return .= '""'; 
        }

        if ($j < ($num_fields-1)) { 
          $return .= ','; 
        }
            }
            $return .= ");n";
        }
    }

    $return .="nnn";

}

// Save the file
$handle = fopen($fileName, 'w+');
fwrite($handle, $return);
fclose($handle);

解决方法:

那个剧本有严重的,破坏性的问题.除了最琐碎的数据库之外,它不会起作用.

>不支持NULL.
>不考虑字符集.
>表名称未分隔.
>仅支持表 – 不支持视图,存储过程,触发器,函数等.
> addslashes() is not character-set safe.
> MysqL_query()预取表中的所有行,因此如果查询具有数百万行的表,则将超出PHP内存限制.请改用MysqL_unbuffered_query().第二个想法,我看到你收回$return中的所有输出,所以这没有实际意义.
>使用@运算符抑制错误是不好的做法.检查错误并使用信息性消息正常失败.

你不使用MysqLdump的要求是荒谬的.

为什么要为自己重新制造轮子做这么多工作,但仍然如此错误?只需通过shellexec()运行MysqLdump.

也可以看看:

> Why is my database backup script not working in php?

(编辑:北几岛)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读