|
|
|
| Здравствуйте!
Есть моя пользовательская функция, которая генерирует SQL дамп
<?php
function backup($filename)
{
global $db; // инициализируем соединение с БД
$query = ''; // инициализируем
$query = "###################################\n### SQL Dump Creator\n### ".date('d-m-Y H:s')."\n##################################\n\n"; // записываем первичные данные
// СОБИРАЕМ КОЛИЧЕСТВО ТАБЛИЦ В БАЗЕ
$tables = $db->query('SHOW TABLES');
while ($row = $tables->fetch(PDO::FETCH_NUM)):
//print_r($row);
$table_list[] = $row[0];
endwhile;
for ($i = 0; $i < @count($table_list); $i++)
{
$results = $db->query('DESCRIBE '.$table_list[$i]); // смотрим каждую таблицу
// СОЗДАЕМ ЗАПОСЫ СОЗДАНИЯ ТАБЛИЦ И КЛЮЧЕЙ
$query .= "DROP TABLE IF EXISTS `".$table_list[$i]."`;\n\n";
$query .= "CREATE TABLE `".$table_list[$i]."` (\n";
$tmp = '';
while ($row = $results->fetch(PDO::FETCH_ASSOC))
{
$query .= ' `'.$row['Field'].'` '.$row['Type'];
if($row['Null'] != 'YES') $query .= ' NOT NULL';
if($row['Default'] != '')
{
if($row['Default'] == 'CURRENT_TIMESTAMP') $query .= ' DEFAULT ' . $row['Default'];
else $query .= ' DEFAULT \'' . $row['Default'] . '\'';
}
if($row['Extra']) $query .= ' ' . strtoupper($row['Extra']);
if($row['Key']!=='') // если ключи не пустые
{
if($row['Key'] == 'PRI') $tmp .= "PRIMARY KEY `".$row['Field']."`(`".$row['Field']."`),\n";
if($row['Key'] == 'UNI') $tmp .= "UNIQUE KEY `".$row['Field']."`(`".$row['Field']."`),\n";
if($row['Key'] == 'MUL') $tmp .= "KEY (`".$row['Field']."`)\n";
}
$query .= ",\n";
}
$query .= $tmp .") ENGINE=InnoDB DEFAULT CHARSET=utf8;".str_repeat("\n", 2);
// СОЗДАЕМ ЗАПОСЫ ВСТАВКИ СОДЕРЖИМОГО INSRT'ы
$results = $db->query('SELECT * FROM '.$table_list[$i]);
while($row = $results->fetch(PDO::FETCH_ASSOC))
{
$query .= 'INSERT INTO `'.$table_list[$i].'` (';
$data = Array();
while (list($key, $value) = each($row))
{
$data['keys'][] = "`".$key."`";
$data['values'][] = mysql_real_escape_string($value);
}
$query .= join($data['keys'], ', ') . ")\nVALUES ('" . join($data['values'], "', '") . "');\n\n";
}
}
$return = $query; // END
// ЗАПИСЫВАЕМ В ФАЙЛ НАШ БЭКАП
//echo $file_name;
$handle = fopen($filename,'w+');
fwrite($handle,$return);
fclose($handle);
// ЗАПИСЫВАЕМ КОРОТКУЮ ИНФОРМАЦИЮ ПРОДЕЛАННОЙ РАБОТЕ В БАЗУ
$countback = $db->query("SELECT id,filename FROM backuplist WHERE filename ='".basename($filename)."';")->fetch(PDO::FETCH_ASSOC); // проверяем по имени файла
//print_r($countback);
//$countback = $countback->fetchColumn();
if($countback['filename']==basename($filename)) // обновляем инфу
{
try {
$db->exec("UPDATE backuplist SET last_update=CURRENT_TIMESTAMP WHERE id='{$countback['id']}';"); // UPDATE
}
catch(PDOException $e)
{
echo 'Error UPD: '.$e->getMessage();
}
}
else // добавляем , если уникальный дамп
{
try {
$db->exec("INSERT INTO backuplist (filename,filepath,filesize) VALUES('".basename($filename)."','".$CONF->live_site."/backup/".basename($filename)."','".filesize($filename)."');"); // INSERT
}
catch(PDOException $e)
{
echo 'Error INS : '.$e->getMessage();
}
}
if(filesize($filename) >0) return true;
else return false;
}
?>
|
ЦЕЛЬ: необходим полный дамп включая ключи INDEX, KEY, PRIMARY KEY, UNIQUE KEY
ИТОГ: функция работает, дамп генерируется ..... но в этом месте
<?php
while ($row = $results->fetch(PDO::FETCH_ASSOC))
{
$query .= ' `'.$row['Field'].'` '.$row['Type'];
if($row['Null'] != 'YES') $query .= ' NOT NULL';
if($row['Default'] != '')
{
if($row['Default'] == 'CURRENT_TIMESTAMP') $query .= ' DEFAULT ' . $row['Default'];
else $query .= ' DEFAULT \'' . $row['Default'] . '\'';
}
if($row['Extra']) $query .= ' ' . strtoupper($row['Extra']);
if($row['Key']!=='') // если ключи не пустые
{
if($row['Key'] == 'PRI') $tmp .= "PRIMARY KEY `".$row['Field']."`(`".$row['Field']."`),\n";
if($row['Key'] == 'UNI') $tmp .= "UNIQUE KEY `".$row['Field']."`(`".$row['Field']."`),\n";
if($row['Key'] == 'MUL') $tmp .= "KEY (`".$row['Field']."`)\n";
}
$query .= ",\n";
}
?>
|
цикл перебирает массив с кдючами и в конец ставит запятую после каждого ключа, а после последней записи в таблице не должно быть запятой! Естественно Клиент выдает ошибку синтаксиса SQL. Наглядно это выглядит так:
CREATE TABLE IF NOT EXISTS `proxylist` (
`id` int(4) NOT NULL auto_increment,
`ip` varchar(15) NOT NULL default '',
`port` varchar(4) NOT NULL default '',
`ok` int(1) NOT NULL default 0,
`last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `ip`(`ip`) , ////////// - ЛИШНЯЯ ЗАПЯТАЯ
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
| |
|
|
|
|
|
|
|
для: Stanisov
(13.02.2012 в 01:01)
| | А вы вместо конструкции с запятой в конце
задействуйте массив без запятой
тогда вы сможете преобразовать массив в строку при помощи функции implode()и запятые будут корректно поставлены только между элементами. | |
|
|
|