Можно ли как-нить одним mysql_query выполнить несколько команд DDL?

6epkyT

Новичок
Можно ли как-нить одним mysql_query выполнить несколько команд DDL?

Есть скрипт setup.sql (текстовый файл), который выполняет создание нескольких таблиц в БД и вставку некоторых записей.

Т.к. просто лень и нет времени для каждого запроса делать отдельную "обработку" в ПХП, то хотелось бы прочитать файл и выполнить все одним запросом.

Проблема в том, что такой вариант не проходит:
PHP:
<?PHP

$link = mysql_connect('localhost', 'USER', 'PASS') or die('can\'t connenct');

mysql_select_db('test') or die('can\'t select db');

$query = 'create table foo( foo int not null) 
insert into foo (foo) values (1)';

mysql_query($query) or die(mysql_error());

echo 'good';

?>

// ругается 
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'insert into foo (foo) values (1)' at line 2
Как такое победить?
 

chama

Новичок
create table foo( foo int not null)
insert into foo (foo) values (1)
где у тебя разделители ;?

-~{}~ 01.07.05 17:13:

А так ответ можно.
 

Damnedest

Guest
Не поможет. Выполнится только первая команда.
 

6epkyT

Новичок
2 chama

где у тебя разделители ;?
php manual-mysql_query: "Note: The query string should not end with a semicolon."

2 Tor
mysql -u.. -p... < setup.sql
Надо запустить сетап через веб-интерфейс. Поэтому такой вариант не подходит.

Вообще говоря, пытался сделать что-то вроде этого (тестовая версия):
PHP:
<?php
// -----------------------------------------------------------------------------------------
// подключаемся к БД

$link = mysql_connect('localhost', 'user', 'pass') or die("Can't connect!");

mysql_select_db('cms') or die("Can't select database!");

// -----------------------------------------------------------------------------------------
// читаем файл sql-запросов

$sql_query = '';

$file = file('setup.sql');

$cnt = count($file);

for($i=0; $i<$cnt; $i++)
{
    // -----------------------------------------------------------------------------------------
    // Удаляем переводы строк и ; (точка с запятой) во избежание ошибок
    
    $foo = explode(';', str_replace('\r\n', ' ', $file[$i]) );
    $sql_query.=$foo[0];
}


if (!$r=mysql_query($sql_query, $link))
{
    exit(mysql_error());
}

while($row=mysql_fetch_assoc($r))
{
    print_r($row);
    echo '<hr>';
}

mysql_free_result($r);

echo '<br>end setup';
?>
Хм, странно, но мне казалось, что задача достаточно тривиальная.
 

Tor

Новичок
SiMM
это несколько другое

ему не просто данные залить надо, а "создание нескольких таблиц в БД и вставку некоторых записейЭ"
 

fog

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

Serguitar

Новичок->продвинутый
Ему нужна реализация заливки дампа, хранящегося у него в текстовом файле, в базу. Если я правильно его понял, то ему необходим механизм, реализацию которого можно посмотреть в старом добром пхпадмине например. Зачем велосипед изобретать?
 

6epkyT

Новичок
Автор оригинала: SiMM
LOAD DATA INFILE?
PS: и незачем задавать один и тот же вопрос в нескольких местах.
Требуется запустить сетап через веб-интерфейс.

> незачем задавать один и тот же вопрос в нескольких местах
Где еще, например?

2 fog
В одно касание можно только добавить несколько строк в базу, а создать таблицу и тут же инсерты - не получится.
Т.е., если правильно вас понял, это фича mysql_query()?

-~{}~ 01.07.05 16:02:

Автор оригинала: Serguitar
Ему нужна реализация заливки дампа, хранящегося у него в текстовом файле, в базу. Если я правильно его понял, то ему необходим механизм, реализацию которого можно посмотреть в старом добром пхпадмине например. Зачем велосипед изобретать?
;))

PHPMyAdmin - тоже вариант! Что-то я совсем забыл про него.

Велосипед изобретать не собирался и не собираюсь. :)
Думал пойти простым путем. Как оказалось, такое не проходит.

Однако наличие такое фичи в PHP было бы только плюсом (ИМХО).
 

fog

Рыцарь Джедай
6epkyT это фича SQL

-~{}~ 01.07.05 15:05:

Существует куча продуктов, которые позволяют создавать бекап/восстанавливать из бекапа, посмотрите на hotscripts.com, скорее всего вы найдёте то, что сможете интегрировать в свой скрипт.
 

6epkyT

Новичок
2 fog

Окей, спасибо.

P.S. Действительно не знал, что это фича.
 

SiMM

Новичок
> Где еще, например?
http://www.sql.ru/forum/actualthread.aspx?tid=196654

> не знал, что это фича.
Вообще-то это логически проистекает из фразы "Note: The query string should not end with a semicolon." - разделитель - нужен, но он - запрещён, соответственно несколько запросов в один присест не сделать.
 

6epkyT

Новичок
Автор оригинала: SiMM
> Где еще, например?
http://www.sql.ru/forum/actualthread.aspx?tid=196654

> не знал, что это фича.
Вообще-то это логически проистекает из фразы "Note: The query string should not end with a semicolon." - разделитель - нужен, но он - запрещён, соответственно несколько запросов в один присест не сделать.
Оффтоп:

2 SiMM, чем же вас так напрягает мое присутствие на форуме phpclub.ru, это во-первых?
Во-вторых, нет ничего плохого в том, что я участвую на нескольких форумах. И неважно где и что за посты.

Не вижу обоснованного смысла ваших претензий. ;)
 

SiMM

Новичок
> Во-вторых, нет ничего плохого в том, что я участвую на нескольких форумах.
В том что учавствуете - ничего плохого не вижу - плохо то, что вы напрягаете бОльшее количество людей, чем требуется. Вы бы ещё по всем форумам рунета проспамили...
 

6epkyT

Новичок
> В том что учавствуете - ничего плохого не вижу - плохо то, > что вы напрягаете бОльшее количество людей, чем
> требуется. Вы бы ещё по всем форумам рунета проспамили...

Без комментариев...

P.S. Это ваше личное мнение, и оно имеет право на жизнь :)
 
Сверху