Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Дамп SQL через PHP! Нужно доработать функцию....
 
 автор: Stanisov   (13.02.2012 в 01:01)   письмо автору
 
 

Здравствуйте!
Есть моя пользовательская функция, которая генерирует 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;

  Ответить  
 
 автор: cheops   (13.02.2012 в 11:45)   письмо автору
 
   для: Stanisov   (13.02.2012 в 01:01)
 

А вы вместо конструкции с запятой в конце
$tmp .= ... ,
задействуйте массив без запятой
$tmp[] = ...
тогда вы сможете преобразовать массив в строку при помощи функции implode()
implode(",", $tmp)
и запятые будут корректно поставлены только между элементами.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования