db2_bind_param传递字符串参数的问题

最后发布: 2015-02-17 16:23:48


问题

我目前遇到运行需要传递字符串参数的查询的问题。 通常我会通过将所述字符串直接放入查询本身来避免这种情况,但我想通过清理输入来开始应用适当的安全协议和最佳实践。

这是查询:

$newAddr->query = "insert into sampleSchema.SampleCustomerAddresses (customer_number, address_id, addr_line1, addr_line2, city, state, zipcode)
values (?,?,?,?,?,?,?)";

我的参数传递方式如下:

$newAddr->parameters = [$CUSTOMER, $addrId, $addrL1, $addrL2, $city, $state, $zip];
$newAddr->performDBCall();

处理参数绑定的代码是这样的:

if (count($this->parameters) != 0){
        foreach ($this->parameters as $param) {
            db2_bind_param($dbStatement, $i, 'param', DB2_PARAM_IN);
            $i++;
        }
    }

尝试从应用程序运行此查询会在cast参数中生成一个字符无效错误。

问题是,如何通过db2_bind_param传递字符串参数? 或者我必须单独进行清理,然后将参数直接添加到查询中?

php string db2 sanitization
回答

经过一番调查,我找到了根本原因。 在我的原始参数循环中,我使用了foreach循环并将$ this->参数分配给$ param。 我不知道的是参数的绑定实际上是在执行之前发生的。 所以我有这样的事情:

db2_bind_param($dbStatement, 1, "param", DB2_PARAM_IN);
db2_bind_param($dbStatement, 2, "param", DB2_PARAM_IN);
db2_bind_param($dbStatement, 3, "param", DB2_PARAM_IN);
db2_bind_param($dbStatement, 4, "param", DB2_PARAM_IN);

我原本以为它会被绑定,然后参考将很明显用于下一个绑定。

因此,我用以下内容替换了该部分:

$numOfParams = count($this->parameters);
    if ($numOfParams != 0){
        for ($i = 0; $i < $numOfParams; $i++){
            $param = 'param'.$i;
            ${$param} = $this->parameters[$i];
            $k = $i + 1;
            db2_bind_param($dbStatement, $k, "param{$i}", DB2_PARAM_IN);
        }
    }

这允许我在函数的生命周期中创建临时变量引用及其各自的字符串名称。 这最终解决了另一个问题,所有参数都是最终绑定值的重复,我在试验这个问题后发现了一段时间。

希望这可能对将来遇到类似问题的其他人有所帮助。