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

Форум MySQL

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

 

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

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

тема: Выполняем SQL-дамп на сервере средствами PHP
 
 автор: cheops   (13.09.2005 в 18:48)   письмо автору
 
 

Это продолжение темы http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=1004
Извините за крайнюю настойчивость, но мне очень нужна ваша помощь.
Я пытаюсь загрузить файл с рашрирением .sql, считать его и выполнить записанные в нем команды, но дальше чем fopen не могу уйти - файл не находит. Не знаю, в чем причина, уже кажется, все перепробовал. Вот скрипт функции:
<?php
function downloads ($plural_query
    { 
        
$extension substr($plural_query, -3); 
        if ( (
$extension == 'zip') || ($extension == '.gz') || ($extension == 'sql') ) 
        { 
            if (
$fp fopen($plural_query'rb')) 
              { 
                
$buffer fread($fpfilesize($plural_query)); 
                
fclose($fp); 
            } 
            else 
            { 
                  echo 
"Error: Not open file"
            } 
        } 
        else 
        { 
          echo 
"Error: Download link not acceptable"
        } 
    } 
?>

Повторяю,хотя бы просто найти и открыть файл - и это не выполняется.
Возможно, вы знаете, как это делает phpMyAdmin?

   
 
 автор: Bronepoz[)   (13.09.2005 в 18:57)   письмо автору
 
   для: cheops   (13.09.2005 в 18:48)
 

1. if ( ($extension == 'zip') || ($extension == '.gz') || ($extension == 'sql') ) заменить на if ( ($extension == '.zip') || ($extension == '.gz') || ($extension == '.sql') )...Но зачем униксовые архивы и зипы?

И еще лучше занести содержимое файла в переменную $file = file($plural_query); затем implode("", $file); а затем выполнить как один запрос...

   
 
 автор: cheops   (13.09.2005 в 19:04)   письмо автору
 
   для: cheops   (13.09.2005 в 18:48)
 

Что передаётся в $plural_query, где лежит файл с дампом, и файл с этим PHP-скриптом?

   
 
 автор: Денис   (13.09.2005 в 19:50)   письмо автору
 
   для: cheops   (13.09.2005 в 19:04)
 

Объясню немного по другому. Изначально есть файл со скриптом

<?php
require('includes/application_top.php');
if(
$REQUEST_METHOD=="POST")
{
  echo 
stripslashes($query);
  if(
tep_db_query(stripslashes($query)))
  {
    echo 
"Your SQL-query has been executed successfully";
  }
}
?>
<form name="sql" method="post">
<textarea name="query" cols=30 rows=5><?=$query?></textarea>
<input type=submit>
</form>

tep_db_query - это аналог mysql_query(). Я хотел переделать скрипт так, чтобы можно было выполнять запросы из загружаемого дампа.
Немного переделал форму:

<form name="sql" method="post" enctype="multipart/form-data">
<textarea name="query" cols=30 rows=5><?=$query?></textarea><br><br>
Выберете какой-нибудь файл :<br>
<input type="file" name="plural_query"><?=$plural_query?><br><br>
<input type=submit name="doUpload">
</form>

И предполагаю, что считывать с формы нужно следующим образом:

if($REQUEST_METHOD=="POST")
{
    $query = $_POST['query'];
    $plural_query = $HTTP_POST_FILES['plural_query']; 
}

Этот файл, судя по примерам, нужно сохранить в какой-либо каталог функцией
move_uploaded_file().
И как действовать дальше пока не знаю...

   
 
 автор: Денис   (13.09.2005 в 20:35)   письмо автору
 
   для: Денис   (13.09.2005 в 19:50)
 

немного доработал скрипт

if($REQUEST_METHOD=="POST")
{
    $query = $_POST['query'];
    $plural_query = $_FILES['plural_query']['tmp_name'];
    if(move_uploaded_file($_FILES['plural_query']['tmp_name'], "/tmp/name"))
    {
        echo "ok";
    }
    else
    {
        echo "is not ok";
    }
}

Подскажите, как дальше?

   
 
 автор: cheops   (14.09.2005 в 01:27)   письмо автору
 
   для: Денис   (13.09.2005 в 20:35)
 

Брр... погодите, а зачем файл вообще куда-либо перемещать - вам ведь сам файл не нужен, нужно только его содержимое?
<?php
  $content 
file_get_contents($_FILES['plural_query']['tmp_name']);
?>

   
 
 автор: Денис   (14.09.2005 в 11:27)   письмо автору
 
   для: cheops   (14.09.2005 в 01:27)
 

Ну вообще, я считал, что если не переместить файл, то он будет храниться во временном файле, не понятно с каким именем. Теперь я его переместил и дал имя. Теперь,по идее, его нужно открыть и как-то его проверить на содержание sql-запросов и если такие есть - выполнить их

   
 
 автор: cheops   (14.09.2005 в 13:45)   письмо автору
 
   для: Денис   (14.09.2005 в 11:27)
 

Вам нужно только его содержимое и только один раз, прочитайте его прямо из временной папки с непонятным названием и забудьте про него - далее можно работать уже с его содержимым.

   
 
 автор: Денис   (14.09.2005 в 20:09)   письмо автору
 
   для: cheops   (14.09.2005 в 13:45)
 

создал скрипт, работает, но есть одна неточность в выполнении.
если в скрипте

// open file and read in buffer
            $fp = fopen($plural_query,"rb");
            $bufer = fread($fp,filesize($plural_query));
            fclose($fp);
            $quer = explode(";", $bufer);
            foreach($quer as $query)
            {
              if(!mysql_query($query))
              {
                  exit(mysql_error());
              } 
            } 

строка $quer = explode(";", $bufer); выполняет все правильно, запрос выполняется и таблица в базе данных создается, то при этом mysql_error() ошибку что запрос пуст!
Если эту строку заменить на
$quer = preg_split("|\);\r\n|", $bufer); то запрос не выполняется, на этот раз mysql_error() ругается вот так:
You have an error in your SQL syntax near '; ' at line 15, т.е. на последнюю строку
Сам запрос следующего содержания:

CREATE TABLE abc(
  id_author int(6) NOT NULL auto_increment,
  name text,
  passw text,
  email text,
  url text,
  i&#241;q text,
  about text,
  photo text,
  time datetime default NULL,
  last_time datetime default NULL,
  themes int(10) default NULL,
  statususer int(2) default NULL,
  PRIMARY KEY (id_author)
) TYPE=MyISAM;

Проблема, скорее всего в регулярном выражении? Если да, то почему тогда в первом варианте все в норме, но выдает такую странную ошибку, запрос ведь выполняется(во втором случае - нет)?

   
 
 автор: cheops   (14.09.2005 в 21:46)   письмо автору
 
   для: Денис   (14.09.2005 в 20:09)
 

То, что запрос пуст связано с тем, что последний элемент массива пустой - это ничего страшного, просто добавьте в foreach проверку не является ли $query - пустой строкой, и если это так, просто не выполняйте запрос.

   
 
 автор: Денис   (15.09.2005 в 11:17)   письмо автору
 
   для: cheops   (14.09.2005 в 21:46)
 

Если цикл должен выглядеть вот так:

foreach($quer as $query)
            {
                if(!empty($query)) // или if($query != "")
                {
                    if(!mysql_query($query))
                      {
                          exit(mysql_error());
                      } 
                }
                else
                {
                    exit();
                }
            } 

то результат тот же.
Query was empty

   
 
 автор: cheops   (15.09.2005 в 14:00)   письмо автору
 
   для: Денис   (15.09.2005 в 11:17)
 

1) Нет ли на странице ещё функций mysql_query()?
2) Выведите дамп массива $quer - есть в нём пустые строки?
<?php
  
