sql >> Database >  >> RDS >> Mysql

PDO insert-instructie met lus door $_POST-array

Zoals de anderen al hebben gezegd, blijft de mogelijkheid bestaan ​​dat een kwaadwillende gebruiker de namen van velden in het DOM zou bewerken, maar dat gezegd hebbende, kan het volgende interessant zijn.

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

Als antwoord op uw vraag over het verwijderen van valse html uit de invoergegevens, kunt u iets in de trant van het volgende proberen:

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

Ik suggereer niet dat dit een perfecte oplossing is, maar het beantwoordt min of meer uw oorspronkelijke vraag. Meer informatie over filters vind je hier

Ik heb dit geprobeerd met PDO met een meegeleverde DROP statement in de waarde en dat was OK - werd ingevoegd als stringgegevens. Toen ik probeerde een veldnaam te wijzigen, veroorzaakte dit een PDOException en deed niets anders....

Om de kolomnamen te krijgen zoals u voorstelt, kunt u het volgende proberen:-

$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. Verbindingspooling in .NET/SQL-server?

  2. Wanneer moet ik de DatabaseHelper sluiten?

  3. Hoe bool naar int te converteren in MySql

  4. Geo-afstand MySQL