使用mysqli防止SQL注入,如何设置NULL或CURRENT_DATE?

问题描述 投票:3回答:2

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 does是有效的。在测试中,这似乎是正确的,但事实并非如此。发生的事情是,从第一个NULL参数开始,all参数设置为NULL!

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

而且,编写一个触发器来弥补mysqli不足的想法是非常糟糕的编程-我今天写了意大利面条式触发器,这是我要谈的。触发更新日志的事情是一回事-像这样的触发器将是持续不断的维护噩梦,几乎不会对代码进行正确维护。

php mysql mysqli prepared-statement bindparam
2个回答
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.htmlhttp://dev.mysql.com/doc/refman/5.1/en/create-trigger.html


0
投票

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

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

目前,我希望为MySQL写一些实际可用的东西。稍后再发布。

© www.soinside.com 2019 - 2024. All rights reserved.