Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何将这两种说法结合起来?_Perl_Xampp_Cgi - Fatal编程技术网

Perl 如何将这两种说法结合起来?

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

我目前正在尝试将数据从文本框插入数据库,$enter/$enter2是写入文本的地方

数据库由三列组成:ID、name和name2

ID是自动递增的,工作正常

这两个语句本身都可以很好地工作,但是因为它们是单独发布的,所以第一个名称为空,第二个名称为空

我试着把两者结合起来,但运气不太好,希望有人能帮上忙

$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)