echo "<pre>";
  
print_r($quer):
  echo 
"</pre>";
?>

3) Воможно так пробелы - прогоните $query через trim
<?php
foreach($quer as $query
            { 
                if(!empty(
$query)) // или if($query != "") 
                

                    
$query trim($query);
                    if(!
mysql_query($query)) 
                      { 
                          exit(
mysql_error()); 
                      } 
                } 
                else 
                { 
                    exit(); 
                } 
            }
?>

   
 
 автор: Денис   (15.09.2005 в 14:41)   письмо автору
 
   для: cheops   (15.09.2005 в 14:00)
 

наконец - то! свершилось :-), спасибо большое

   
 
 автор: Денис   (15.09.2005 в 15:07)   письмо автору
 
   для: cheops   (15.09.2005 в 14:00)
 

поспешил с ответом. результат тот же. для ясности - вот скрипт

if($REQUEST_METHOD=="POST")
{
        $dblocation = $_POST['host'];
        $dbuser = $_POST['name'];
        $dbpasswd = $_POST['password'];
        $dbname = $_POST['databasename'];
        $query = $_POST['query'];
        $query = trim($query);
        $quer = trim($quer);
        $plural_query = $_FILES['plural_query']['tmp_name'];
        if($dblocation !="" && $dbuser !="" && $dbname !="")
        {
            $dbcnx = @mysql_connect($dblocation,$dbuser,$dbpasswd);
            if (!$dbcnx)  
            {
              exit( "<P>Server database not access.</P>" );
            }
            
            if (! @mysql_select_db($dbname,$dbcnx) )
            {
              exit( "<P>Database not disclosure.</P>" );
            } 
            if($query != "")
            {
                if(!mysql_query($query))
                  {
                    exit(mysql_error());
                  }
                else
                echo "Your SQL-query has been executed successfully";
                //refresh();
            }
            if ($plural_query != "")
            {
                // open file and read in buffer
                $fp = fopen($plural_query,"rb");
                $bufer = fread($fp,filesize($plural_query));
                fclose($fp);
                $quer = explode(";", $bufer);
                foreach($quer as $query)
                {
                      
                    if(!mysql_query($query))
                      {
                        exit(mysql_error());
                      }
                    else
                    echo "Your SQL-query has been executed successfully";
                }
            }
        }
        else
        {
            echo "You inputing data incorrect";
            exit;
        }
}

