Php et hyperfile, est-ce possible?

adeath 23 Messages postés vendredi 19 septembre 2003Date d'inscription 9 août 2006 Dernière intervention - 6 févr. 2004 à 10:10 - Dernière réponse :  JedidiaMariah
- 2 févr. 2018 à 12:48
En premier lieu bonjour et merci à ceux qui lirons ce message.

Je voudrais développer un site internet en exploitant une BDD hyperfile.

>Est-il possible d'attaquer cette BDD avec php ou faut-il absolument avoir Webdev?

>Si quelq'un à la solution cela m'interresserait car je ne connait absolument pas l'environnement WinDev.
Afficher la suite 

40 réponses

Répondre au sujet
arnal69130 445 Messages postés lundi 17 février 2003Date d'inscription 22 mars 2007 Dernière intervention - 10 mars 2004 à 14:46
+1
Utile
Je confirme,
attaquer une BD hyperfile en php c'est tout à fait possible. Il faut effectivement utiliser un driver ODBC.

Il faut avoir le driver odbc hyperfile (installé avec windev).
Il est nécessaire d'avoir le fichier de l'analyse (.wdd).
Restriction : l'accès par odbc est en lecture seule !

J'ai développé un module intranet de consultation qui vient se greffer sur une application windev existante. ça marche bien !

bon dev.//
Arnaud
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de arnal69130
fmazoue 335 Messages postés vendredi 14 février 2003Date d'inscription 1 septembre 2015 Dernière intervention - 6 févr. 2004 à 10:38
0
Utile
par odbc c peut etre possible non ? renseigne toi dessus !
NIARF :-p
Commenter la réponse de fmazoue
Big Broder 17 Messages postés jeudi 6 janvier 2005Date d'inscription 16 mars 2005 Dernière intervention - 6 janv. 2005 à 09:17
0
Utile
Salut !
Arnal ? J'ai besoin d'extraire des données d'une base hyperfile, j'ai donc fait mon lien odbc, de ce côté la, pas de problème. Mais je suis une buse en programmation et j'ai un peu de mal à décoller avec le php/sql. Pourrais tu me donner un exemple (ou plusieurs !!) de code ??

Merci d'avance !!

Big Brother
Commenter la réponse de Big Broder
arnal69130 445 Messages postés lundi 17 février 2003Date d'inscription 22 mars 2007 Dernière intervention - 6 janv. 2005 à 11:42
0
Utile
Bonjour BigBrother,
Pour commencer avec PHP, tu peux faire un fichier index.php tout simple, qui n'utilise pas de BDD du genre :
<?php
echo "bonjour";
?>

Ensuite, pour afficher le contenu d'une table de ta base, tu peux faire un truc du genre :
<?php
//connexion à ton DSN :
$connexion = odbc_connect("NomDSN","","")) or die("echec connexion");

//Requête de sélection :
$requete="SELECT * FROM TABLE;";
$resultat = odbc_exec($connexion,$requete);

//affichage du résultat :
odbc_result_all($resultat);
?>

Pour plus d'info, vas voir sur www.php.net et regardes toutes les fonctions qui commence par odbc_...().

Voilà, j'espère t'avoir un peu éclairé. Si tu veux plus de précisions sur un point particulier, n'hésites pas.

Bonne journée
Arnaud
Commenter la réponse de arnal69130
Big Broder 17 Messages postés jeudi 6 janvier 2005Date d'inscription 16 mars 2005 Dernière intervention - 3 févr. 2005 à 13:02
0
Utile
Bonjour,

Est ce que par hasard tu saurais formater des dates via odbc?
parce que je récupère des données mais les dates ne passent pas..
je les ai quand je fais un result_all mais pas autrement.Hors je veux inscrire toutes
les données de ma table dans un fichier texte. Ces dates sont au format date (float 8)
sous la forme jj/mm/aaaa dans la table mais il les renvoit dans le result_all sous la forme
aaaa-mm-jj.
Je suppose qu'il y a donc un problème de format et de compatibilité mais je ne sais comment le corriger..meme pcsoft souffre..

