0

这里有一个类似的问题,但实际上这并没有给我答案:
PHP + PDO: Bind null if param is empty

我需要我的语句循环工作,只更改绑定变量。
喜欢:

$this->array = array(
    "cell1" => "",
    "cell2" => "",
);

$this->sth = $db->prepare("INSERT INTO `table`
    (`coloumn1`, `coloumn2`)
    VALUES (:coloumn1, :coloumn2)");
$this->sth->bindParam(:coloumn1, $this->array['cell1'], PDO::PARAM_STR);
$this->sth->bindParam(:coloumn2, $this->array['cell2'], PDO::PARAM_STR);

//Data proccessing...

foreach($data as $value){
    $this->array['cell1'] = $value['cell1'];
    $this->array['cell2'] = $value['cell2'];
    try {
        this->sth->execute();
        print_r($this->sth->errorInfo());
    }
    catch(PDOException $e){
        echo 'sh*t!';
    }
}

一切正常,直到其中一个值为空字符串。我的问题是当 'cell1' 是一个空字符串时,绑定参数是一个空引用,它不起作用。但是由于循环,我需要引用的绑定,所以 bindValue 不是解决方案。

而且我非常需要循环,因为我要处理大量数据。

有什么建议吗?

我在执行之前尝试过:

foreach($this->array as $value){
   if(!$value) {
        $value = "";
    }
}

它不起作用。解决我的问题的唯一方法是修改为:

    $this->array['cell1'] = !empty($value['cell1']) ? $value['cell1'] : "";
    $this->array['cell2'] = !empty($value['cell2']) ? $value['cell2'] : "";

但这似乎太垃圾了......

4

2 回答 2

0

我知道它的 necroposting,但也许会对某人有所帮助。你试图检查变量false,但不是null。并且不将值重新应用回数组。

foreach($this->array as $value){
   if(!$value) {
        $value = "";
    }
}

尝试检查null循环

foreach($this->array as $index => $value)
{
   $this->array[$index] = !empty($value) ? $value : '';
}
于 2018-04-26T08:21:55.143 回答
-1

您的问题与 PDO 无关,而与基本 PHP 无关。当没有可用的变量时 - 你根本不能使用它。因此,您必须以某种方式创建它。您目前使用的方式不是“垃圾”,而是完全可以接受的。我宁愿称整个代码为“垃圾”,因为它是应有的两倍大。

但是由于循环,我需要引用的绑定,所以 bindValue 不是解决方案。

这个假设也是错误的。为什么你认为你不能使用按值绑定?

$sql = "INSERT INTO `table` (`coloumn1`, `coloumn2`) VALUES (?, ?)";
$sth = $db->prepare($sql);
foreach($data as $value)
{
    $value['cell1'] = !empty($value['cell1']) ? $value['cell1'] : "";
    $value['cell2'] = !empty($value['cell2']) ? $value['cell2'] : "";
    $sth->execute($value);
}

就这么简单

而且我非常需要循环,因为我要处理大量数据。

我不认为它真的很大,因为它适合 PHP 进程内存。但是,请考虑对LOAD DATA INFILE真正的巨额金额使用查询。

于 2013-07-04T08:11:28.320 回答