Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Instrukcja wstawiania PDO z pętlą przez tablicę $_POST

Jak stwierdzili inni, istnieje możliwość, że złośliwy użytkownik może edytować nazwy pól w DOM, ale to może być interesujące.

$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 );

W odpowiedzi na Twoje pytanie dotyczące usuwania fałszywego kodu HTML z danych wejściowych, możesz spróbować czegoś w następujący sposób:

$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 );

Nie sugeruję, że jest to idealne rozwiązanie, ale mniej więcej odpowiada na Twoje pierwotne pytanie. Więcej informacji o filtrach znajdziesz tutaj

Próbowałem tego za pomocą PDO z dołączonym DROP oświadczenie w wartości i że było OK - zostało wstawione jako dane ciągu. Kiedy próbowałem zmodyfikować nazwę pola, spowodowało to PDOException i nie zrobił nic więcej....

Aby uzyskać nazwy kolumn, jak sugerujesz, możesz spróbować:-

$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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zabezpieczanie php api do użycia w aplikacji na Androida

  2. Zapisy stronicowania dotyczące kwestii po stronie Klienta

  3. niestandardowe forum php - pokazywanie nowych/nieprzeczytanych postów

  4. Chef mysql opscode-cookbooks nie działa:nie można znaleźć przepisu ruby ​​na książkę kucharską mysql

  5. Codeigniter nie może usuwać wierszy z tabeli bazy danych za pomocą metody join