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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибки при работе с MySQL, Пример кода с этого форума 
:(
    Опции темы
rcdimon
Дата 29.5.2005, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

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



Код

#!/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 пашет.
PM MAIL ICQ   Вверх
korob2001
Дата 30.5.2005, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Попробуй в этой строке, вместо 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();

Удачи.

Это сообщение отредактировал(а) korob2001 - 30.5.2005, 01:14


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
rcdimon
Дата 30.5.2005, 07:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

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



Ну значит изменил я все пароли и логины на реальные от базы данных, а так код тот последний, что ты мне привел. И все равно ошибка 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
PM MAIL ICQ   Вверх
korob2001
Дата 30.5.2005, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



А как у тебя дела обстоят с заголовком???

Это сообщение отредактировал(а) korob2001 - 30.5.2005, 09:40


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
wladk
Дата 30.5.2005, 11:00 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата
[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 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 15.3.2005
Где: Москва

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



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() - функция, которая в лог-файл записывает ошибки

Это сообщение отредактировал(а) Vaneska - 30.5.2005, 11:58
--------------------
http://isokolov.blogspot.com/
PM MAIL ICQ   Вверх
korob2001
Дата 30.5.2005, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



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

Это сообщение отредактировал(а) korob2001 - 30.5.2005, 12:16


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
rcdimon
Дата 30.5.2005, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

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



Самое интересное- когда я вставил запрос к базе. Просто 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();


PM MAIL ICQ   Вверх
Anarki
Дата 8.6.2005, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

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



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


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

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



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

Код

#!/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 "Успешно завершено";

PM MAIL ICQ   Вверх
korob2001
Дата 14.6.2005, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Заключай 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 );


Удачи.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Sadok
Дата 15.6.2005, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Можно еще покурить документацию на тему

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

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

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.0541 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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