Autre problème : je crois savoir que l'odbc ne gère pas la fonction LIMIT pour afficher un certain nombre de resultats. J'ai entendu parler de TOP mais sans plus..
Connaitrais tu un moyen de faire ce genre de chose??

Voili voila , merci d'avance de ton aide !

Big Brother
Commenter la réponse de Big Broder
Big Broder 17 Messages postés jeudi 6 janvier 2005Date d'inscription 16 mars 2005 Dernière intervention - 3 févr. 2005 à 13:13
0
Utile
euh merci de ta réponse au fait ! je viens seulement de la lire lol

Big Brother
Commenter la réponse de Big Broder
arnal69130 445 Messages postés lundi 17 février 2003Date d'inscription 22 mars 2007 Dernière intervention - 7 févr. 2005 à 09:08
0
Utile
En fait, il y a un réel bug dans le driver ODBC HyperFile, quant à la lecture des dates !
Pour contourner ce problèmes,
1. j'exécute ma requête en triant par date,
2. j'utilise la redirection de la sortie standard (si tu ne connais pas, regarde l'aide sur les fonctions qui commencent pas ob...),
3. "j'affiche" tout le résultat de la requête, et
4. dans la fonction de callback, je découpe le tableau-résultat (html) afin d'obtenir une variable tableau (php) contenant le résultat ma requête.

C'est peut-être un peu compliqué, mais je n'ai pas trouvé mieux ! Voici un exemple :

<?php
//Définition de la fonction de callback qui sera appelée dans ob_start()
function callback($buffer)
{
Global $tableau;
$tableau=array();
$tab=explode("</tr>",$buffer);
array_pop($tab);


$entete=explode("</th>",substr($tab[0],11));
array_pop($entete);
foreach($entete as $numcol => $nomcol)
{ $entete[$numcol]=substr($nomcol,4); }


array_shift($tab);
foreach($tab as $numligne => $ligne)
{
$ligne=explode("</td>",substr($ligne,5));
array_pop($ligne);
foreach($ligne as $numcol => $cellule)
{ $tableau[$numligne][$entete[$numcol]]=htmlentities(substr($cellule,4)); }
}
}

Global $tableau;
//requête :
$req = "SELECT ... FROM ... ORDER BY ChampDate DESC;";
$res = odbc_exec($_SESSION['connexion'],$req);

//redirection de la sortie standard :
ob_start("callback");
odbc_result_all($res);
ob_end_flush();
ob_implicit_flush(0);

//le résultat de ta reqête est dans la variable $tableau !
?>

Je suis sur qu'ensuite tu es capable de formater les dates comme tu veux !
Si tu veux écrire les dates dans un fichier texte, tu peux directement le faire dans la fonction de callback.
Pour la clause LIMIT, je ne me suis jamais penché sur le pb, je ne peux pas t'aider.

En espérant t'avoir permis d'avancer,
Arnaud
Commenter la réponse de arnal69130
Big Broder 17 Messages postés jeudi 6 janvier 2005Date d'inscription 16 mars 2005 Dernière intervention - 7 févr. 2005 à 13:20
0
Utile
Salut !
Merci de ta réponse Arnaud, mais je t'avoue ne pas trop comprendre ce que tu as écrit...
je vais me pencher sur la question, car il semble que ca resolve mon problème mais il me faut essayer de traduire tout ca ;-) en effet je pensais à un truc de ce style là, traiter mes dates à part et les réinsérer ensuite.

Big Brother
Commenter la réponse de Big Broder
arnal69130 445 Messages postés lundi 17 février 2003Date d'inscription 22 mars 2007 Dernière intervention - 9 févr. 2005 à 11:49
0
Utile
Je vais essayer d'être un peu plus clair, ou au moins de détailler un peu plus.

