我对DB2 for IBMi相对较新,我想知道如何在PHP中为动态生成的查询正确清理数据的方法。
例如,如果编写处理所有数据库交互的PHP类,则必须传递表名等,其中一些不能使用db2_bind_param()
传递。 db2_prepare()
是否自行清理结构化查询?或者是否可以执行格式错误的查询"在db2_prepare()
电话中?我知道有db2_execute()
但数据库正在db2_prepare()
中执行某些操作而且我不确定是什么(只是语法验证?)。
我知道如果传递的值不会受到用户输入结果的影响,那么不应该是一个问题,但是如果想要在查询中使用它之前清理数据(不使用{{ 1}})db2的清单是什么?我唯一能找到的是通过在前面加上另一个单引号来逃避单引号。这真的是值得注意的吗?
答案 0 :(得分:2)
当您调用db2_prepare()
时,没有发生神奇的“清理” - 它只会尝试将您传递的字符串编译为单个SQL语句。如果它不是有效的DB2 SQL语句,则将返回错误。与db2_exec()
相同,只会在一次调用中执行db2_prepare()
和db2_execute()
分别执行的操作。
编辑(以解决OP的进一步问题)。
每个SQL语句的执行都有三个阶段:
编译(或准备),在解析语句,语法和语义分析时,确定用户的权限,并创建语句执行计划。
参数绑定 - 只有在语句包含参数标记时才需要的可选步骤。在此阶段,验证每个参数数据类型以匹配语句文本基于准备所期望的内容。
执行正确,当步骤1中生成的查询计划由数据库引擎执行时,可选地使用步骤2中提供的参数(变量)值。语句结果(如果有)随后返回给客户端
db2_prepare()
,db2_bind_param()
和db2_execute()
分别对应于步骤1,2和3。 db2_exec()
结合步骤1和3,跳过步骤2并假设缺少参数标记。
现在,谈到参数安全性,绑定步骤确保提供的参数值对应于预期的数据类型约束。例如,在包含...WHERE MyIntCol = ?
之类的查询中,如果我尝试将字符值绑定到该参数,则会生成错误。
相反,如果我使用db2_exec()
并撰写如下声明:
$stmt = "SELECT * FROM MyTab WHERE MyIntCol=" . $parm
我可以很容易地将"0 or 1=1"
之类的内容作为$parm
的值传递,这将生成一个完全有效的SQL语句,然后才能由db2_exec()
成功解析,准备和执行。