Mysql date_add 1年

标签 mysql perl

有人可以帮我弄清楚为什么添加 1 年对我不起作用吗?

我还有 6 个其他条件(1 天、1 周、2 个月等)。唯一不起作用的是年份。

有人明白为什么吗?如果重要的话,这就是 Perl。

elsif ($data{length} == "6month")
{
$store = qq(INSERT INTO main (creator_name,email2,relationship,reason,email1,name1,creator_email,email3,name2,name3,creator_url,victim_url,length_of_stay,release_date) VALUES("$data{creatorname}","$data{email2}","$data{relationship}","$data{reason}","$data{email1}","$data{person1}","$data{creatoremail}","$data{email3}","$data{person2}","$data{person3}", "$creatorURL", "$victimURL","$data{length}", DATE_ADD(NOW(), INTERVAL 6 MONTH)) );
}
elsif($data{length} == "1year")
{
$store = qq(INSERT INTO main (creator_name,email2,relationship,reason,email1,name1,creator_email,email3,name2,name3,creator_url,victim_url,length_of_stay,release_date) VALUES("$data{creatorname}","$data{email2}","$data{relationship}","$data{reason}","$data{email1}","$data{person1}","$data{creatoremail}","$data{email3}","$data{person2}","$data{person3}", "$creatorURL", "$victimURL","$data{length}", DATE_ADD(NOW(), INTERVAL 1 YEAR)) );
}

my $sth = $dbh->prepare($store);
$sth->execute() or die $dbh->errstr;

最佳答案

您应该使用“eq”运算符来比较 Perl 中的字符串。

elsif ( $data{length} eq '6month') {

如果您在 sql 语句中使用占位符,效果会更好。因为:

  • 它们几乎相同
  • 它将保护您免受 SQL 注入(inject)
  • 您可以多次使用一个准备好的语句,当 你在循环中有类似的语句
  • 您将减少代码重复。不要重复自己

您的代码将如下所示:

my $interval = 0;
...
elsif ( $data{length} eq '6month' ) {
    $interval = 6;
}
elsif( $data{length} eq '1year' ) {
    $interval = 12;
}
my $sth = $dbh->prepare( 'INSERT INTO main ( creator_name, email2, relationship, reason, email1, name1, creator_email, email3, name2, name3, creator_url, victim_url, length_of_stay, release_date ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, DATE_ADD(NOW(), INTERVAL ? MONTH) );' );
$sth->execute( $data{creatorname},
               $data{email2},
               $data{relationship},
               $data{reason},
               $data{email1},
               $data{person1},
               $data{creatoremail},
               $data{email3},
               $data{person2},
               $data{person3},
               $creatorURL,
               $victimURL,
               $data{length},
               $interval
             ) or die $dbh->errstr;

如果您必须在循环中插入此操作,请将 $dbh->prepare 语句移到该循环之外。

关于Mysql date_add 1年,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20111762/

相关文章:

perl - =~/^0$/在 Perl 中是什么意思?

windows - Windows 上的 Perl、文件关联和 I/O 重定向

mysql内存缓存

php - 多个(更少)插入到三列表与存储在单列中 Php-Mysql

PHP mysql 多重内连接

php - 将来自 mySQL 的 PDO 请求输出到下拉选择器列表中

mysql - 如何配置 Hibernate C3P0 池

perl - 如果文件已排序,为什么 Tie::File 会添加一行?

perl - 为什么我的 Perl/Tk Scrolled 实际上没有滚动?

Perl:如何强制要求 64 位 perl 编译器要求运行程序