что не так и почему он в результате запроса пишет:
Your SQL-query has been executed successfullyQuery was empty не пойму. если отключить error() - не выводит, но страховки никакой

   
 
 автор: cheops   (15.09.2005 в 16:50)   письмо автору
 
   для: Денис   (15.09.2005 в 15:07)
 

А через функцию trim() запросы пропускали?

   
 
 автор: Денис   (15.09.2005 в 18:03)   письмо автору
 
   для: cheops   (15.09.2005 в 16:50)
 

сделал немного по другому.

if ($plural_query != "")
            {
                // open file and read in buffer
                $fp = fopen($plural_query,"rb");
                $bufer = fread($fp,filesize($plural_query));
                fclose($fp);
                $quer = explode(";", $bufer);
                unset($quer[sizeof($quer) - 1]);
                //$query = trim($plural_query);
                foreach($quer as $query)
                {
                    //$query = trim($query);
                    if(!mysql_query($query))
                      {
                        exit(mysql_error());
                      }
                    else
                    echo "Your SQL-query has been executed successfully"."<br>";
                }
            }

Немного коряво, но работает. Нашел ошибку в другом.
когда в окне для одиночного запроса написать тот же самый скрипт, который, скажем, используется в файле(который мы можем загрузить и выполнить - и все запросы выполнятся успешно). В одиночном случае странная ошибка: указывает, что в sql-запросе есть ошибка, даже строку указывает. Тот же самый запрос из файла! Он реагирует на размер запроса? как это обойти?

   
 
 автор: cheops   (15.09.2005 в 23:02)   письмо автору
 
   для: Денис   (15.09.2005 в 18:03)
 

Чего-то не очень понятно...

   
Rambler's Top100
вверх

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