【问题标题】:using mysqli to prevent sql injection, how to set NULL or CURRENT_DATE?使用mysqli防止sql注入,如何设置NULL或CURRENT_DATE?
【发布时间】:2011-09-07 08:15:02
【问题描述】:

mysqli php 库中,在bind_param() 方法中,将参数绑定到查询。 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 的不足之处的想法是非常糟糕的编程——在我写过意大利面条触发器的日子里,我是一个可以说话的人。更新日志的触发器是一回事 - 像这样的触发器将是一个持续的维护噩梦,代码被正确维护的可能性很小。

【问题讨论】:

  • 与其尝试在您的 PHP 代码中执行此操作,不如设计您的数据库架构以便这些值是给定列的默认值。这样,您需要做的就是不在您的 php 代码中提供数据。
  • 这不起作用有两个原因:首先,如果尝试更新现有值,其次,当值可能为空时,必须提供两个(或更多)完全不同的查询。

标签: php mysql mysqli prepared-statement bindparam


【解决方案1】:

如果您想要一个默认参数,您可以在数据库架构中指定一个默认值。
对于 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

【讨论】:

  • 这不起作用有两个原因:首先,如果尝试更新现有值,其次,当值可能为空时,必须提供两个(或更多)完全不同的查询。
  • 设置为 NULL 确实 工作正常,即使设置为 NULL 而不是整数 0 - 我的报告不正确。谢谢!
  • 实际上,设置为 NULL 并没有 起作用。如果是最后一个参数,则设置为空;但如果不是最后一个参数,它和它后面的所有参数都设置为NULL
【解决方案2】:

mysqli 参数有限且难以使用。它们不仅不接受 NULL 和像 CURRENT_DATE 这样的内部函数作为参数,而且每个参数都通过引用传递。 (这意味着需要为每个参数创建一个参数 - 这对于 INOUT 过程参数或 SELECT INTO 可能是必需的,但对于普通 dml 来说只是浪费时间。)除此之外,它们显然不是由会话存储的或 db 以提高后续调用的效率。

(例如,与 Postgres 准备好的语句比较,它被命名并且我被重用(尽管仅在会话级别)。这意味着数据库不需要重新教授语句;这也意味着语句已经“计划”了,因此不仅可以学习语义,还可以学习执行计划并重新使用以提高速度。)

目前正在为 MySQL 编写一些东西,我希望它实际上是可用的。稍后会发布。

【讨论】:

    猜你喜欢
    • 2015-05-04
    • 2014-08-18
    • 1970-01-01
    • 2012-08-04
    • 2011-11-28
    • 2016-04-06
    • 1970-01-01
    • 2016-02-19
    • 2015-09-07
    相关资源
    最近更新 更多