Comme tu l'avais constaté, les dates "passent" correctement quand on fait un odbc_result_al(). Le problème, c'est que cette fonction affiche directement le résultat à l'écran, et que nous on veut pas les afficher, mais les mettre dans une variable (ou dans un fichier texte).
=> Donc il faut rediriger ce flux de données destiné à l'affichage (c'est la sortie standard) vers une fonction appelée fonction de callback. Cette fonction prend en paramètre ce flux de données destiné initialement à l'affichage. Dans l'exemple ci-dessus, c'est la variable $buffer de la procédure callback(). Il est inutile de préciser le paramètre lors de l'appel de la procédure callback() Voila en gros ce qu'on appelle la redirection de la sortie standard (enfin, ce que j'en ai compris ;o))

Ensuite, dans la fonction de callback, si tu veux tu peux directement écrire tout le contenu de la variable $buffer dans un fichier texte :
function callback($buffer)
{
$fp=fopen("fichier.txt","w");
fwrite($fp,$buffer);
fclose($fp);
}

Le buffer contient donc toutes les instructions html nécessaires à l'affichage du tableau de résultat de ta requête, y compris les balises <table>, <tr>, etc...
Je ne sais pas pourquoi tu veux utiliser un fichier texte, si c'est uniquement pour "traiter les dates à part et les réinsérer ensuite", c'est à mon avis inutile, tu peux le faire directement dans la fonction de callback. Toutefois, le fait d'écrire le buffer dans un fichier texte te permettra de voir à quoi il ressemble.

Personnellement, j'ai choisi de découper ce buffer afin de récuper toutes les données du résultat de la requête dans un tableau php.

Si tu veux plus d'explications, n'hésite pas à me dire précisemment ce que tu ne comprends pas.
Arnaud
Commenter la réponse de arnal69130
Big Broder 17 Messages postés jeudi 6 janvier 2005Date d'inscription 16 mars 2005 Dernière intervention - 9 févr. 2005 à 15:40
0
Utile
Salut !
Merci Arnal !! ben en fait non, j'ai besoin de ces dates dans mon txt
pour pouvoir permettre aux gens qui le recupère (le txt) de le réinjecter dans leur base afin de la mettre a jour.
Ok !! en tout cas c'est un peu plus clair.
Mais ici en l'occurence, il faudrait que je fasse une autre requete pour extraire uniquement les dates et les traiter avec ta fonction (ce qui supposerait de faire gaffe a bien les mettre au bon endroit) ou tu crois que je peux d'ores et déjà integrer ca a ma boucle existante??

Big Brother
Commenter la réponse de Big Broder
arnal69130 445 Messages postés lundi 17 février 2003Date d'inscription 22 mars 2007 Dernière intervention - 9 févr. 2005 à 15:50
0
Utile
ok, tu doit pouvoir créer ton txt dans la fonction de callback.
Que veux-tu précisement qu'il y ait dans ton fichier texte à la fin de la manip ?
Quelle est ta requête ? et quelle est ta boucle existante ?
Arno
Commenter la réponse de arnal69130
Big Broder 17 Messages postés jeudi 6 janvier 2005Date d'inscription 16 mars 2005 Dernière intervention - 9 févr. 2005 à 15:59
0
Utile
ok c parti...
en fait tel que c'est la, ca marche comme je veux, et j'ai mes champs dans le fichier texte les uns a la suite des autres séparé par des ";". je veux juste rajouter la date qui va bien au bout de chaque ligne. genre:
00809F03582E;ACACW9731B0001;3CM02164AA;;;NB51B;1;IMPORT_T;
il peut y avoir des colonnes vides.
// creation de la requete 
 $req1="select caadresse,canumserie,caclasse,cavr,caics,camnemo,calogin,cadate(lui qui veut pas) from carte order by caadresse asc";

// initialisations stables 
 $lf="\r\n"; // retour &#224; la ligne
 $sep=";"; //s&#233;parateur

// cr&#233;ation du fichier texte Gestmac.txt
 $hdle=fopen($nomdefichier,'wb');

// ex&#233;cution de la requ&#234;te
 $res=odbc_exec ($cx,$req1) or die("Request can't be executed.".odbc_errormsg());


// compte du nombre de colonne 
 $len=odbc_num_fields($res); 


