|
|
|
| Это продолжение темы 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($fp, filesize($plural_query));
fclose($fp);
}
else
{
echo "Error: Not open file";
}
}
else
{
echo "Error: Download link not acceptable";
}
}
?>
|
Повторяю,хотя бы просто найти и открыть файл - и это не выполняется.
Возможно, вы знаете, как это делает phpMyAdmin? | |
|
|
|
|
|
|
|
для: 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 в 18:48)
| | Что передаётся в $plural_query, где лежит файл с дампом, и файл с этим PHP-скриптом? | |
|
|
|
|
|
|
|
для: 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 в 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";
}
}
|
Подскажите, как дальше? | |
|
|
|
|
|
|
|
для: Денис
(13.09.2005 в 20:35)
| | Брр... погодите, а зачем файл вообще куда-либо перемещать - вам ведь сам файл не нужен, нужно только его содержимое?
<?php
$content = file_get_contents($_FILES['plural_query']['tmp_name']);
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(14.09.2005 в 01:27)
| | Ну вообще, я считал, что если не переместить файл, то он будет храниться во временном файле, не понятно с каким именем. Теперь я его переместил и дал имя. Теперь,по идее, его нужно открыть и как-то его проверить на содержание sql-запросов и если такие есть - выполнить их | |
|
|
|
|
|
|
|
для: Денис
(14.09.2005 в 11:27)
| | Вам нужно только его содержимое и только один раз, прочитайте его прямо из временной папки с непонятным названием и забудьте про него - далее можно работать уже с его содержимым. | |
|
|
|
|
|
|
|
для: 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ñ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;
|
Проблема, скорее всего в регулярном выражении? Если да, то почему тогда в первом варианте все в норме, но выдает такую странную ошибку, запрос ведь выполняется(во втором случае - нет)? | |
|
|
|
|
|
|
|
для: Денис
(14.09.2005 в 20:09)
| | То, что запрос пуст связано с тем, что последний элемент массива пустой - это ничего страшного, просто добавьте в foreach проверку не является ли $query - пустой строкой, и если это так, просто не выполняйте запрос. | |
|
|
|
|
|
|
|
для: 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 | |
|
|
|
|
|
|
|
для: Денис
(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();
}
}
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(15.09.2005 в 14:00)
| | наконец - то! свершилось :-), спасибо большое | |
|
|
|
|
|
|
|
для: 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() - не выводит, но страховки никакой | |
|
|
|
|
|
|
|
для: Денис
(15.09.2005 в 15:07)
| | А через функцию trim() запросы пропускали? | |
|
|
|
|
|
|
|
для: 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-запросе есть ошибка, даже строку указывает. Тот же самый запрос из файла! Он реагирует на размер запроса? как это обойти? | |
|
|
|
|
|
|
|
для: Денис
(15.09.2005 в 18:03)
| | Чего-то не очень понятно... | |
|
|
|