2013-11-21 2 views
2

Может кто-нибудь помочь мне выяснить, почему добавление 1 года не работает для меня?Mysql date_add 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; 
+2

Я уверен, что вы можете придумать лучшее описание, чем * «не работают» * и * «не работает» * – Borodin

ответ

3

Вы должны использовать оператор «eq» для сравнения строк в perl.

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

также будет лучше, если вы будете использовать заполнители в своих операторах sql. потому что:

  • Они почти такие же
  • Это защитит вас от SQL инъекций
  • Вы можете использовать один подготовленные несколько раз выписки, это быстрее, когда вы подобные заявления в цикле
  • Вы уменьшат код повторяется. Не повторяйте себя

Ваш код будет выглядеть так:

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 о вне этого цикла.

2

Ваша проблема с root заключается в том, что вы не включаете предупреждения; если у вас, вы бы получили предупреждение, как это:

$ perl 
use warnings; 
$data{length} = "1year"; 

if ($data{length} == "1month") { 
    print "yes, 1month does == 1year\n"; 
} 
__END__ 
Argument "1month" isn't numeric in numeric eq (==) at - line 4. 
Argument "1year" isn't numeric in numeric eq (==) at - line 4. 
yes, 1month does == 1year 
Смежные вопросы