phpInfo.netLes ArchivesLes éléPHPants

  
  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


Objectif

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.

Mettre à jour une base MySQL à partir de Delphi

L'opération se déroule en 3 étapes :
  1. On utilise un programme Delphi qui met à jour une table temporaire au format DBase (cette partie là ne sera pas décrite),
  2. On copie cette table temporaire sur le serveur par FTP (on utilise pour cela le composant NMFTP, décrit ci-dessous),
  3. 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.

Récupération d'une table MySQL au format DBase

Cette opération se déroule elle aussi en 3 étapes :
  1. On lance la copie PHP avec un programme du style : mysql_copie("ville3.dbf", "ville"); déclenché par une requête HTTP,
  2. On récupère la table temporaire au format DBase en local par FTP,
  3. 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);
}

?>


Conclusion

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.
Synseo