PHP PDO数据库备份类
我正在使用PHP和PDO构建一个数据库备份类,但不幸的是,我遇到了一些问题 在第二个for循环中,我收到多条错误消息,指出偏移量不正确。另外,当我在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
$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 .= ',';
}
}