PHP PDO数据库备份类

PHP PDO数据库备份类,php,mysql,sql,database,pdo,Php,Mysql,Sql,Database,Pdo,我正在使用PHP和PDO构建一个数据库备份类,但不幸的是,我遇到了一些问题 在第二个for循环中,我收到多条错误消息,指出偏移量不正确。另外,当我在$sql上使用print\r时,我会得到以下结果: Backing up tbl_students table... CREATE DATABASE IF NOT EXISTS plansysteem_keuzetrainingen; USE plansysteem_keuzetrainingen; DROP TABLE IF EXISTS

我正在使用PHP和PDO构建一个数据库备份类,但不幸的是,我遇到了一些问题

在第二个for循环中,我收到多条错误消息,指出偏移量不正确。另外,当我在
$sql
上使用
print\r
时,我会得到以下结果:

Backing up tbl_students table...

CREATE DATABASE IF NOT EXISTS plansysteem_keuzetrainingen;

USE plansysteem_keuzetrainingen;

DROP TABLE IF EXISTS tbl_students;

CREATE TABLE `tbl_students` (
  `idStudent` int(11) NOT NULL AUTO_INCREMENT,
  `studentUsualName` varchar(300) NOT NULL,
  `studentPrefix` varchar(200) DEFAULT NULL,
  `studentSurname` varchar(300) NOT NULL,
  `studentNumber` int(11) NOT NULL,
  `studentClass` varchar(300) NOT NULL,
  `studentEmailAddress` varchar(300) NOT NULL,
  PRIMARY KEY (`idStudent`)
) ENGINE=InnoDB AUTO_INCREMENT=261 DEFAULT CHARSET=utf8mb4;

INSERT INTO tbl_students VALUES();
INSERT INTO tbl_students VALUES();
INSERT INTO tbl_students VALUES();
INSERT INTO tbl_students VALUES();
INSERT INTO tbl_students VALUES();
INSERT INTO tbl_students VALUES();

Backing up tbl_users table...

CREATE DATABASE IF NOT EXISTS plansysteem_keuzetrainingen;

USE plansysteem_keuzetrainingen;

DROP TABLE IF EXISTS tbl_students;

CREATE TABLE `tbl_students` (
  `idStudent` int(11) NOT NULL AUTO_INCREMENT,
  `studentUsualName` varchar(300) NOT NULL,
  `studentPrefix` varchar(200) DEFAULT NULL,
  `studentSurname` varchar(300) NOT NULL,
  `studentNumber` int(11) NOT NULL,
  `studentClass` varchar(300) NOT NULL,
  `studentEmailAddress` varchar(300) NOT NULL,
  PRIMARY KEY (`idStudent`)
) ENGINE=InnoDB AUTO_INCREMENT=261 DEFAULT CHARSET=utf8mb4;

INSERT INTO tbl_students VALUES();
INSERT INTO tbl_students VALUES();
INSERT INTO tbl_students VALUES();
INSERT INTO tbl_students VALUES();
INSERT INTO tbl_students VALUES();
INSERT INTO tbl_students VALUES();
INSERT INTO tbl_students VALUES();


DROP TABLE IF EXISTS tbl_users;

CREATE TABLE `tbl_users` (
  `idUser` int(11) NOT NULL AUTO_INCREMENT,
  `userName` varchar(300) NOT NULL,
  `userPassWord` varchar(300) NOT NULL,
  `userPassWordHash` varchar(300) NOT NULL,
  `userEmailAddress` varchar(300) NOT NULL,
  PRIMARY KEY (`idUser`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;

INSERT INTO tbl_users VALUES();
我从数据库中两次获得第一个表,但我不明白为什么,因为我的数据库只包含两个表
tbl_学生
&
tbl_用户
。下面您可以找到我的数据库备份类

DatabaseBackup.class.php

<?php
    class DatabaseBackup {
        private $dbConnection;
        private $dbName;

        public function __construct($dbConnection, $dbName) {
            $this->dbConnection = $dbConnection->dbConnection;
            $this->dbName = $dbName;
        }

        public function backupDbTables($dbTables = "*", $outputDir = ".") {
            if($dbTables == "*") {
                $dbTables = array();
                $firstResult = $this->dbConnection->query("SHOW TABLES");
                while($firstResultRow = $firstResult->fetch(PDO::FETCH_BOTH)) {
                    $dbTables[] = $firstResultRow[0];
                }
            }
            else {
                $dbTables = is_array($dbTables) ? $dbTables : explode(',',$dbTables);
            }

            $sql = 'CREATE DATABASE IF NOT EXISTS '.$this->dbName.";\n\n";
            $sql .= 'USE '.$this->dbName.";\n\n";

            foreach($dbTables as $dbTable) {
                echo "Backing up ".$dbTable." table...";

                $selectNumFields = $this->dbConnection->query("SELECT COUNT(*) FROM ".$dbTable);
                $numFieldsArray = $selectNumFields->fetchColumn();
                $numFields = $numFieldsArray;

                $secondResult = $this->dbConnection->query("SELECT * FROM ".$dbTable);

                $sql .= 'DROP TABLE IF EXISTS '.$dbTable.';';
                $thirdResult = $this->dbConnection->query("SHOW CREATE TABLE ".$dbTable);
                $thirdResultRows = $thirdResult->fetch(PDO::FETCH_NUM);
                $sql.= "\n\n".$thirdResultRows[1].";\n\n";

                for($i = 0; $i < $numFields; $i++) {

                    while($row = $secondResult->fetch(PDO::FETCH_NUM)) {

                        $sql .= 'INSERT INTO '.$dbTable.' VALUES(';

                        for($j = 0; $j < $numFields; $j++) {
                            $row[$j] = addslashes($row[$j]);
                            $row[$j] = str_replace("\n","\\n",$row[$j]);
                            if(isset($row[$j])) {
                                $sql .= '"'.$row[$j].'"' ;
                            }
                            else {
                                $sql.= '""';
                            }
                            if($j < ($numFields-1)) {
                                $sql .= ',';
                            }
                        }

                        $sql.= ");\n";

                    }

                }

                $sql.="\n\n\n";
                echo "<pre>";
                print_r($sql);
                echo "</pre>";   
            }
        }

        public function saveBackUpFile() {

        }
    }
?>


我希望有人能帮助我修复这个类,使它能够正常工作,如果您对我的代码有任何建议,我想听听。

在访问它之前,您必须检查数组中元素的存在

所以你需要像这样重写你的循环:

for($j=0;$j<$numFields;$j++){
如果(isset($row[$j])){
$row[$j]=addslashes($row[$j]);
$row[$j]=str_replace(“\n”、“\\n”、$row[$j]);
$sql.=''''.$row[$j].''';
}否则{
$sql.=''''';
}
如果($j<($numFields-1)){
$sql.=',';
}
}

感谢您对问题的快速回复!现在,我的班级正常运转。非常感谢你!
for($j = 0; $j < $numFields; $j++) {
    if(isset($row[$j])) {
        $row[$j] = addslashes($row[$j]);
        $row[$j] = str_replace("\n","\\n",$row[$j]);
        $sql .= '"'.$row[$j].'"' ;
    } else {
        $sql.= '""';
    }
    if($j < ($numFields-1)) {
        $sql .= ',';
    }
}