Mysql 为什么我的插入有时会以“失败”结尾;没有这样的字段;?

Mysql 为什么我的插入有时会以“失败”结尾;没有这样的字段;?,mysql,perl,insert,Mysql,Perl,Insert,多年来,我一直在开发中使用以下代码片段。现在我突然得到一个DB错误:没有这样的字段警告 $process = "process"; $create = $connection->query ( "INSERT INTO summery (process) VALUES($process)" ); if (DB::isError($create)) die($create->getMessage($create)); 但是如果我用数字就可以了 $process = "1234

多年来,我一直在开发中使用以下代码片段。现在我突然得到一个DB错误:没有这样的字段警告

$process = "process";
$create = $connection->query
(
    "INSERT INTO summery (process) VALUES($process)"
);
if (DB::isError($create)) die($create->getMessage($create));
但是如果我用数字就可以了

$process = "12345";
$create = $connection->query
(
    "INSERT INTO summery (process) VALUES($process)"
);
if (DB::isError($create)) die($create->getMessage($create));
或者将值直接写入表达式中

$create = $connection->query
(
    "INSERT INTO summery (process) VALUES('process')"
);
if (DB::isError($create)) die($create->getMessage($create));

我真的很困惑。。。有什么建议吗?

最好使用预先准备好的查询和参数占位符。在Perl DBI中类似这样:

my $process=1234;
my $ins_process = $dbh->prepare("INSERT INTO summary (process) values(?)");
$ins_process->execute($process);
为了获得最佳性能,请在打开数据库连接后立即准备所有常用的查询。许多数据库引擎会在会话期间将它们存储在服务器上,就像小型临时存储过程一样


这对安全也很有好处。自己将值写入insert字符串意味着您必须在每个SQL语句中编写正确的转义码。使用prepare-and-execute样式意味着只有一个位置(execute)需要知道转义,如果转义是必要的。

Zan Lynx关于占位符的话也是如此。但您可能仍然想知道为什么代码失败

似乎您忘记了前一段代码中的一个关键细节:引号

此(已测试)代码运行良好:

my $thing = 'abcde';
my $sth = $dbh->prepare("INSERT INTO table1 (id,field1)
                              VALUES (3,'$thing')");
$sth->execute;
但是下面的代码(与第一个示例一样,在VALUES字段中缺少引号)会生成您报告的错误,因为值(3,$thing)解析为值(3,abcde),导致SQL server查找名为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 server读取设置为另一个字段名的值中的项。如前所述,这实际上是在MySQL上运行的,没有任何问题,并且会用NULL填充名为“process”的字段,因为当MySQL在创建新记录时在该字段中查找值时,该字段名为“process”


我确实使用这种风格来进行涉及已知安全数据(例如程序本身提供的值)的快速一次性黑客攻击。但对于任何涉及来自程序外部的数据或可能包含[0-9a-zA-Z]以外的数据的内容使用占位符可以省去你的痛苦。

如果你提供了你正在使用的DB API的名称,这将对读者非常有帮助,你会得到更有意义和更准确的答案。也许是因为你拼错了“摘要”,一个鬼魂在机器上戏弄你。