php - 使用mysqli防止sql注入(inject),如何设置NULL或CURRENT_DATE?

标签 php mysql mysqli prepared-statement bindparam

mysqli php 库中,在 bind_param() 方法中,将参数绑定(bind)到查询。 bind_param() 的第一个参数是 types,这是一个字符串,其中每个字符代表传递的数据类型,例如,'s' 代表字符串。

$query = "update users set update_usr_id = ? where user_id = ?";
$arg1 = ($update_usr_id=$usr_id) ? '2011-01-01' : 'CURRENT_DATE';
$arg2 = $update_usr_id;

如何将 NULL 或 CURRENT_DATE 表示为参数?

例如,尝试将“CURRENT_DATE”作为字符串,但发布为“0000-00-00”。 (据我所知,非法日期“0000-00-00”对于不使用 NULL 的人来说是 NULL 的 mysqlism,这显然是相当多的)。

使用参数,如何使用 NULL 和 CURRENT_DATE?


@Johan 指出 NULL 确实有效。经测试,这似乎是正确的,但事实并非如此。发生的情况是,从第一个 NULL 参数开始,所有 参数都设置为 NULL!

默认值与此无关。很多时候我希望在 UPDATE 中将列设置为 NULL 或 CURRENT_DATE - 而不是 INSERT - 因此默认值在事务中不起作用。

此外,编写触发器来弥补 mysqli 的不足的想法是非常糟糕的编程 - 在我的日子里写过意大利面条触发器,我是一个可以谈论的人。更新日志的触发器是一回事 - 像这样的触发器将是一个持续的维护噩梦,代码将永远被正确维护的可能性很小。

最佳答案

如果你想要一个默认参数,你可以在数据库模式中指定一个默认值。
对于 current_date,您需要将数据类型设置为 timestamp 而不是 date,这样 MySQL 会在缺少数据时自动将 now() 插入到字段中。

或者创建触发器

DELIMITER $$

CREATE TRIGGER BEFORE INSERT ON FOR EACH ROW
BEGIN
  IF new.mydate IS NULL THEN SET new.mydate = NOW();
END $$

DELIMITER ;

如果你想传递 null 只需将 var 设置为 null:

$var = null;

链接
http://dev.mysql.com/doc/refman/5.1/en/alter-table.html
http://dev.mysql.com/doc/refman/5.1/en/create-trigger.html

关于php - 使用mysqli防止sql注入(inject),如何设置NULL或CURRENT_DATE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7330744/

相关文章:

php - 当 Match Against 函数在 Mysql 中没有给出任何结果时,LIKE 函数会给我更好的结果吗

php - MySQL 存储过程返回 0 行

javascript - prependTo() inside load() completion callback not trigger when using setTimeout

mysql - 根据给定的日期周期检查动态到期日期

php - 查找具有多个标签的帖子

mysql - 带条件的 select 语句内的 select 查询

PHP 接口(interface) mysql() 不工作,但 mysqli() 工作;为什么?

php - 如何使用 var_dump 获取所有元素?

php - 引用 - 这个错误在 PHP 中意味着什么?

php - Laravel 4 - Blade 模板 - 如何正确链接到路由?