为什么你不能将MYSQL函数传递给准备好的PDO语句?

JM4*_*JM4 9 php mysql pdo prepared-statement

在我看来,以下脚本应该工作:

$stmt = $db->prepare("UPDATE table SET status = ?, date_modified = ?");
$stmt->execute(array(1, 'NOW()'));
Run Code Online (Sandbox Code Playgroud)

但是当NOW()进入准备好的陈述时,没有任何反应.替换NOW()为实际日期(即2010-11-23)工作正常.

我无法在网上找到解释.有任何想法吗?

编辑

为了进一步澄清和消除问题中的任何混淆,我想实际将一个变量传递给预备语句HOWEVER,该变量将被设置为mysql的五个可能的日期/时间函数之一.

例如

$ var ='NOW()';

$ var ='LAST_DAY(DATE_ADD(CURDATE(),INTERVAL 1 MONTH))';

$ var ='LAST_DAY(CURDATE())';

... 等等...

准备好的声明变成:

$stmt->execute(array(1, $var));
Run Code Online (Sandbox Code Playgroud)

我知道这将返回相同的NULL结果,但我担心如果我只是将sql语句更改为:

UPDATE表SET状态=?,date_modified = $ var

我打开自己注射?

Jim*_* W. 13

您不需要NOW()作为参数传递,因为它不需要对它进行任何处理,因为它是内置的SQL函数,所以只需将它包含在实际查询中,如下所示.

$stmt = $db->prepare("UPDATE table SET status = ?, date_modified = NOW()");
Run Code Online (Sandbox Code Playgroud)

或者,您可以将其设置date_modified为TIMESTAMP字段,它将自动更新date_modifiedSQL Update上的字段.


Dav*_*iss 7

准备语句将您插入其中的所有内容解释为文字字符串.这是为了防止任何类型的不可预测的SQL注入.

实际发生的NOW()是尝试插入数据库,就像它读取(字面意思NOW()),而不是实际插入日期.然后它可能在您的数据库中显示为空白,因为您有一个日期列,它不会被解释NOW()为日期,因此不接受它.

如果可能,您应该尝试执行SQL而不使用任何替换方法,因为这种方法没有任何危险.