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」が空の文字列で、バインドされたパラメーターが null 参照であり、機能しない場合です。しかし、ループのために参照されたバインディングが必要なので、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

-1

あなたの質問は PDO とは何の関係もありませんが、基本的な PHP とは関係ありません。利用可能な変数がない場合、まったく使用できません。したがって、何らかの形で作成する必要があります。あなたが現在使用している方法は「ゴミ」ではありませんが、まったく受け入れられます。コード全体が本来の 2 倍の大きさなので、コード全体を「ゴミ」と呼びたいと思います。

しかし、ループのために参照されたバインディングが必要なので、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 に答える