PHP - 存储函数而不执行它

时间:2015-04-26 02:40:13

标签: php database sqlite function

我想存储这个:

strftime(&#39;%Y-%m-%d%H:%M:%S&#39;,&#39;现在&#39;,&#39; +3天&#39;)< / p>

在变量中没有被执行。

我想在SQLite数据库中插入这一行,但是&#34; strftime&#34;已经是一个PHP函数,它会抛出一个错误,告诉这行是&#34; false&#34;。(这是真的,因为在PHP中执行)

但在SQLite中,我知道这是一个完全正确的陈述。(我确实直接在我的数据库中执行它,它给了我想要的东西)

以下是我的代码的一部分:

$limitDate = strftime('%Y-%m-%d %H:%M:%S','now', '+3 day');

$stmt = $db->prepare('INSERT INTO opened_order(name, email, date_limit, pack, details) 
        VALUES(:name, :email, :limitDate, :pack, :details)');

$stmt->bindParam(':limitDate', $limitDate);

我正在添加一些信息来提供帮助。 直接在SQLite shell中执行时这是正确的:

`INSERT INTO opened_order(name, email, date_limit, pack, details)
 VALUES ('Meh!', 'okok@yes.com', strftime('%Y-%m-%d %H:%M:%S','now', '+3 day'), 'TD', 'Je veux un ordinateur de moins de 18 kilos.');`

但是有strftime(&#39;%Y-%m-%d%H:%M:%S&#39;,&#39;现在&#39;,&#39; +3天&#39; )在PHP中抛出一个错误(警告:strftime()最多需要2个参数,给出3个)因为PHP的strftime与SQLite的不同。

3 个答案:

答案 0 :(得分:1)

不幸的是,您无法让数据库调用PHP函数。但那不是你想要做的。

你想要做的是调用SQLite自己的strftime函数,对吗?

你做错了是把它作为一个绑定参数。这不是你在PHP中执行并将结果传递给数据库的东西 - 这是绑定参数的用途。相反,您希望将该函数作为查询本身的一部分执行 - 您希望数据库执行它。在这种情况下,只需将其作为查询的一部分:

$stmt = $db->prepare('INSERT INTO opened_order(name, email, date_limit, pack, details) 
        VALUES(:name, :email, strftime(\'%Y-%m-%d %H:%M:%S\',\'now\', \'+3 day\'), :pack, :details)');

请参阅绑定参数以防止SQL注入 - 您不希望数据被误解为SQL语法的一部分(如果某人的名字为DROP DATABASE;会怎样?)。但是,在这种情况下,您的strftime调用不是数据 - 它实际上是查询的SQL语法的一部分。所以你需要把它放在查询字符串中。

希望这有帮助。

答案 1 :(得分:0)

将其简单地声明为String。

$var = "strftime('%Y-%m-%d %H:%M:%S','now', '+3 day')";

希望我理解你的问题吧??

<强>更新

如果要使用各种变量动态构建查询,还可以使用以下示例:

$var = "strftime('%Y-%m-%d %H:%M:%S','now', '+3 day')";
$query = "INSERT INTO opened_order (name, email, date_limit, pack, details) VALUES (:name, :email, $var, :pack, :details)";

答案 2 :(得分:-1)

我认为eval会做到这一点。http://php.net/manual/en/function.eval.php

<?php
$var = "strftime('%Y-%m-%d %H:%M:%S','now', '+3 day');";
eval($var);
?>