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

$_POST配列をループするPDO挿入ステートメント

    他の人が述べているように、悪意のあるユーザーがDOMのフィールドの名前を編集する可能性は残っていますが、次のことが興味深いかもしれません。

    $sql='insert into `claims_motor` (`'.implode( '`,`', array_keys( $_POST ) ) .'`) values (:'.implode(',:',array_keys( $_POST ) ).');';
    foreach( $_POST as $field => $value ) $params[":{$field}"]=$value;
    
    $statement = $pdo->prepare( $sql );
    $statement->execute( $params );
    

    入力データから偽のHTMLを削除することについての質問に答えて、次のように試してみることができます。

    $options=array( 'flags'=>FILTER_FLAG_NO_ENCODE_QUOTES | FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_ENCODE_LOW | FILTER_FLAG_ENCODE_HIGH | FILTER_FLAG_ENCODE_AMP );
    
    function filterfield( $field ){
        global $options;
        return ":".strip_tags( filter_var( $field, FILTER_SANITIZE_STRING, $options ) );
    }
    function filtervalue( $field ){
        global $options;
        return strip_tags( filter_input( INPUT_POST, $field,  FILTER_SANITIZE_STRING, $options ) );
    }
    function isfield( &$field, $key, $fields ){
        $field=in_array( $field, $fields ) ? $field : false;
    }
    
    $sql='insert into `claims_motor` (`'.implode( '`,`', array_keys( $_POST ) ) .'`) values (:'.implode(',:',array_keys( $_POST ) ).');';
    foreach( $_POST as $field => $value ) $params[ filterfield( $field ) ]=filtervalue( $field );
    

    これが完璧な解決策であることを示唆しているわけではありませんが、多かれ少なかれあなたの元の質問に答えます。 フィルターの詳細については、こちらをご覧ください

    DROPが含まれているPDOを使用してこれを試しました 値のステートメントとそれはOKでした-文字列データとして挿入されました。フィールド名を変更しようとすると、PDOExceptionが発生します そして他に何もしなかった....

    提案どおりに列名を取得するには、次のことを試してください。-

    $sql="select group_concat(`column_name`) as 'cols' 
            from `information_schema`.`columns` 
            where `table_schema`=database() and `table_name`=:table;";
    
    $params=array(':table' => 'claims_motor');
    $statement = $pdo->prepare( $sql );
    $statement->execute( $params );
    
    /* Process the recordset */
    $cols=$rs->cols; /* or whatever method to access the record */
    
    
    /* Filter fields that were not in form - if any */
    $cols=explode( ',', $cols );
    array_walk( $cols, 'isfield', array_keys( $_POST ) );
    $fields = array_filter( $cols );
    
    /* Prepare sql for the insert statment */
    $sql_insert='insert into `claims_motor` (`'.implode( '`,`', $fields ) .'`) values (:'.implode( ',:', $fields ).');';
    
    /* reset params array */
    $params=array();
    
    /* Construct new array of bound variables / params */
    foreach( $_POST as $field => $value ) $params[ filterfield( $field ) ]=filtervalue( $field );
    
    /* add the data to db */
    $statement = $pdo->prepare( $sql );
    $statement->execute( $params );
    



    1. 12.2 RAC/GIの新機能

    2. phpを使用してmp3オーディオ保存されたimmysqlblobを再生する方法

    3. Node.jsは、非同期ステートメントを同期的にループまたは反復します

    4. PHP関数は1回だけ機能します