Автор: klem4 17.06.2008 22:13
Всем привет.
Вот такой код отрабатывает нормально:
Код
use Mysql;
// ...
$dbh = Mysql -> connect (
$host,
$database,
$user,
$password
) || die "\nCan't connect to MYSQL\nReason: $DBI::errstr\n";
// ...
$query = $dbh -> Query (
"$script"
) || die "\nCan't excute statement '$script'\nReason: $DBD::errstr\n";
А вот такой, выдает ошибку (на execute) "No database selected"
Код
use DBI; // <--------
//...
$dbh = DBI -> connect (
"DBI:mysql:database = $database; $host = $host",
$user,
$password
) || die "\nCan't connect to MYSQL\nReason: $DBI::errstr\n";
//...
$query = $dbh -> prepare (
"$script"
) || die "\nCan't prepare statement '$script'\nReason: DBI::errstr\n";
print "\n -- Prepare is ok.\n";
$query -> execute
|| die "\nCan't execute statement '$script'\nReason: $DBI::errstr\n";
print "\n Executing is ok.\n";
Почему ? Я понимаю что вроде как не выбрана база, но при use Mysql, можно использовать SelectDB, но работает и без этого, а при use DBI что нужно сделать чтобы выбрать базу ? Я думал что в строке connect'a это прописывается, видимо нет.
Добавлено через 16 мин. Проблема решена.
Убрал пробелы из этой строчки:
Код
"DBI:mysql:database=$database;host=$host"
Автор: klem4 17.06.2008 22:57
Возникла другая проблема, есть скрипт файл, содержащий несколько SQL-запросов, например вот такой:
Цитата(create.sql)
CREATE TABLE PRODUCTS (
PRODUCT_ID int NOT NULL,
PRODUCT_NAME varchar(40) NOT NULL,
PRIMARY KEY (PRODUCT_ID)
);
CREATE UNIQUE INDEX idx_product_name ON PRODUCTS
(
PRODUCT_NAME
);
Я считываю его в переменную
Код
$/ = undef;
$script = <script_file>;
И хочу выполнить:
Код
$query = $dbh -> prepare (
"$script"
) || die "\nCan't prepare statement '$script'\nReason: $DBI::errstr\n";
print "\n -- Prepare is ok.\n";
$query -> execute
|| die "\nCan't execute statement \nReason: $DBI::errstr\n";
вываливается с криками об ошибке в синтаксисе SQL-запроса, начиная с 'CREATE UNIQUE INDEX ...'
В файла 2 запроса, по одиночке выполняются отлично, но вместе подрят никак ... чувствую дело в диалексте или еще в чем, пробовал убирать ';' не помогло, ничего в голову не приходит пока.
Автор: klem4 17.06.2008 23:35
В общем решил проблему вот так:
Код
@scripts = split(/;/, $script);
$statement = 0;
foreach (@scripts)
{
print "\n[",++$statement, " statement starting]\n";
$query = $dbh -> prepare (
"$_"
) || die "\nCan't prepare statement '$script'\nReason: DBI::errstr\n";
print "\n -- Prepare is ok.\n";
$query -> execute
|| die "\nCan't execute statement \nReason: $DBI::errstr\n";
print "\n --Executing is ok.\n";
}
Автор: klem4 18.06.2008 1:10
Продолжение эпопеи ... вот тут уже совсем незнаю что делать, вот пример: 2 простейшие таблицы, связь 1 ко многим по table1_id
Код
CREATE TABLE TABLE_1 (
TABLE1_ID int unsigned unique NOT NULL auto_increment,
TABLE1_DATA varchar(20) NULL,
PRIMARY KEY (TABLE1_ID)
) type=innodb;
create unique index idx on table_1(
TABLE1_ID
);
CREATE TABLE TABLE_2 (
TABLE2_ID int NOT NULL,
TABLE1_ID int unsigned NOT NULL,
TABLE2_DATA varchar(20) NULL,
PRIMARY KEY (TABLE2_ID),
FOREIGN KEY (TABLE1_ID)
REFERENCES TABLE_1
) type=innodb;
пишет, что "Can't create table_2.frm (errno: 150)"
все перепробовал, добавил unsigned, обеим проставил type=innodb, добавил индекс по ключу первой таблицы ...
Автор: klem4 18.06.2008 1:43
Вот оно как должно быть:
Код
CREATE TABLE TABLE_1 (
TABLE1_ID int not null auto_increment,
TABLE1_DATA varchar(20) NULL,
PRIMARY KEY (TABLE1_ID)
) engine=innodb;
CREATE TABLE TABLE_2 (
TABLE2_ID int NOT NULL auto_increment,
TABLE2_DATA varchar(20) NULL,
TABLE1_ID int not null,
index idx(TABLE1_ID),
PRIMARY KEY (TABLE2_ID),
FOREIGN KEY (TABLE1_ID)
REFERENCES TABLE_1(TABLE1_ID) on delete restrict
) engine=innodb;