Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & ODBC
PHP & ODBC Forum d'entraide sur ODBC avec PHP. Avant de poster -> FAQ ODBC
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/06/2008, 08h46   #1
Nouveau Membre du Club
 
Inscription : juin 2008
Messages : 64
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 64
Points : 29
Points : 29
Par défaut probleme dans la requete

Bonjour

j'ai fait un programme qui lit à partir d'un fichier texte une chaine, puis la décomposes en mot, cont chacune est une adresse mail, pour chaque adresse, il exécute une requette permettant de selectionner le contact ayant cette adresse de la base de données, le copier dans une deuxiemme table, puis le supprimer de la premiere.
mon probleme c'est qu'il n'effectu le traitement que sur le dernier mot de la chaine.
il n'ya pas de probleme au niveau de la lecture à partir du fichier, car ça peu afficher tout les adresses. le probleme réside au niveau de la boucle WHILE aprés l'exécution de la requete, ça passe pas! j'ai pas pu trouver une explication pour ça, si vous en avez idée, merci de me guider!!

ceci est le bout de code qui cose le probleme:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
while ($tok) 
{
echo $tok; // pas de probleme pour la lecture à partir de fichier, ca ça affiche toutes les adresse!
set_time_limit(50);
//mise à jours de la base:
$query="SELECT * FROM inscription WHERE Mail='".$tok."'";
$res=odbc_do($cnx,$query);
while($row=odbc_fetch_object($res))// ici est le probleme
    {
	echo " $row->Mail \n";// ça n'affiche que le dernier mot
	set_time_limit(50);
// c'est just pour la convertion des caracteres pouvant causer un probleme lors de l'insertion
	$from=array("'","&",",","/",".");
	$to=array(" ","et"," ","ou","");
	$activite=str_replace($from,$to,$row->Activite);
	$fonction=str_replace($from,$to,$row->Fonction);
	$soc=str_replace($from,$to,$row->Societe);
	$remarque=str_replace($from,$to,$row->Remarque);
	$adr=str_replace($from,$to,$row->Adresse);
	$nom=str_replace($from,$to,$row->Nom);
	$pre=str_replace($from,$to,$row->Prenom);
	$pays=str_replace($from,$to,$row->Pays);
	$ville=str_replace($from,$to,$row->Ville);
 
	$q="INSERT INTO archive VALUES('".date("Y")."-".date("m")."-".date("d")."','".$row->DateInscription."','".$row->Sex."','".$nom."','".$pre."','".$fonction."','".$row->Tel."','".$row->Fax."','".$soc."','".$activite."','".$adr."','".$ville."','".$row->CP."','".$pays."','".$row->Mail."','".$row->WebSite."','".$remarque."','".$row->NumDossier."','".$row->ReceptionOffre."','".$row->TypeInscri."','".$row->Civilite."','".$row->Serveur."')";
	   $r=odbc_do($cnx,$q);
ma base est access, et je travaille avec php
loulitta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/06/2008, 10h29   #2
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 383
Points : 16 383
Ca contient quoi $tok ?

Parce qu'a moins qu'il y ait quelque part un bout de code qui fasse changer $tok, ta boucle n'est arreté que par le timeout.

Si $tok est un tableau contenant les emails, tu voulais peut etre plutot ecrire
Code :
foreach ($tok as $email)
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/06/2008, 10h49   #3
Nouveau Membre du Club
 
Inscription : juin 2008
Messages : 64
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 64
Points : 29
Points : 29
$tok c'est la variable contenant l'adresse mail extraite du fichier!
bon le programme lit correctement à partir du fichier, extrait les adresses mail à partir de la chaine lue coorrectement, pas de time out car le programme marche, mais seulement sur la dernière adresse qu'il lit! pas d'erreurs et il affiche enfin le msg de succés de traitement d'une seule adresse! je trouve ça bizare!
NB: le meme code a fonctionné correctement avant!
j'ai mit un echo $res;
et ça affiche #8 Resource id, puis #9 resource id..... tant des adresses

j'ai aussi essaié ça while($row=odbc_fetch_row($res) or die ("erreur"))
ça affiche #8 Resource iderreur et neglige le reste de programme!


ci joint est le code complet:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
 
while(!feof($fp))
{
set_time_limit(50);
$chaine=fgets($fp,100);
$tok = strtok($chaine, " ,'()[]<>\n\t\"/*+{}="); 
while ($tok) 
{
//echo $tok;
set_time_limit(50);
$query="SELECT * FROM inscription WHERE Mail='".$tok."'";
$res=odbc_do($cnx,$query);
	echo $res;
 
while($row=odbc_fetch_row($res))
    {
 
    echo "$row[Mail]";
	set_time_limit(50);
	$from=array("'","&",",","/",".");
	$to=array(" ","et"," ","ou","");
	$activite=str_replace($from,$to,$row->Activite);
	$fonction=str_replace($from,$to,$row->Fonction);
	$soc=str_replace($from,$to,$row->Societe);
	$remarque=str_replace($from,$to,$row->Remarque);
	$adr=str_replace($from,$to,$row->Adresse);
	$nom=str_replace($from,$to,$row->Nom);
	$pre=str_replace($from,$to,$row->Prenom);
	$pays=str_replace($from,$to,$row->Pays);
	$ville=str_replace($from,$to,$row->Ville);
 
	$q="INSERT INTO archive VALUES('".date("Y")."-".date("m")."-".date("d")."','".$row->DateInscription."','".$row->Sex."','".$nom."','".$pre."','".$fonction."','".$row->Tel."','".$row->Fax."','".$soc."','".$activite."','".$adr."','".$ville."','".$row->CP."','".$pays."','".$row->Mail."','".$row->WebSite."','".$remarque."','".$row->NumDossier."','".$row->ReceptionOffre."','".$row->TypeInscri."','".$row->Civilite."','".$row->Serveur."')";
	   $r=odbc_do($cnx,$q);
	   if(!$r)
	   {
	    echo odbc_errormsg($cnx);
	   }
		else
		{
		$qdel="DELETE FROM inscription WHERE Mail='".$tok."'";
		$rdel=odbc_do($cnx,$qdel);
		if(!$rdel)
	    echo odbc_errormsg($cnx);
		else
		{
		$i++;
		}
		}
}
$tok = strtok(" ,'()[]<>\n\t\"/*+{}="); 
}
}
}
fclose($fp);
loulitta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/06/2008, 11h57   #4
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 383
Points : 16 383
Non je ne comprends pas ton code
Code :
1
2
3
4
5
6
 
while ($tok) 
{
//echo $tok;
set_time_limit(50);
$query="SELECT * FROM inscription WHERE Mail='".$tok."'";
While($tok) ca veut dire "tant que $tok == TRUE" donc ca ne s'arrete jamais puisque $tok ne change pas dans cette boucle.
Ton script s'arrete au bout des 50s que tu as définies.
Pendant ces 50s il va repeter la meme requete.

Si tu veux verifier que $tok n'est pas vide il faut faire
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/06/2008, 12h26   #5
Nouveau Membre du Club
 
Inscription : juin 2008
Messages : 64
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 64
Points : 29
Points : 29
merci de m'avoir répondre!
concernant la variable $tok, elle n'est pas vide car j'arrive à l'afficher! en tt cas j'ai essayé le (!empty), et toujour le meme résultat.

j'ai aussi affiché la requete dans la boucle while, et c'est bon, à chaque foix la variable $tok change de valeur à la fin de la boucle. ceci est l'une des requete généré: SELECT * FROM inscription WHERE Mail='hyounsi@tuniship.net '

par contre j'ai essayé le(empty) sur le résultat de la requete, et c'est vide!
donc, c'est tout à fait normal qui va pas executer ce qui est dans la boucle while($row=odbc_fetch_row($res)). j'ai vérifié dans la base de donnée que les adresse existe!
mon probleme c'est que le résultat de la requete (SELECT) est vide alors que les valeurs axistent dans la base.
loulitta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/06/2008, 13h48   #6
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 383
Points : 16 383
En mettant "while ($tok)" tu veux faire quoi ?

Sinon j'ai regardé des exemples, et ils utilisent la fonction odbc_result pour recuperer le resultat des requetes odbc sur access
Code :
1
2
3
4
5
6
7
8
9
$sql="SELECT * FROM customers";
$rs=odbc_exec($conn,$sql);
while (odbc_fetch_row($rs))
{
  $compname=odbc_result($rs,"CompanyName");
  $conname=odbc_result($rs,"ContactName");
  echo "<tr><td>$compname</td>";
  echo "<td>$conname</td></tr>";
}
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/06/2008, 14h34   #7
Nouveau Membre du Club
 
Inscription : juin 2008
Messages : 64
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 64
Points : 29
Points : 29
merci pour m'avoir accorder tout ce temps!!

au début la variable $tok contient le premier mot dans le texte, le traitement dans la boucle while($tok) s'arete des que $tok change de valeur, et c'est à la fin de la boucle, comme suit:
Code :
1
2
3
4
5
6
7
8
 
while($tok)
{
 
//traitement de $tok numero i
 
$tok = strtok(" ,'()[]<>\n\t\"/*+{}=");
}// sortie de la boucle pour le iémme $tok, et $tok prend la valeur de (i+1)émme mot

j'ai fait comme tu m'as expliqué par odbc_result mais toujours le meme probleme au niveaux des variable qu'il récupère vide, ou q'il ne les trouve pas, alors qu'elles existent dans la BD!!

Remarque: pour un fichier il fait le traitement sur le derniers mot de fichier seulement et neglige le reste!
loulitta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/06/2008, 15h20   #8
Nouveau Membre du Club
 
Inscription : juin 2008
Messages : 64
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 64
Points : 29
Points : 29
bon j'ai juste mis 3 adresses dans mon fichier texte, et j'ai essayé de récupérer les variables et les afficher comme dans le code dessous:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
 
while ($tok)
{
$req="SELECT * FROM inscription WHERE Mail='$tok'";
$res=odbc_do($cnx,$req);
if (!empty($res))
echo "non vide<br />";
$row=odbc_fetch_object($res);
echo "$row->Mail|$row->Remarque|$row->Prenom|$row->Fonction <br />";
$tok = strtok(" ,'()[]<>\n\t\"/*+{}="); 
}
regardez ce qu'il affiche:
nonvide
|||
non vide
|||
non vide
mouna.baccouche@argania.com.tn|ns|NR|NR

il ne garde que la derniere valeurj'y trouve pas une explication!
loulitta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/06/2008, 22h11   #9
Nouveau Membre du Club
 
Inscription : juin 2008
Messages : 64
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 64
Points : 29
Points : 29
voila une journée perdu pour une betise!!!
le probleme c'était qu'il ya un espace de plus dans le mot récupéré du fichier, d'ou à chaque execution de la requete, aucun mot(+espace) ne sera trouvé!

merci encore une foix sabotage
loulitta est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h08.


 
 
 
 
Partenaires

Hébergement Web