Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Pernyataan penyisipan PDO dengan loop melalui array $_POST

Seperti yang telah dinyatakan oleh orang lain, tetap ada kemungkinan bahwa pengguna jahat dapat mengedit nama bidang di DOM, tetapi hal berikut ini mungkin menarik.

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

Sebagai jawaban atas pertanyaan Anda tentang menghapus html palsu dari data input, Anda dapat mencoba sesuatu seperti berikut:

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

Saya tidak menyarankan ini adalah solusi sempurna tetapi kurang lebih menjawab pertanyaan awal Anda. Anda dapat mengetahui lebih lanjut tentang filter di sini

Saya mencoba ini menggunakan PDO dengan DROP yang disertakan pernyataan dalam nilai dan itu OK - dimasukkan sebagai data string. Ketika saya mencoba mengubah nama bidang, itu menyebabkan PDOException dan tidak melakukan apa-apa lagi....

Untuk mendapatkan nama kolom seperti yang Anda sarankan, Anda dapat mencoba:-

$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. Cara Mengoptimalkan Kinerja MySQL Menggunakan MySQLTuner

  2. Golang ORDER BY masalah dengan MySql

  3. PHP, MYSQL Kueri Bersarang

  4. Bagaimana cara mengubah SQL kompleks ini menjadi kueri model Django?

  5. Permintaan lambat di information_schema.tables