Forum Webscript.Ru
Программирование => Perl => Тема начата: SteelRat от 15 Мая 2002, 02:15:52
-
Ляпаю первый SQL скрипт и получаю:
###############Browser output###############
Content-type: text/html
Software error:
оЕ ТБВПФБЕФ, ВМЙО: INSERT INTO BAZA_BONCHA VALUES (\'\',SteelRat,SteelRatov,SteelRatovich,11/08/1983,Россия,Санкт-Питербург,Россия,Санкт-Петербург,2000,Э-02,ФЭУ,SteelRat@Mail2K.Ru,[url]http://thewebfactory.fatal.ru,13-666,webm@ster,funkU,Не[/url] впишу. Такая я бука.). рТЙЮЙОБ: at databaser.cgi line 247.
For help, please send mail to the webmaster (hosting@mns.ru), giving this error message and the time and date of the error.
##########################################
Зюзюки - это мои кои8 die "xxx"
-
244 &db_connect;
245 $db_query = qq~INSERT INTO BAZA_BONCHA VALUES (\'\',$PostedData{\'recipient_name\'},$PostedData{\'recipient_familie\'},$PostedData{\'recipient_fathername\'},$PostedData{\'recipient_born_date\'},$PostedData{\'recipient_born_contry\'},$PostedData{\'recipient_born_city\'},$PostedData{\'recipient_now_contry\'},$PostedData{\'recipient_now_city\'},$PostedData{\'recipient_ear_of_arrival\'},$PostedData{\'recipient_group_indeficator\'},$PostedData{\'recipient_facultet_name\'},$PostedData{\'recipient_email\'},$PostedData{\'recipient_site_url\'},$PostedData{\'recipient_phone_number\'},$PostedData{\'recipient_proffession\'},$PostedData{\'recipient_pass\'},$PostedData{\'recipient_comments\'})~;
246 $sth = $dbh->prepare ($db_query) or die "Не приготавляется запрос: $db_query. Причина: $!";
247 $sth->execute or die "Не работает, блин: $db_query. Причина: $!";
248 &db_disconnect;
База вида:
ID INTEGER AUTO_INCREMENT NOT NULL PRIMARY KEY,
R_NAME VARCHAR(36),
R_FAMILIE VARCHAR(36),
R_FATHERNAME VARCHAR(36),
R_BIRTHDAY VARCHAR(10),
R_BIRTHDAY_CONTRY VARCHAR(36),
R_BIRTHDAY_CITY VARCHAR(36),
R_NOW_CONTRY VARCHAR(36),
R_NOW_CITY VARCHAR(36),
R_BEGIN_DATE SMALLINT,
R_GROUP_NUMBER VARCHAR(24),
R_FUCK_NAME VARCHAR(120),
R_EMAIL VARCHAR(60),
R_WWW VARCHAR(60),
R_TELEPHONE VARCHAR(40),
R_PROFESSION VARCHAR(80),
R_PASSWORD VARCHAR(40),
R_COMMENTS VARCHAR(240)
-
Эээ, а как насчет вывода в die вместе со своими причитаниями содержимого $DBI::errstr ? Было бы информативнее..
+ может стоило бы методом quote() данные обработать перед тем как сувать их в таблицу?
-
+ может стоило бы методом quote() данные обработать перед тем как сувать их в таблицу?
Или использовать placeholders.
-
Я решил дело взяв переменные $PostedData{\'x\'} в кавычки в #245.
2 Green Kakadu: Сейчас почитал доки и действительно, вышесделоанное аналогично quote(). Только quote() проще.
2Chs: С того момента, как я начил писать скрипты под mySQL не прошло и 24 часа ;-). Я перерыл все свои доки, но так и не нашёл обьяснения "placeholders".
сейчас пойду копать mysql.ru etc.. Но если вы мне обьясните, что это за фича, то большое вам моё спасибо.
-
2Chs: С того момента, как я начил писать скрипты под mySQL не прошло и 24 часа ;-). Я перерыл все свои доки, но так и не нашёл обьяснения "placeholders".
сейчас пойду копать mysql.ru etc.. Но если вы мне обьясните, что это за фича, то большое вам моё спасибо.
my $cmd = "select * from table1 where id=?";
my $sth = $dbh->prepare($cmd);
$sth->execute(1);
Вкратце.:)) Подробнее: perldoc DBI;
-
where id=?" -- Я так понял, что \'?\' и есть тот самый plaseholder?
-
where id=?" -- Я так понял, что \'?\' и есть тот самый plaseholder?
Точно.:)) Только не так буквально - это технология. которая позволяет подставлять данные в запрос, а вот в качестве места подстановки используются знаки вопроса.:))
Чем она безопаснее понятно? (в отличие от вставки переменных в строку запроса)
-
И далее идёт ->execute($var1,$var2), я прав?
-
Они последовательно подставляются на места ?
-
И далее идёт ->execute($var1,$var2), я прав?
Они последовательно подставляются на места ?
Да.
-
И
Они последовательно подставляются на места ?
;) может все-таки стоит
1. посмотреть доки по DBI, есть даже русский перевод на http://perldoc.narod.ru
2. книжку какую-нибудь поиметь?
+ ;) твой вариант "формирования" запроса, оставляет желать лучшего - это по большей части касается структуры скрипта, оч. много всего, можно пропустить какое-нибудь значение.
Лучше организовать массив с именами полей, ну вроде твоих \'recipient_now_contry\' - @data_names
а потом
$db_query = \'INSERT INTO BAZA_BONCHA VALUES (\'.
join(\',\',map{$dbh->quote($PostedData{$_}) @data_names}).
\')\';
и виднее лучше, и добавлять проще новые поля в процессе разработки + не забудешь ничего, потому как все в одном массиве.
-
http://perldoc.narod.ru я читал. Ну и запутанная в некоторых местах весч.
Кнужку я поимел. И сразу творить ;-). Чего-то там "Программирование на PERL DBI"...
+ Я пока ещё не организовывал удобность, а добивался, чтобы работало. Представленныый вариант, кстати, делает тоже самое, что и мой скрипт, но строчек занимает раза в 4 меньше. ;-).
Вообщем, к базе мне осталось сделать поиск да обновление данных и всё будет готово...
-
треть/четверть книги занимает, как-раз эта самая спецификация по dbi с http://perldoc.narod.ru.
-
треть/четверть книги занимает, как-раз эта самая спецификация по dbi с http://perldoc.narod.ru.
это вообще то DBI, куда ж от первоисточников деться?
-
$db_query = qq~SELECT LAST_INSERT_ID(\'ID\')~;
$sth = $dbh->prepare ($db_query) or die "Не приготавляется запрос: $db_query. Причина: $DBI::errstr";
$ID = $sth->execute() or die "Не работает, блин: $db_query. Причина: $DBI::errstr";
Возвращает почму-то всегда $ID = \'1\';
В чём дело?
-
1) Решил эту проблему, выполняя пока напрямую:
$ID = $dbh->func("_InsertID");
Но, всё-таки, хотелось бы понять, как это сделать через do()/execute().
2) Акт 2й: :-).
$PostedData{\'recipient_fogotten_password_email_orig\'} = $PostedData{\'recipient_fogotten_password_email\'};
$PostedData{\'recipient_fogotten_password_email\'} = $dbh->quote ($PostedData{\'recipient_fogotten_password_email\'});
$db_query = qq~SELECT *
FROM BAZA_BONCHA
WHERE R_EMAIL LIKE ?~;
$sth = $dbh->prepare ($db_query) or die "Не приготавляется запрос: $db_query. Причина: $DBI::errstr";
$sth->bind_param (1, $PostedData{\'recipient_fogotten_password_email\'});
$sth->execute() or die "Не работает, блин: $db_query. Причина: $DBI::errstr";
Это чудо работает (поиск по мылу вида SteelRat@Mail2K.Ru) только при
param = $PostedData{\'recipient_fogotten_password_email_orig\'}
а при quoted ничего не находит... :-(. В чём тут дело? Смысла строки -то квотирование не меняет?