// lecture de la premi&#232;re ligne de resultat
 while($ligne=odbc_fetch_row($res))
  { 
// $out se vide &#224; chaque nouvelle ligne 
 $out=""; 
 for($i=1;$i<=$len;$i++) 
   {
 
// ajout du ;1; en 7&#232;me colonne ( 6 &#232;me s&#233;parateur ) correspondant au type "adresse MAC" ind&#233;pendant de la base
 if ($i == 7) $out .= "1".$sep;

// incr&#233;mentation des donn&#233;es de la ligne sur la variable
$out= $out.odbc_result($res,$i).$sep; 
   } // fin du for 

// on compte le nombre de caract&#232;re de la ligne compl&#232;te, on enl&#232;ve le dernier s&#233;parateur (-1) et on va &#224; la ligne
 $out2=substr($out,0,strlen($out)-1).$lf;// pour virer le dernier $sep 


// &#233;crire la ligne compl&#232;te en cours 
 fputs($hdle,$out2); 
  } //fin du while // tant qu'il y a des lignes

// fermeture du fichier
 fclose($hdle);
 odbc_free_result($res);


// fermeture de la connexion
 odbc_close($cx);

voila ma boucle.

Big Brother
Commenter la réponse de Big Broder
arnal69130 445 Messages postés lundi 17 février 2003Date d'inscription 22 mars 2007 Dernière intervention - 9 févr. 2005 à 16:37
0
Utile
ok, alors je pense que le mieux serait de faire ta requête d'une part, et ensuite, dans la fonction de callback, de faire ta boucle.
ça donnerait un truc du genre :

function callback($buffer)
{
// initialisations stables
$lf="\r\n"; // retour à la ligne
$sep=";"; //séparateur

// création du fichier texte Gestmac.txt
$hdle=fopen($nomdefichier,'wb');

// Si le parcours du buffer te semble obscur, tu peux commencer par simplement faire
fwrite($hdle,$buffer); // au lieu du parcours ci-dessous, et ensuite regarde le résultat dans le fichier texte

// ------ parcours du buffer --------

//on découpe le buffer selon les lignes du tableau html (séparées par des </tr>) afin de créer le tableau php $tab
$tab=explode("</tr>",$buffer);

// On enlève la première ligne qui contient les titres des colonnes
array_shift($tab);
// et la dernière ligne qui contient uniquement '</tr></table>' !
array_pop($tab);

//on parcours $tab, ligne par ligne
foreach($tab as $numligne => $ligne)
{
//on découpe chaque ligne du tableau selon les cellules séparées par "</td>"
$ligne=explode("</td>",substr($ligne,5));
//on enlève la dernière cellule qui ne contient que '</td>'
array_pop($ligne);

// $out se vide à chaque nouvelle ligne
$out="";

//on parcours toute la ligne, cellule par cellule
foreach($ligne as $numcol => $cellule)
{
// ajout du ;1; en 7ème colonne ( 6 ème séparateur ) correspondant au type
// "adresse MAC" indépendant de la base
if ($numcol == 6) $out .= "1".$sep;

// incrémentation des données de la ligne sur la variable
$out.=htmlentities(substr($cellule,4)).$sep; //on enlève les 4 premiers
//caractères de chaque cellule qui sont '<td>'
}
// on compte le nombre de caractère de la ligne complète, on enlève le dernier
// séparateur (-1) et on va à la ligne
$out2=substr($out,0,strlen($out)-1).$lf;// pour virer le dernier $sep


// écrire la ligne complète en cours
fputs($hdle,$out2);

}
//-------- fin de parcours du buffer -------

// fermeture du fichier
fclose($hdle);
}

// creation de la requete
$req1="select caadresse, canumserie, caclasse, cavr, caics, camnemo, calogin, cadate from carte order by caadresse asc, cadate desc";
// exécution de la requête
$res=odbc_exec ($cx,$req1) or die("Request can't be executed.".odbc_errormsg());

ob_start("callback");
odbc_result_all($res);
ob_end_flush();
ob_implicit_flush(0);
odbc_free_result($res);

