sql >> Database teknologi >  >> RDS >> Mysql

PDO indsæt sætning med loop gennem $_POST array

Som de andre har sagt, er der stadig mulighed for, at en ondsindet bruger kan redigere navnene på felter i DOM, men når det er sagt, kan det følgende være interessant.

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

Som svar på dit spørgsmål om fjernelse af falsk html fra inputdataene, kan du prøve noget i retning af følgende:

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

Jeg foreslår ikke, at dette er en perfekt løsning, men det svarer mere eller mindre på dit oprindelige spørgsmål. Du kan finde ud af mere om filtre her

Jeg prøvede dette ved at bruge PDO med en inkluderet DROP sætning i værdien, og det var OK - blev indsat som strengdata. Da jeg prøvede at ændre et feltnavn, forårsagede det en PDOException og gjorde intet andet...

For at få kolonnenavnene, som du foreslår, kan du prøve:-

$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. Vælg rækker mellem en specificeret række til en række med en bestemt betingelse

  2. mysql ændring af innodb_large_prefix

  3. hvordan kopieres data fra fil til PostgreSQL ved hjælp af JDBC?

  4. Hvilken joinsyntaks er bedre?