Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Câu lệnh chèn PDO với vòng lặp qua mảng $ _POST

Như những người khác đã nêu, vẫn có khả năng người dùng độc hại có thể chỉnh sửa tên của các trường trong DOM, nhưng điều đó cho thấy điều sau đây có thể được quan tâm.

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

Để trả lời cho câu hỏi của bạn về việc xóa html giả mạo khỏi dữ liệu đầu vào, bạn có thể thử một số cách dọc theo các dòng sau:

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

Tôi không gợi ý đây là một giải pháp hoàn hảo nhưng nó ít nhiều trả lời câu hỏi ban đầu của bạn. Bạn có thể tìm hiểu thêm về các bộ lọc tại đây

Tôi đã thử điều này bằng cách sử dụng PDO với DROP đi kèm câu lệnh trong giá trị và điều đó là OK - đã được chèn dưới dạng dữ liệu chuỗi. Khi tôi cố gắng sửa đổi tên trường, nó gây ra PDOException và không làm gì khác ....

Để lấy tên cột như bạn đề xuất, bạn có thể thử:-

$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. Làm thế nào để cải thiện mã php mysql này?

  2. mysql STR_TO_DATE không hoạt động

  3. Làm cách nào để tắt xác thực mật khẩu mysql?

  4. trả về một giá trị từ cơ sở dữ liệu với mysql php pdo

  5. Khi nào các kết nối được trả về nhóm kết nối với Trình quản lý thực thể Spring JPA (Hibernate)?