db2_bind_param 传递字符串参数的问题
Issue with db2_bind_param passing in string parameters
我目前在 运行 需要传递字符串参数的查询中遇到问题。通常我会通过将所述字符串直接放入查询本身来规避这种情况,但我想通过清理输入开始应用适当的安全协议和最佳实践。
这里是查询:
$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传递字符串参数?或者我必须单独清理然后将参数直接添加到查询中吗?
经过一番调查,我终于找到了根本原因。在我最初的参数循环中,我使用了一个 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);
}
}
这让我可以在函数的生命周期内用它们各自的字符串名称创建临时变量引用。这最终解决了另一个问题,所有参数都是我在试验这个问题后发现的最终绑定值的副本。
希望这对以后遇到类似问题的其他人有所帮助。
我目前在 运行 需要传递字符串参数的查询中遇到问题。通常我会通过将所述字符串直接放入查询本身来规避这种情况,但我想通过清理输入开始应用适当的安全协议和最佳实践。
这里是查询:
$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传递字符串参数?或者我必须单独清理然后将参数直接添加到查询中吗?
经过一番调查,我终于找到了根本原因。在我最初的参数循环中,我使用了一个 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);
}
}
这让我可以在函数的生命周期内用它们各自的字符串名称创建临时变量引用。这最终解决了另一个问题,所有参数都是我在试验这个问题后发现的最终绑定值的副本。
希望这对以后遇到类似问题的其他人有所帮助。