Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > Ошибки при работе с MySQL


Автор: rcdimon 29.5.2005, 20:06
Код

#!/usr/bin/perl -w    
use DBI;    
open STDERR, ">err";    
@dbs = DBI->data_sources("mysql");    
$dbh = DBI->connect('DBI::mysql::myname', undef, undef);    
print $DBI->errstr;    
<stdin>;


Отвечает мне Денвер:

The server encountered an internal error or misconfiguration and was unable to complete your request.

А в errors.log

[Sun May 29 23:04:29 2005] [error] [client 127.0.0.1] Premature end of script headers: /home/localhost/cgi-bin/2.cgi
[Sun May 29 23:04:29 2005] [error] [client 127.0.0.1] Name "main::DBI" used only once: possible typo at \home\LOCALH~1\cgi-bin\2.cgi line 6.

[Sun May 29 23:04:29 2005] [error] [client 127.0.0.1] Name "main::dbh" used only once: possible typo at \home\LOCALH~1\cgi-bin\2.cgi line 5.

[Sun May 29 23:04:29 2005] [error] [client 127.0.0.1] Name "main::dbs" used only once: possible typo at \home\LOCALH~1\cgi-bin\2.cgi line 4.




Совсем не понимаю в чем дело.. Не хочет работать MySQL и все тут! Я скачивал готовые скрипты тоже ошибки выдают. При этом форум phpBB установлен. То есть в принципе MySQL пашет.

Автор: korob2001 30.5.2005, 01:00
Попробуй в этой строке, вместо undef вставить пустые строки:
Код

$dbh = DBI->connect('DBI::mysql::myname', "", "");

Если не поможет, тогда попробуем пойти другим путём:
Код

#!/usr/bin/perl -w
use strict;
use DBI;

# Настройки подключения
my $host = "localhost";
my $base = "mybase";
my $log  = "login";
my $pass = "password";

# Подключаемся к базе
my $dbh = DBI->connect("DBI:mysql:host=$host;database=$base", $log, $pass);

# Здесь делаем что-то с подключением

# Отключаемся
$dbh->disconnect();

Удачи.

Автор: rcdimon 30.5.2005, 07:30
Ну значит изменил я все пароли и логины на реальные от базы данных, а так код тот последний, что ты мне привел. И все равно ошибка 500


[Mon May 30 10:33:56 2005] [error] [client 127.0.0.1] Premature end of script headers: /home/localhost/cgi-bin/3.cgi

Автор: korob2001 30.5.2005, 09:37
А как у тебя дела обстоят с заголовком???

Автор: wladk 30.5.2005, 11:00
Цитата
[Mon May 30 10:33:56 2005] [error] [client 127.0.0.1] Premature end of script headers: /home/localhost/cgi-bin/3.cgi


Есть мнение, что данно сообщение может быть не связано с коннектом к базе. Проверить очень просто, заремь все строки кроме 1,2,3 И запусти.... Есть смутные ощущения, что это сообщение может быть вызвано не системными символами перевода строки.....

Ориентируясь на название раздела топика, и имя файла, предпологается вывод информации в некий браузер. А это в свою очередь требует соблюдения неких формальностей. В частности вывода заголовка:

Код

print qq!<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">!;


Это один из вариантов беспорно...

строку коннекта к БД
Код

my $dbh = DBI->connect("DBI:mysql:host=$host;database=$base", $log, $pass);


я бы рекомендовал несколько изменить, и тем самым сделать ее более "разговорчивой"

Код

my $dbh = DBI->connect("DBI:mysql:host=$host;database=$base", $log, $pass, { PrintError => 1, RaiseError => 1 } )
      or die "Error: $DBI::errstr\n";


Анализировать результат коннекта/открытия файла/etc никогда не помешаетsmile

Такэ.....

Автор: Vaneska 30.5.2005, 11:54
rcdimon, если ты тользуешься Денвером, то указывай логин root, пороля у него нет.
А потом, когда программы на сервер ставить будешь, в настройках логин и пароль измени.
Вот как я делаю:
Код

my $DbName='db_name'; # имя БД
my $DbHost='localhost';   # имя хоста 
my $DbLogin='root';    # имя пользователя БД
my $DbPass='';        # пароль пользователя БД
my $DbPort=3306;            # порт MySQL

