【问题标题】:Issue with db2_bind_param passing in string parameters传递字符串参数的 db2_bind_param 问题
【发布时间】:2015-04-18 10:04:47
【问题描述】:

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

这里是查询:

$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++;
        }
    }

尝试从应用程序运行此查询会产生一个字符转换参数无效错误。

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

【问题讨论】:

    标签: php string db2 sanitization


    【解决方案1】:

    经过一番调查,我最终找到了根本原因。在我原来的参数循环中,我使用了一个 foreach 循环并将 $this->parameters 分配给 $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);
            }
        }
    

    这使我可以在函数的生命周期内使用它们各自的字符串名称创建临时变量引用。这最终解决了另一个问题,所有参数都是我在尝试这个问题一段时间后发现的最终边界值的副本。

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

    【讨论】:

      猜你喜欢
      • 2015-07-06
      • 1970-01-01
      • 2011-07-11
      • 2018-08-05
      • 1970-01-01
      • 2013-07-26
      • 2020-06-07
      • 1970-01-01
      • 2011-05-12
      相关资源
      最近更新 更多