sql >> データベース >  >> RDS >> Mysql

null値を含む配列でPDOを実行する

    実行する配列を渡す代わりに、bindValueの使用を検討してください。 ここ にあるように :

    更新する値が配列として既にあるため、これをアプリケーションの他の部分に対してかなり透過的にすることができるはずです。たとえば、試してみてください。このようなもの:

    <?php
    function executeWithDataTypes(PDOStatement $sth, array $values) {
        $count = 1;
        foreach($values as $value) {
            $sth->bindValue($count, $values['value'], $values['type']);
            $count++;
        }
    
        return $sth->execute();
    }
    
    $sth = $handle->prepare("UPDATE table SET name = ?, id_extra1 = ?, id_extra2 = ? WHERE id_something = ?");
    
    $values = array();
    $values[] = array('value' => 'testing', 'type' => PDO::PARAM_STR);
    $values[] = array('value' => 2, 'type' => PDO::PARAM_INT);
    $values[] = array('value' => null, 'type' => PDO::PARAM_NULL);
    $values[] = array('value' => 1958, 'type' => PDO::PARAM_INT);
    
    $result = executeWithDataTypes($sth, $values);
    ?>
    

    bindParamを使用すると過去に頭痛の種があったことを指摘しましたが、 bindValue および bindParam 。個人的には、スクリプトを理解しにくくする副作用があるため、bindParamを使用することはありませんが、もちろんこれらの効果が役立つ場合もあります。

    編集:もちろん、関数をさらに単純化し、次のような操作を行うことで、渡された配列の追加キーとして型を指定する必要をなくすことができます。

    $type = PDO::PARAM_STR;
    switch(true) {
        case is_null($value): $type = PDO::PARAM_NULL; break;
        case is_numeric($value): $type = PDO::PARAM_INT; break;
        // ...
        default: break;
    }
    

    配列に渡された値のタイプに基づいてタイプを決定します。ただし、これはエラーが発生しやすくなります。フロートも数値であり、上記のswitchステートメントで誤った決定につながる可能性がありますが、完全を期すために言及したいと思いました。



    1. JDBCでスクロール可能で更新可能なResultSetオブジェクトを作成する方法

    2. SQL Serverの2つの日付の間のすべての週の開始日と終了日を取得するにはどうすればよいですか?

    3. 多対多の関連付けの結合テーブルにオプションはありますか?

    4. R12.2オンラインパッチでのシードデータの処理