// fermeture de la connexion
odbc_close($cx);

J'ai pas vraiment tester, alors j'espère que ça marchera.
Arno
Commenter la réponse de arnal69130
Big Broder 17 Messages postés jeudi 6 janvier 2005Date d'inscription 16 mars 2005 Dernière intervention - 10 févr. 2005 à 09:14
0
Utile
Salut !
Et bé !! nickel le code tout detaillé et tout et tout !! Je viens de le tester la ce matin, mais faut que je me plonge dedans pour faire qq echos de ci de la. parce que la, apparement ca marche..mais pas de fichier texte a l'horizon...
Je te tiens au courant, mais d'ores et déja merci beaucoup !!
Big Brother
Commenter la réponse de Big Broder
Big Broder 17 Messages postés jeudi 6 janvier 2005Date d'inscription 16 mars 2005 Dernière intervention - 10 févr. 2005 à 10:39
0
Utile
Bonne nouvelle !! ca marche !! il fallait juste déclarer $nomdefichier dans la fonction. C'est parfait !! j'ai juste qu'a virer mes - dans les dates qui sont aaaa-mm-jj, et pis ca sera bon !
Vraiment merci pour tout !! Tu es le seul du monde à m'avoir vraiment aidé sur ce coup la ! je me couperai bien une couille, mais j'imagine que tu as les tiennes... allez @ +++ !!!!
et merci encore !!!

Big Brother
Commenter la réponse de Big Broder
Big Broder 17 Messages postés jeudi 6 janvier 2005Date d'inscription 16 mars 2005 Dernière intervention - 10 févr. 2005 à 11:18
0
Utile
si je fais ca :
//on parcours toute la ligne, cellule par cellule
foreach($ligne as $numcol => $cellule)
{
// ajout du ;1; en 7ème colonne ( 6 ème séparateur ) correspondant au type
// "adresse MAC" indépendant de la base
if ($numcol == 6) $out.= "1".$sep;
// on enlève les "-" dans les dates.
if ($numcol == 8) $cellule=str_replace('-','',$cellule);<==CA

// incrémentation des données de la ligne sur la variable
$out.=htmlentities(substr($cellule,4)).$sep; //on enlève les 4 premiers
//caractères de chaque cellule qui sont '<td>'
}
ca doit marcher nan??

Big Brother
Commenter la réponse de Big Broder
Big Broder 17 Messages postés jeudi 6 janvier 2005Date d'inscription 16 mars 2005 Dernière intervention - 10 févr. 2005 à 12:51
0
Utile
affaire classée , c bon !!

Big Brother
Commenter la réponse de Big Broder
arnal69130 445 Messages postés lundi 17 février 2003Date d'inscription 22 mars 2007 Dernière intervention - 10 févr. 2005 à 14:32
0
Utile
Ravi de t'avoir aidé ! Mais garde tes 2 c***lles, et clique plutôt sur "accepter la réponse" ;o)

C'est vrai qu'il ne semble pas y avoir grand monde qui cherche à consulter une base de données hyperfile en php ! Peut-être utilisent-ils tous webdev ? En tout cas pour moi ça fonctionne bien... à part cette histoire de dates qu'est quand même bien galère !

Si t'as d'autres soucis, n'hésite pas.
a+
Arno
Commenter la réponse de arnal69130
Big Broder 17 Messages postés jeudi 6 janvier 2005Date d'inscription 16 mars 2005 Dernière intervention - 10 févr. 2005 à 15:43
0
Utile
No problem ! pour l'instant ca marche au poil (de c...?) donc c cool :
@ +++ !!

Big Brother
Commenter la réponse de Big Broder
Big Broder 17 Messages postés jeudi 6 janvier 2005Date d'inscription 16 mars 2005 Dernière intervention - 10 févr. 2005 à 15:43
0
Utile
No problem ! pour l'instant ca marche au poil (de c...?) donc c cool
@ +++ !!

Big Brother
Commenter la réponse de Big Broder

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

php et hyperfile, est-ce possible? - page 2