То же самое сказал Зан Линкс о заполнителях. Но вы можете все еще задаться вопросом, почему ваш код не удался.
Похоже, что вы забыли важную деталь из предыдущего кода, который работал у вас годами: цитаты.
Этот (проверенный) код отлично работает:
my $thing = 'abcde';
my $sth = $dbh->prepare("INSERT INTO table1 (id,field1)
VALUES (3,'$thing')");
$sth->execute;
Но следующий код (без кавычек в поле VALUES, как в первом примере) создает ошибку, о которой вы сообщаете, потому что VALUES (3, $ thing) разрешается в VALUES (3, abcde), заставляя ваш SQL-сервер выглядеть для поля с именем abcde, и нет поля с таким именем.
my $thing = 'abcde';
my $sth = $dbh->prepare("INSERT INTO table1 (id,field1)
VALUES (3,$thing)");
$sth->execute;
Все это предполагает, что ваш первый пример не является прямой цитатой кода, который потерпел неудачу, как вы описываете, и, следовательно, не соответствует тому, что вы намеревались. Он разрешает:
"INSERT INTO summery (process) VALUES(process)"
, который, как упоминалось выше, заставляет ваш SQL-сервер читать элемент в ЗНАЧЕНИЯХ, заданных как другое имя поля. Как указано, это фактически выполняется на MySQL без жалоб и заполнит поле с именем «process» значением NULL, потому что это то, что содержится в поле с именем «process», когда MySQL искал там значение при создании новой записи.
Я использую этот стиль для быстрых одноразовых взломов, включающих известные защищенные данные (например, значение, предоставленное в самой программе). Но для всего, что связано с данными, которые поступают из-за пределов программы или могут содержать какие-либо данные, кроме [0-9a-zA-Z], вам не придется использовать заполнители.