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上的字段.
准备语句将您插入其中的所有内容解释为文字字符串.这是为了防止任何类型的不可预测的SQL注入.
实际发生的NOW()是尝试插入数据库,就像它读取(字面意思NOW()),而不是实际插入日期.然后它可能在您的数据库中显示为空白,因为您有一个日期列,它不会被解释NOW()为日期,因此不接受它.
如果可能,您应该尝试执行SQL而不使用任何替换方法,因为这种方法没有任何危险.