# подключение к базе данных
my $dbh="DBI:mysql:$DbName:$DbHost:$DbPort";
$dbh=DBI->connect($dbh, $DbLogin, $DbPass) || &Raport("$DbName error connecting");


Raport() - функция, которая в лог-файл записывает ошибки

Автор: korob2001 30.5.2005, 12:13
Да от ошибок подключения мы уже избавились. Как правило 500 ошибка с подобным сообщением, выводится в том случае, если не верно выведен или вообще не задан зоголовок.

Автор: rcdimon 30.5.2005, 22:15
Самое интересное- когда я вставил запрос к базе. Просто SELECT то все сработало. ПРограмма просто бездельничать не хотела smile Так что теперь работет. Вот в таком виде

Код

#!/usr/bin/perl -w    
use DBI;    
use CGI qw(:all);

print header( -charset => 'Windows-1251' );

my $host = "localhost";    
my $base = "my";    
my $log  = "my";    
my $pass = "my";    

open STDERR, ">err.txt";     
my $dbh = DBI->connect("DBI:mysql:host=$host;database=$base", $log, $pass);    

$sql = "SELECT
             login
             FROM
             users_table";

$sth = $dbh->prepare( $sql );
$sth->execute();


Автор: Anarki 8.6.2005, 21:33
А может заработало, то что ты добавил это?
Код

use CGI qw(:all);    
print header( -charset => 'Windows-1251' );

Автор: rcdimon 14.6.2005, 12:08
А сейчас все нормально. Запись идет. Базы создает и т.д. Но записывае почему-то только цифры. Если в выражении есть буквы- он не пишет.

Код

#!/usr/bin/perl
use CGI qw(:all);

print header( -charset => 'Windows-1251' );


use DBI;    

# Настройки подключения    
my $host = "localhost";    
my $base = "my";    
my $log  = "my";    
my $pass = "my";    

# Подключаемся к базе    
open STDERR, ">err.txt";   
my $dbh = DBI->connect("DBI:mysql:host=$host;database=$base", $log, $pass);    

# Здесь делаем что-то с подключением    


$sql = "INSERT INTO
    pf_users_2
    (
        login,
        pass

    )
    VALUES
    (
        1,
        1111111111111
    )
    ";


# Отключаемся    

$sth = $dbh->prepare( $sql );    
$sth->execute();

$dbh->disconnect();

print "Успешно завершено";


вот если вставить вместо цифр (в данном случае едениц) буквы, то вылезет такая ошибка

DBD::mysql::st execute failed: Unknown column '55ZOzut' in 'field list' at \home\test1.ru\cgi\3.cgi line 67.

А создавалась таблица вот таким кодом

Код

#!/usr/bin/perl
use CGI qw(:all);


use DBI;    

# Настройки подключения    
my $host = "localhost";    
my $base = "my";    
my $log  = "my";    
my $pass = "my";    

# Подключаемся к базе    
open STDERR, ">err.txt";   
my $dbh = DBI->connect("DBI:mysql:host=$host;database=$base", $log, $pass);    

# Здесь делаем что-то с подключением    


$sql = "CREATE TABLE PF_USERS_2
     (    id    MEDIUMINT    NOT NULL AUTO_INCREMENT,
        login    VARCHAR(13)        NOT NULL,
        pass    TEXT        NOT NULL,
        PRIMARY KEY (id),
        INDEX (login)
        )";



$sth = $dbh->prepare( $sql );    
$sth->execute();

$dbh->disconnect();

print "Успешно завершено";

Автор: korob2001 14.6.2005, 14:37
Заключай VALUES в одинарные кавычки, например:
Код

my $sql = "INSERT INTO MyTable (Name, Family, Age) VALUES ('Вася', 'Пупкин', '15')";

# Если из переменных, тогда так:

my $sql = "INSERT INTO MyTable (Name, Family, Age) VALUES ('$name', '$family', '$age')";

$dbh->do( $sql );


Удачи.

Автор: Sadok 15.6.2005, 09:24
Можно еще покурить документацию на тему

quote($string)
Метод quote используется для экранирования специальных символов в запросе символами экранирования, а также заключения данных в необходимые внешние символы цитирования (например кавычки). Пример:

$sql = $dbh->quote($string)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)