2010-02-24 3 views

Répondre

4

C'est ce que nous utilisons pour faire la même chose (insérer dans une table que nous ne contrôlons pas, et qui n'a pas accès aux API)

Utilisation de la requête DESCRIBE garantit que seules les colonnes qui existent sont insérés.

$db = new DB(); 
$sql = 'DESCRIBE `table`'; 
$result = $db->query($sql); 
$row = array(); 
$query = array(); 

while ($row = $result->fetchRow()) 
{ 
    if (array_key_exists($row['field'], $form_data)) 
     if (is_null($form_data[$row['field']])) 
      $query[$row['field']] = 'NULL'; 
     else 
      $query[$row['field']] = $db->quote($form_data[$row['field']]); 
} 

$keys = array_keys($query); 

foreach ($keys as &$key) 
    $key = $db->quoteIdentifier($key); 

unset($key); 

$vals = array_values($query); 

$sql = 'INSERT INTO `table` ' 
    . '(' . implode(', ', $keys) . ') ' 
    . 'VALUES(' . implode(', ', $vals) . ')'; 

éditer: DB() est notre enveloppe autour de MDB2.

Et bien sûr, cela leur permet de remplir toute la rangée. Si vous avez des colonnes restreintes (identifiants d'incrémentation automatique et autres), vous devrez les filtrer à partir des données du formulaire ...

+1

Et bien sûr l'obligatoire "il est préférable de ne pas générer automatiquement sql." – jasonbar