Perl 如何将这两种说法结合起来?
我目前正在尝试将数据从文本框插入数据库,$enter/$enter2是写入文本的地方 数据库由三列组成:ID、name和name2 ID是自动递增的,工作正常 这两个语句本身都可以很好地工作,但是因为它们是单独发布的,所以第一个名称为空,第二个名称为空 我试着把两者结合起来,但运气不太好,希望有人能帮上忙Perl 如何将这两种说法结合起来?,perl,xampp,cgi,Perl,Xampp,Cgi,我目前正在尝试将数据从文本框插入数据库,$enter/$enter2是写入文本的地方 数据库由三列组成:ID、name和name2 ID是自动递增的,工作正常 这两个语句本身都可以很好地工作,但是因为它们是单独发布的,所以第一个名称为空,第二个名称为空 我试着把两者结合起来,但运气不太好,希望有人能帮上忙 $dbh->do("INSERT INTO $table(name) VALUES ('".$enter."')"); $dbh->do("INSERT INTO $table(n
$dbh->do("INSERT INTO $table(name) VALUES ('".$enter."')");
$dbh->do("INSERT INTO $table(nametwo) VALUES ('".$enter2."')");
您应该阅读数据库手册 查询应为:
$dbh->do("INSERT INTO $table(name,nametwo) VALUES ('".$enter."', '".$enter2."')");
套用别人的话:
my $sth = $dbh->prepare("INSERT INTO $table(name,nametwo) values (?,?)");
$sth->execute($enter, $enter2);
因此,您不必担心引用。SQL语法是
INSERT INTO MyTable (
name_one,
name_two
) VALUES (
"value_one",
"value_two"
)
生成SQL语句的方法非常脆弱。例如,如果表名为
Values
或值为Jester's
,则它将失败
解决方案1:
$dbh->do("
INSERT INTO ".$dbh->quote_identifier($table_name)."
name_one,
name_two
) VALUES (
".$dbh->quote($value_one).",
".$dbh->quote($value_two)."
)
");
解决方案2:占位符
$dbh->do(
" INSERT INTO ".$dbh->quote_identifier($table_name)."
name_one,
name_two
) VALUES (
?, ?
)
",
undef,
$value_one,
$value_two,
);
非常感谢,我知道我试过类似的方法,不确定我遗漏了什么不要自己引用db语句的字符串。更好地使用准备好的语句,并将变量提供给语句处理程序。这在很多级别上都很糟糕。为什么不在
do
上使用prepare
和execute
?它允许您使用占位符并避免插值,从而防止sql注入攻击。此外,您不必拆分字符串并使用串联运算符
来插值标量变量,您只需将它们放入:值(“$enter”,…
(但不要像我说的那样在这里这么做)。@TLP,Re“为什么不使用prepare
和execute
而不是do
?”,这是不必要的“它允许您使用占位符”,与do
或$dbh->do相同(“插入$table(name,nametwo)值(?,)”,undef,$enter,$enter2)
如果我们只执行一次。还请注意,此代码不会按原样工作。您需要执行my$sth=$dbh->prepare(…)
和$sth->execute
除非您仍然插入$table
,而不是使用$dbh->quote\u标识符($table)