Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > ODBC+mySQL


Автор: strength2008 18.1.2012, 17:54
Здравствуйте.
Возник следующий вопрос.
Пытаюсь выполнить простой инсерт в таблицу на mySQL сервере, однако код выдает ошибки (цикл работает): 
DBD::mysql:smileb do failed: Unknown column 'forth_word' in 'field list' at d:\Prog
ramming\Perl\DBI.pl line 72.

Код:
Код

$mass=[forth_word, fifth_word, sixth_word];
for (@$mass)
{
# $id++;
my $desc=my $w=$_;
$desc=~s /(.+)/this_is_\1/;
$dbh->sql("Insert into NewT(word,description) Values ($word,$desc);") 
and warn "Can't".$dbh->Error." \n"
}


Собсно, непонятно, кто виноват - драйвер mysql или же perl-овая библиотека, в этой ошибке - ибо, синтаксис с точки зрения mysql вполне верный, и почему значения для инсерта выдаются за названия вставляемых полей. непонятно.
Уже долго мучаю эту тему. но что-то не движется с места, может, я не верный синаксис perl-а использую?
Спасибо.

Автор: Pfailed 18.1.2012, 19:25
Вы кавычки не забыли? Что в запросе, что в определении массива.

Автор: strength2008 19.1.2012, 08:20
Pfailed, в определении массива точно нет, там же ссылка на анонимный массив идет:

Код

$mass=[forth_word, fifth_word, sixth_word];


а в запросе где я мог кавычки забыть?

Код


for (@$mass)
{
# $id++;
my $desc=my $w=$_;
$desc=~s /(.+)/this_is_\1/;
$dbh->sql("Insert into NewT(word,description) Values ($word,$desc);") 
and warn "Can't".$dbh->Error." \n"
}

Автор: Absinthe 19.1.2012, 08:27
Цитата

$word,$desc
 Тут. Экранирование строк где?

Автор: strength2008 19.1.2012, 08:44
Absinthe, т.е. надо написать:

Код

$dbh->sql("Insert into NewT(word,description) Values ("$word","$desc");");


так?

Добавлено @ 08:47
Вернее, вот так написал:

Код

$dbh->sql("Insert into NewT(word,description) Values (".$w.",".$desc.");") 


но результат тот же.

Автор: Absinthe 19.1.2012, 10:13
strength2008, отладка. Распечатай запрос и посмотри на него.

Автор: arto 19.1.2012, 10:13
Unknown column 'forth_word' in 'field list' наводит на мысль о грамматической ошибке.
вы уверены, что колонка именно так называется?

Автор: strength2008 19.1.2012, 18:17
Absinthe, смотрел, нормально по идее все получается:

Код

print $dbh->sql("Insert into NewT(word,description) Values ($word,$desc);")


дает, как и ожидалось, 

Insert into NewT(word,description) Values (forth_word,forth_word_desc)

и.т.п. т.е. вроде нормальный SQL-код. Но ошибка остается при этом.


arto, нет, колонка именно что так не называется. Но почему-то вставляемое значение интерпретируется как поле для вставки, о чем и пишет мне ошибку:
DBD::mysql:smileb do failed: Unknown column 'forth_word' in 'field list' at d:\Prog

Автор: Pfailed 19.1.2012, 18:43
>Insert into NewT(word,description) Values (forth_word,forth_word_desc)
Должно быть Insert into NewT(`word`,`description`) Values ('forth_word','forth_word_desc')

Автор: strength2008 19.1.2012, 18:52
Pfailed, 

написал так:
Код

$dbh->sql("Insert into NewT('word','description') Values ('$w','$desc');") 


Но, теперь просто выдает синтаксическую ошибку и все. Я уже в 3 книжках посмотрел код, который был первоначально у меня - у авторов вроде бы все работает, у меня нет(
Смотрел у Ларри Уолла в книжке и в "perl и системное администрирование".

Автор: Absinthe 19.1.2012, 19:04
strength2008, твоя ошибка в том, что использование MySQL из Perl предполагает знание MySQL, а не только Perl. Сначала поработай с MySQL в консоли(советую dbForge) и только потом используй ее в ЯП.

Ты путаешь строковое значение и столбец.

Автор: Pfailed 19.1.2012, 20:12
Цитата(strength2008 @  19.1.2012,  18:52 Найти цитируемый пост)
написал так:

Разницу между ' и ` видим?

Автор: tzirechnoy 19.1.2012, 23:36
Документацыя по модулям perl добывается при помощи команды perldoc. Например, perldoc DBI -- документацыя по DBI, perldoc DBD::mysql -- документацыя по возможностям драйвера mysql в DBI.

Ваш код в примере -- это какой-то ужас. Начиная с того, что он не запустится, поскольку нет use DBD и вообще всего соединения с базой. Постить такие отрывки вполне нормально -- если Вы и уверены в том, что правильно написали остальную обвязку, и уверены, что и окружающие её с лёгкостью напишут. Когда Вы только начали изучать этот раздел подобная самоуверенность несколько несвоевременна. 
Кроме того, он ни при каких обстоятельствах не можэт выдать того, что Вы написали. То есть Вы ещё и что-то не то скопировали.

Впрочем, ключевую вещь, которую в обязательном порядке следует понять перед тем, как писать на DBI -- раздел "Placeholders and Bind Values" из его документацыи. Замечу, что ими совершэнно необязательно пользоваться -- но их надо понимать.

Автор: strength2008 20.1.2012, 07:28
Absinthe, 
Pfailed, 
окончательно разобрался. большое вам спасибо. 
Да, я действительно подзабыл, что в MySql `и ' это разные символы, и несут разную семантическую нагрузку.

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