Je crée un utilitaire PHP qui importe et analyse un fichier CSV en $data
, et si oui ou non INSERT "nouvelles" lignes dans la base de données ($saveNew
).INSERT nouvelles lignes, UPDATE anciennes lignes: comment?
En ce moment, j'ai un peu d'un désordre laid: (en pseudo-PHP généralisée)
function synchronize($data,$saveNew) {
$existing_ids = $table->find_all('ID'); //array of ID's in the table
$incoming_ids = get_key('ID',$data); //grabs the ID field from each record
$new_ids = array_diff($incoming_ids,$existing_ids);
foreach ($data as $record) {
if (in_array($record['ID'],$new_ids)) { //it's new
if ($saveNew) $table->insert($record);
else continue;
} else {
$table->update($record);
}
}
}
cela a juste moi, une odeur, et je pense que je pourrais y arriver en un seul requête, sauf que je ne suis pas familier avec SQL. J'utilise un simple ORM dans mon application, mais je peux facilement utiliser SQL directement.
Oh, et j'utilise MySQL.
Cela peut-il être fait avec une seule requête? Il semble que ce serait un problème commun avec une solution simple, mais je ne peux tout simplement pas comprendre.
Cela ressemble beaucoup mieux, mais cela ne s'appliquerait-il pas si '$ saveNew' est vrai? Si nous voulons synchroniser ($ data, false), alors nous ne voulons pas du tout INSERT. Existe-t-il une chose telle que "UPDATE IF EXISTS"? –
Il n'y a pas besoin de 'UPDATE IF EXISTS' ... quand vous appelez' UPDATE ... WHERE id = 5', si l'id '5' n'existe pas, cela ne mettra rien à jour ... Aucune erreur , juste pas de mises à jour ... – ircmaxell
@ircmaxwell: Oh wow, parle d'un "duh!" moment pour moi. Je ne pense apparemment pas très bien ...: D –