Accueil
Trucs & Astuces
Scripts
Regex
Annuaire
Articles
.
|
Articles MySQL et Delphi Par Paul Peyriller
Mars 2001
» Objectif » Mettre à jour une base MySQL à partir de Delphi » Récupération d'une table MySQL au format DBase » Conclusion
L'objectif de cet article est de vous montrer comment mettre à jour des tables MySQL sur un site web géré avec PHP à l'aide de différents programmes Delphi manipulant des tables locales DBase.
Deux fonctions de transfert seront décrites : la première pour mettre à jour la base MySQL distante (site web) à partir de fichiers DBase, la seconde pour récupérer en local dans des fichiers DBase le contenu des tables MySQL.
L'opération se déroule en 3 étapes :- On utilise un programme Delphi qui met à jour une table temporaire au format DBase (cette partie là ne sera pas décrite),
- On copie cette table temporaire sur le serveur par FTP (on utilise pour cela le composant NMFTP, décrit ci-dessous),
- On met à jour la base MySQL à partie de cette table avec un programme PHP situé sur le serveur.
Transfert FTP
Voici le code Delphi utilisé pour le transfert d'un fichier DBase vers le serveur distant par FTP :
// déclaration
NMFTP1: TNMFTP;
// connexion
procedure TWftp.connectClick(Sender: TObject);
begin
NMFTP1.Host := HostTxt.Text;
NMFTP1.Port := StrToInt(PortTxt.Text);
NMFTP1.Timeout := 5000;
NMFTP1.UserID := UserTxt.Text;
NMFTP1.Password := PassTxt.Text;
try
NMFTP1.Connect;
except
On E:Exception do
writeln(E.message);
end
end;
// upload
NMFTP1.Upload('ville.dbf', 'ville.dbf'); |
|
Mise à jour de la base MySQL
On déclenche le programme PHP de mise à jour avec une 'commande HTTP' du style http://www.lesite.com/mise_a_jour.php3. On utilise pour cela le composant NMHTTP :
NMHTTP1.Get( WideString('http://www.lesite.com/maj.php3') ); |
|
Dans le programme PHP on définit une fonction dbf_copie(). Syntaxe : dbf_copie("espaces.dbf" ,"espaces");
Cette fontion contruit une chaîne requête UPDATE et une chaîne requete INSERT avec les données de la table DBase et la structure de la table MySQL. La table MySQL a pour clef unique le 1er champ (pour empêcher les doublons). Quand la chaîne est contruite on utilise la requête UPDATE. S'il y a une erreur du type "l'enregistrement n'existe pas" on utilise la requête INSERT.
<?php
// copie d'un fichier dbf_copie("espaces.dbf" ,"espaces");
// Fonction de copie function dbf_copie($fichier_dbase, $table_mysql) { global $DBHost, $DBUser, $DBPass, $base,$login, $pwd; // Connexion à DBASE $db = dbase_open($fichier_dbase, 2); $num_records = dbase_numrecords($db); $numfields = dbase_numfields($db);
// Connexion à MYSQL connect(); $connexion = mysql_connect($DBHost, $login, $pwd); $dby = mysql_select_db($base, $connexion); // Récupération des champs de la table mysql $tableaumaj = stru_sql($table_mysql); // Parcours de la table dbase for ($index = 1; $index <= $num_records; $index++) { $record = dbase_get_record($db, $index); // Création chaîne requete $chaine = ""; // chaîne d'insertion $chainemaj = ""; // chaîne de mise à jour $requeteins = ""; $requetemaj = ""; for ($index2 = 0; $index2 < $numfields; $index2++) { $chaine .= "'$record[$index2]'" ; $chainemaj .= $tableaumaj[$index2] . "='$record[$index2]'";
if ($index2 < $numfields-1) $chaine .= ","; if ($index2 < $numfields-1) $chainemaj .= ","; }
// Affectation des chaînes avec les requêtes // Note: on concatène avec le <POINT>. = "chaine1".$var2.chaine3" $requeteins = "insert into $table_mysql values (" . $chaine . ")"; $requetemaj = "update $table_mysql set " . $chainemaj; $requetemaj .= " where clef = '$record[0]'"; $resultat_sql = mysql_query($requetemaj, $connexion); print("changée=" . mysql_affected_rows($connexion) . "<br>");
// si erreur d'update, on insère if (mysql_affected_rows($connexion) == 0) { $resultat_sql_ins = mysql_query($requeteins, $connexion); print("<br>erreur=" . mysql_errno(). "<br>"); } } //for
dbase_close($db); mysql_close($connexion); }
// Paramètres de connexion au site function connect() { global $DBHost, $DBUser, $DBPass, $base, $login, $pwd;
$DBHost = "sql.nomdusite.com"; $base = "nom_base"; $login = "mon_login"; $pwd = "mon_pwd"; }
// Fonction de récupération des champs de la table mysql // (utilisée dans la fonction de copie) function stru_sql($table_mysql) { global $DBHost, $DBUser, $DBPass, $base, $login, $pwd; // connexion MySQL connect(); $connexion = mysql_connect($DBHost,$login, $pwd); $dby = mysql_select_db($base, $connexion); $result = mysql_query("SELECT * FROM $table_mysql"); $fields = mysql_num_fields($result); $rows = mysql_num_rows($result); $i = 0; $table = mysql_field_table($result, $i); while ($i < $fields) { $name = mysql_field_name($result, $i); $champs[] = "$name"; $i++; } return $champs; }
?>
|
|
On peut personnaliser la fonction dbf_copie() en ne mettant à jour que si la date de modification du fichier temporaire est supérieure à la date dans la table MySQL.
Cette opération se déroule elle aussi en 3 étapes : - On lance la copie PHP avec un programme du style : mysql_copie("ville3.dbf", "ville"); déclenché par une requête HTTP,
- On récupère la table temporaire au format DBase en local par FTP,
- On met à jour la table locale DBF avec cette table temporaire.
Fonction mysql_copie() :
<?php
function mysql_copie($fichier_dbase, $table_mysql) { global $DBHost, $DBUser, $DBPass, $base, $login, $pwd; // connexion DBASE $db = dbase_open($fichier_dbase, 2); $num_records1 = dbase_numrecords($db); $numfields1 = dbase_numfields($db);
// connexion MySQL connect(); $connexion = mysql_connect($DBHost, $login, $pwd); $dby = mysql_select_db($base, $connexion); $result = mysql_query("select * from $table_mysql"); $numfields = mysql_numfields($result);
// parcours de la table mysql while ($record = mysql_fetch_row($result) ) { $record_dbase[0] = 0; for ($index2 = 0; $index2 < $numfields; $index2++) { // affectation du champ dbase avec la valeur mysql $record_dbase[$index2] = $record[$index2 ]; } // création de l'enregistrement avec le tableau des valeurs dbase_add_record($db, $record_dbase); } dbase_close($db); mysql_close($connexion); }
?>
|
|
L'intérêt de ces deux fonctions de transfert est que l'on peut facilement mettre en place une solution de commerce éléctronique avec une gestion commerciale classique en Delphi sur un poste local avec les facilités de développement qu'offre Delphi (interface et gestion des données), et proposer par ailleurs un site web contenant un programme en PHP accédant à une base MySQL.
|
|