Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.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
mysql占位符不适用于日期添加(perl)_Mysql_Perl - Fatal编程技术网

mysql占位符不适用于日期添加(perl)

mysql占位符不适用于日期添加(perl),mysql,perl,Mysql,Perl,我真的很感谢你对我最后一个问题的帮助。这是相关的,但我不想把这个问题藏在另一个问题里面。。我在占位符中使用DATE\u ADDNOW、INTERVAL$INTERVAL时遇到问题。在我使用占位符之前,这行运行得很好,但它返回时是空的 $store = qq(INSERT INTO main (creator_name,relationship,time) VALUES(?,?,?) ); my $sth = $dbh->prepare($store); $sth->ex

我真的很感谢你对我最后一个问题的帮助。这是相关的,但我不想把这个问题藏在另一个问题里面。。我在占位符中使用DATE\u ADDNOW、INTERVAL$INTERVAL时遇到问题。在我使用占位符之前,这行运行得很好,但它返回时是空的

  $store = qq(INSERT INTO main (creator_name,relationship,time) VALUES(?,?,?) );

  my $sth = $dbh->prepare($store);
  $sth->execute($data{creatorname},$data{relationship}, "DATE_ADD(NOW(), INTERVAL $interval)");
现在是否有其他方法添加DATE_,使其语法正确?我试着把它加回去

        $store = qq(INSERT INTO main (creator_name,relationship,time) VALUES(?,?, DATE_ADD(NOW(), INTERVAL $interval)) );

它说语法错了。至少在它执行的代码位于顶部时,它只是将值保留为空。通过这种尝试,它甚至不会尝试。

您希望下面的内容打印ABC吗

不,那没有意义。在SQL中也是如此

字符串DATE\u ADDNOW,INTERVAL。。。肯定不是时间字段的有效值

它错误地说语法是错误的


我很确定这条信息比这更具体。您也没有提供$interval的值,没有$interval,我们无法知道是什么导致了语法错误。

将您的qq更改为qq{}为了清楚起见,这应该是修复方法:

$store = qq{
  INSERT INTO main (creator_name,relationship,time) 
  VALUES(?, ?, DATE_ADD(NOW(), INTERVAL ? SECOND) )
};

my $sth = $dbh->prepare($store);
$sth->execute($data{creatorname},$data{relationship},$interval);
您需要将单词SECOND更改为适当的单位,$interval需要是一个整数

使用预先准备好的语句是值得称赞的,但是为什么它不能像您尝试的那样工作是非常重要的:占位符?不是简单地将任意文本替换到查询中的位置。这就是为什么我们如此强调使用预处理语句作为防止sql注入的一种方法的重要性。占位符是查询内容和数据内容之间的硬划分,它们分别发送到服务器,而不是一起发送

因此

my $sth = $dbh->prepare(qq{SELECT * FROM user WHERE username = ? AND password = ?});
$sth->execute("hacker", "' OR 1 = 1; --");
…不能被曲解成可怕的

SELECT * FROM user WHERE username = 'hacker' AND password = '' OR 1 = 1; --'
…在准备好的语句中执行时,就像使用基本字符串连接构造查询一样,因为服务器永远不会混淆这两者


占位符正好替换了一个标量文字值,而DATE\u ADDNOW,INTERVAL$INTERVAL则不是。是的,它在Perl中是一个标量字符串,但它包含一个表达式,而不是一个文本值。

在不了解更多设置的情况下,很难测试修复程序,但乍一看,它似乎将SQL语法和占位符值混在了一起。像DATE_ADD或NOW这样的标记是SQL表达式,而不是变量。每个占位符正好是一个标量变量的替代。例如,DATE\u ADDNOW,INTERVAL$INTERVAL可以变成DATE\u ADDNOW,INTERVAL?将$interval传递给执行。过去,我对MySQL的日期函数很生疏,但你需要吗?@rutter,date\u ADDNOW,INTERVAL?不起作用,因为语法是DATE\u ADDNOW,INTERVAL{expr}{unit}。你可以现在就开始约会吗?星期但不是日期?现在,间隔?或日期加现在,间隔?错误是您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以了解使用near'的正确语法。变量$interval包含1周或1个月的形式。这不是语法错误,但我明天访问MySQL时会检查以确定。同时,为我们获取实际的错误消息。
SELECT * FROM user WHERE username = 'hacker' AND password = '' OR 1 = 1; --'