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

pdophpを使用してデータベースに名前空間を持つシリアル化されたオブジェクトを保存する方法

    ここにはいくつか問題がありますが、最大の問題は、クエリパラメータを使用していないことです。

    しないでください addslashesを使用する 。それを使用していることに気付いた場合は、「おっと、クエリを修正する必要があるので、代わりにパラメータを使用する」と考える必要があります。

    この場合、次のように書く必要があります:

    $sth = $pdo->prepare('SELECT replace_value(?, ?, ?)');
    $sth->execute(array('protect\classes\Router', $tmp, 'serialized_classes'));
    

    シリアル化されたデータを渡す引数のデータ型については言及していません。上記は、textの場合にのみ機能します またはvarchar または同様のもの。

    byteaの場合 シリアル化されたオブジェクトデータの場合と同様に、パラメータがバイナリフィールドであることをPHPに通知する必要があります。

    $sth = $pdo->prepare('SELECT replace_value(:router, :serialbytes, :mode)');
    $sth->bindParam(':router', 'protect\classes\Router');
    $sth->bindParam(':mode', 'serialized_classes');
    $sth->bindParam(':serialbytes', $tmp, PDO::PARAM_LOB);
    $sth->execute();
    

    PDO::PARAM_LOBの使用に注意してください $tmpのPDOを解決する byteaとしてPostgreSQLに渡されるバイナリデータが含まれています 。

    'protect\classes\Router'のような定数を入れても問題ありません クエリに直接、ところで、変数になった場合にパラメータに分割する限り。このようなクエリで読みやすくなるため、ほとんどを分離しました。)



    1. ストアドプロシージャパラメータSQLにINステートメントを使用する

    2. SQLステートメントでグループ化されていない列を取得する方法(MySQLと同様)

    3. MySQLは、別のテーブルの列の合計に基づいてフィールドを更新するようにトリガーします

    4. PDO:MySQL関数をbindValue/bindParamに渡します