Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с добавлением данных из формы в БД, Perl CGI DBI 
:(
    Опции темы
vxk7m
Дата 19.5.2008, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 6.2.2008

Репутация: нет
Всего: нет



Здравствуйте уважаемые. Возникла такого рода проблема: скрипт получает данные из формы и должен их писать в БД. Данные то он получает, но вот почему то не пишет в БД ничего =(, нужна ваша помощь. Вот сам скрипт:

Код

#!/usr/bin/perl

use strict;
use warnings;
require "functions.pl";

use CGI qw(:standard escapeHTML);
use DBI;

my $db_s = 'DBI:mysql:mans:localhost'; #credyt - database name
my $db_user = 'user';    #db login
my $db_pass = 'pass';    #db password

if (!param('id')){
    print_start();
    print '<form name="insert_form" action="manage.pl" method="POST">';
    print "<center><table border=\"2\" cellspacing=\"2\" cellpadding=\"5\">\n";
    print '<tr><td><a>Фамилия: </a></td><td><input name="fn" type="text" size=50></td></tr></br>';
    print "<tr><td><a>Имя: </a></td><td><input name=\"n\" type=\"text\" size=50></td></tr></br>\n";
    print '<tr><td><a>Отчество: </a></td><td><input name="sn" type="text" size=50></td></tr></br>';
    print '<tr><td><a>Номер паспорта: </a></td><td><input name="pas" type="text" size=50></td></tr></br>';
    print '<tr><td><a>Идентификационный код: </a></td><td><input name="id" type="text" size=50></td></tr></br>';
    print '<tr><td><a>Место жительства: </a></td><td><input name="livep" type="text" size=50></td></tr></br>';
    print '<tr><td><a>Номер телефона: </a></td><td><input name="phone" type="text" size=50></td></tr></br>';
    print '<tr><td><a>Информация: </a></td><td><input name="info" type="text" size=50></td></tr></br>';
    print '</table>';
    print '</br></br><input type="submit" value="Добавить данные">';
    print '</form>';
    print end_html();
    return 0;
}

my $fn = param('fn');
$fn = escapeHTML($fn);
my $n = param('n');
$n = escapeHTML($n);
my $sn = param('sn');
$sn = escapeHTML($sn);
my $pas = param('pas');
$pas = escapeHTML($pas);
my $id = param('id');
$id = escapeHTML($id);
my $livep= param('livep');
$livep = escapeHTML($livep);
my $phone= param('phone');
$phone = escapeHTML($phone);
my $info= param('info');
$info = escapeHTML($info);


my $dbh = DBI -> connect($db_s, $db_user, $db_pass);
my $sth = $dbh -> prepare('insert into mans values ("$fn", "$n", "$sn", "$pas", "$id", "$livep", "$phone", "$info")');
$sth -> execute();
$dbh -> disconnect();

print_start();
print "<center><a>Информация была добавлена</a></br>\n";
print "<a href=manage.pl>Возвратится на страницу управления</a></center>\n";
#print "</br><a>$fn $n $sn $pas $id $livep $phone $info</a></br>";#dbg
print end_html();


Сама таблица имеет вот такой формат:
Код

mysql> describe mans;
+-------+------------------+------+-----+---------+----------------+
| Field | Type             | Null | Key | Default | Extra          |
+-------+------------------+------+-----+---------+----------------+
| fn    | varchar(50)      | YES  |     | NULL    |                |
| n     | varchar(50)      | YES  |     | NULL    |                |
| sn    | varchar(50)      | YES  |     | NULL    |                |
| pass  | varchar(12)      | YES  |     | NULL    |                |
| id    | varchar(10)      | NO   | PRI |         |                |
| livep | varchar(256)     | YES  |     | NULL    |                |
| phone | varchar(32)      | YES  |     | NULL    |                |
| info  | varchar(512)     | YES  |     | NULL    |                |
| num   | int(10) unsigned | NO   | MUL | NULL    | auto_increment |
+-------+------------------+------+-----+---------+----------------+
9 rows in set (0.00 sec)



Зарание спасибо.

Это сообщение отредактировал(а) vxk7m - 19.5.2008, 18:28
PM MAIL   Вверх
nitr
Дата 19.5.2008, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 12
Всего: 84



vxk7m, с ковычками вы напутали
Код

my $sth = $dbh -> prepare('insert into mans values ("$fn", "$n", "$sn", "$pas", "$id", "$livep", "$phone", "$info")');

замените на
Код

my $sth = $dbh -> prepare("insert into mans values ('$fn', '$n', '$sn', '$pas', '$id', '$livep', '$phone', '$info')");


На структуру и другое я не смотрел, увидел явную ошибку, думаю всё нормально будет...


--------------------
PM   Вверх
Itsys
Дата 19.5.2008, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: нет
Всего: 34



Цитата(vxk7m @  19.5.2008,  17:59 Найти цитируемый пост)
my $sth = $dbh -> prepare('insert into mans values ("$fn", "$n", "$sn", "$pas", "$id", "$livep", "$phone", "$info")');


Для SQL " != ',
надо так:
Код

my $sth = $dbh -> prepare("insert into mans values ('$fn', '$n', '$sn', '$pas', '$id', '$livep', '$phone', '$info')");


ЗЫ Во всяком случае это верно для MSSQL с mySQL не общался.

Добавлено через 32 секунды
nitr, опередил  smile 
PM MAIL WWW Skype   Вверх
vxk7m
Дата 19.5.2008, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 6.2.2008

Репутация: нет
Всего: нет



Спасибо большое за ваши ответы, но более того, обнаружилось, что такой код тоже не добавляет данные:
Код


#!/usr/bin/perl

use strict;
use warnings;
use DBI;

my $db_s = "DBI:mysql:mans:localhost";
my $db_u = "root";
my $db_p = "";

my $fn = 'aaa1';
my $sn = 'aaa1';
my $n = 'aaa1';
my $pas = 'AC123543';
my $id = '5555555555';
my $livep = 'dqwdasdq 123/51';
my $phone = '121212';
my $info = 'someinfo';

my $dbh = DBI -> connect($db_s, $db_u, $db_p);
my $sth = $dbh -> prepare("insert into mans values ('$fn','$n','$sn','$pas','$id','$livep','$phone','$info')");
$sth -> execute();
$dbh -> disconnect();

print "Content-type: text/html\n\n";
print '<html><body bgcolor=#ccdbd6>';
print '<a>All done</a><body><html>';


Я в отчаянии =\
PM MAIL   Вверх
nitr
Дата 19.5.2008, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 12
Всего: 84



vxk7m, прочтие документацию по DBI
И сделайте верный коннект к базе, + выводите ошибку + посмотрите в логах апача!


--------------------
PM   Вверх
vxk7m
Дата 20.5.2008, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 6.2.2008

Репутация: нет
Всего: нет



Всё, всем спасибо, проблема была в том, что оказывается, даже если атрибут есть auto increment, то его всеравно нужно передавать в запросе хоть пустым.
Вот тут
Код

my $sth = $dbh -> prepare("insert into mans values ('$fn','$n','$sn','$pas','$id','$livep','$phone','$info','')");

PM MAIL   Вверх
nitr
Дата 21.5.2008, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 12
Всего: 84



vxk7m, посмотрите как ещё можно добавлять данные в БД, но это уже SQL. Тогда в будущем у вас меньше ошибок/вопросов будет...


--------------------
PM   Вверх
pompei
Дата 29.5.2008, 08:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 7.9.2007

Репутация: нет
Всего: 6



А если переменные содержат строки с кавычками? smile 
Или SQL-команды всякие грамотно обставленные кавычками введённые хакером прямо в браузере, которые могут сделать чё угодно в Вашей БД, например drop database ...  smile 

Например в поле info хакер введёт строку:
Код

ляляля' ); drop database mysql;


Страшно да?

Поэтому правильнее так:
Код

...
my $sth = $dbh->prepare("insert into mans values ( ?, ?, ?, ?, ?, ?, ?, ? )");
$sth->execute( $fn, $n, $sn, $pas, $id, $livep, $phone, $info );
....

 smile  И все проблеммы решены

Это сообщение отредактировал(а) pompei - 29.5.2008, 08:15
--------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап.
PM MAIL   Вверх
nitr
Дата 29.5.2008, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 12
Всего: 84



pompei, по этой теме есть уже обсуждение, попробуйте найти поиском. Там очень хорошие способы приводились.


--------------------
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: разработка для Web | Следующая тема »


 




[ Время генерации скрипта: 0.0496 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.