Inserimento PHP PDO in DB da un arrays associativo

Ho una matrix come questa

$a = arrays( 'phone' => 111111111, 'image' => "sadasdasd43eadasdad" ); 

Quando faccio un var-dump ottengo questo ->

  { ["phone"]=> int(111111111) ["image"]=> string(19) "sadasdasd43eadasdad" } 

Ora sto cercando di aggiungere questo al DB usando l'istruzione IN –

  $q = $DBH->prepare("INSERT INTO user :column_string VALUES :value_string"); $q->bindParam(':column_string',implode(',',arrays_keys($a))); $q->bindParam(':value_string',implode(',',arrays_values($a))); $q->execute(); 

Il problema che sto avendo è che implode restituisce una string. Ma la colonna 'telefono' è un numero integer nel database e anche l'arrays lo sta memorizzando come un numero integer. Quindi sto ottenendo l'errore SQL come la mia query finale assomiglia a questo –

 INSERT INTO user 'phone,image' values '111111111,sadasdasd43eadasdad'; 

Qual è una domanda sbagliata. C'è un modo per aggirarlo.

I nomi delle mie colonne sono basati su elementi dinamici che l'utente desidera inserire. Quindi non posso usare i segnaposto come : telefono e : image perché non sempre ottengo un valore per quelle due colonne. Per favore fathemes sapere se c'è un modo per aggirare questo. altrimenti dovrò definire più funzioni each tipo di aggiornamento.

Grazie.

L'ultima volta che ho controllato, non era ansible preparare una dichiarazione in cui le colonne interessate erano sconosciute al momento della preparazione – ma quella cosa sembra funzionare – forse il tuo sistema di database è più indulgente di quelli che sto usando (principalmente postgres)

Ciò che è chiaramente sbagliato è l'istruzione implode (), dato che each variabile dovrebbe essere gestita da sé stesso, occorre anche una parentesi attorno all'elenco dei campi nell'istruzione insert.

Per inserire campi definiti dall'utente, penso che devi fare qualcosa di simile (alless così come lo faccio io);

 $fields=arrays_keys($a); // here you have to trust your field names! $values=arrays_values($a); $fieldlist=implode(',',$fields); $qs=str_repeat("?,",count($fields)-1); $sql="insert into user($fieldlist) values(${qs}?)"; $q=$DBH->prepare($sql); $q->execute($values); 

Se non ti puoi fidare dei nomi dei campi in $ a, devi fare qualcosa del genere

 foreach($a as $f=>$v){ if(validfield($f)){ $fields[]=$f; $values[]=$v; } } 

Dove validfields è una function che scrivi che verifica each fieldname e verifica se è valido (veloce e sporco creando un arrays associativo $ valfields = arrays ('name' => 1, 'email' => 1, 'phone' = > 1 … e poi controllando il valore di $ valfields [$ f], o (come preferirei) recuperando i nomi dei campi dal server)

I parametri di query SQL possono essere utilizzati solo where altrimenti si inserisce un valore letterale .

Quindi, se ti rendi conto di inserire una string letterale, un letterale o un letterale numbersco tra virgolette in quella posizione nella query, puoi utilizzare un parametro.

Non è ansible utilizzare un parametro per un nome di colonna, un nome di tabella, un elenco di valori, una parola chiave SQL o qualsiasi altra espressione o syntax.

In questi casi, è comunque necessario interpolare il contenuto nella string SQL, quindi si rischia un po 'di SQL injection. Il modo per proteggerli è con la whitelist dei nomi delle colonne e il rifiuto di qualsiasi input che non corrisponde alla whitelist.

Perché tutte le altre risposte consentono l' iniezione SQL . Per l'input dell'utente è necessario filtrare i nomi dei campi consentiti:

 // change this $fields = arrays('email', 'name', 'whatever'); $fieldlist = implode(',', $fields); $values = arrays_values(arrays_intersect_key($_POST, arrays_flip($fields))); $qs = str_repeat("?,",count($fields)-1) . '?'; $q = $db->prepare("INSERT INTO events ($fieldlist) values($qs)"); $q->execute($values); 

In realtà è ansible avere in anticipo i campi :phone e :image con valori null. La struttura del tavolo è comunque fissa e probabilmente dovresti farlo in quel modo.


Ma la risposta alla tua domanda potrebbe essere simile a questa:

 $keys = ':' . implode(', :', arrays_keys($arrays)); $values = str_repeat('?, ', count($arrays)-1) . '?'; $i = 1; $q = $DBH->prepare("INSERT INTO user ($keys) VALUES ($values)"); foreach($arrays as $value) $q->bindParam($i++, $value, PDO::PARAM_STR, mb_strlen($value)); 

Ho apprezzato la risposta di MortenSickel, ma volevo usare i parametri nominati per essere sicuri:

  $keys = arrays_keys($a); $sql = "INSERT INTO user (".implode(", ",$keys).") \n"; $sql .= "VALUES ( :".implode(", :",$keys).")"; $q = $this->dbConnection->prepare($sql); return $q->execute($a); 

So che a questa domanda è stata data risposta molto tempo fa, ma l'ho trovata oggi e ho un piccolo contributo in aggiunta alla risposta di @MortenSickel.

La class seguente ti consentirà di inserire o aggiornare un arrays associativo nella tabella del tuo database. Per ulteriori informazioni su MySQL DOP, visitare: http://php.net/manual/en/book.pdo.php

 <?php class dbConnection { protected $dbConnection; function __construct($dbSettings) { $this->openDatabase($dbSettings); } function openDatabase($dbSettings) { $dsn = 'mysql:host='.$dbSettings['host'].';dbname='.$dbSettings['name']; $this->dbConnection = new PDO($dsn, $dbSettings['username'], $dbSettings['password']); $this->dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } function insertArray($table, $arrays) { $fields=arrays_keys($arrays); $values=arrays_values($arrays); $fieldlist=implode(',', $fields); $qs=str_repeat("?,",count($fields)-1); $sql="INSERT INTO `".$table."` (".$fieldlist.") VALUES (${qs}?)"; $q = $this->dbConnection->prepare($sql); return $q->execute($values); } function updateArray($table, $id, $arrays) { $fields=arrays_keys($arrays); $values=arrays_values($arrays); $fieldlist=implode(',', $fields); $qs=str_repeat("?,",count($fields)-1); $firstfield = true; $sql = "UPDATE `".$table."` SET"; for ($i = 0; $i < count($fields); $i++) { if(!$firstfield) { $sql .= ", "; } $sql .= " ".$fields[$i]."=?"; $firstfield = false; } $sql .= " WHERE `id` =?"; $sth = $this->dbConnection->prepare($sql); $values[] = $id; return $sth->execute($values); } } ?> 

Utilizzo della class dbConnection:

 <?php $dbSettings['host'] = 'localhost'; $dbSettings['name'] = 'databasename'; $dbSettings['username'] = 'username'; $dbSettings['password'] = 'password'; $dbh = new dbConnection( $dbSettings ); $a = arrays( 'phone' => 111111111, 'image' => "sadasdasd43eadasdad" ); $dbh->insertArray('user', $a); // This will asume your table has a 'id' column, id: 1 will be updated in the example below: $dbh->updateArray('user', 1, $a); ?>