Function while dans php ne fonctionne pas... pourquoi?

WRInaute discret
Hello a tous,

Alors je transfert des donnes d'une base de donne(nommer:cybersp1_kvd) a une autre(nommer:cybersp1_kheopsosc) a l'aide de ce code... (qui sera effectuer automatiquement a tous les heures):

Code:
$query  = "SELECT * FROM cybersp1_kvd.groupe_d";
$result = mysql_query($query);
while($row = mysql_fetch_array($result)){

 
$count= 0;
$dgroupnum = $row['dgroupnum'];
$num_groupe = $row['num_groupe'];
$code_groupe = $row['code_groupe'];
$descrip = $row['descrip'];
$descrip_e = $row['descrip_e'];
$is_on_site = $row['is_on_site'];
$date = date("Y-m-d");
$heure = date("H:i:s");
$heuredate = "$date $heure";



$sqqql="SELECT * FROM cybersp1_kheopsosc.categories_description ";  
$answer = mysql_query($sqqql);
while ($answer_data2 = mysql_fetch_array($answer) ) 
{ 
if ($code_groupe!=$answer_data2['categories_description'])
echo"";
else
$count=$count+1; 
} 

if(($count == 0 ) && ($num_groupe == 03) && ($is_on_site == 1)){
//echo "elle existe pas<br>";
mysql_query("INSERT INTO cybersp1_kheopsosc.categories_description (language_id, categories_name, categories_description ) VALUES ('1', '$descrip_e', '$code_groupe')");
mysql_query("INSERT INTO cybersp1_kheopsosc.categories_description (language_id, categories_name, categories_description ) VALUES ('4', '$descrip', '$code_groupe')");
}else{
mysql_query("UPDATE cybersp1_kheopsosc.categories_description SET categories_name='$descrip_e'  WHERE categories_description = '$code_groupe' AND language_id = '1'");
mysql_query("UPDATE cybersp1_kheopsosc.categories_description SET categories_name='$descrip'  WHERE categories_description = '$code_groupe' AND language_id = '4'");
}
}

Mais voila a chaque fois que j'active le script, il ne me copie que une range et ne fait pas les autres qui pourtant son bien la.

Si vous voyez mon erreur ou avez une suggestion vous seriez tres gentil de me le partager.

Merci
Will
 
WRInaute passionné
Bonjour,

A mon avis cela vient de ton test sur
Code:
$count == 0

Visiblement c'est toi qui lui demande de n'en insérer qu'un seul (de ta 2e boucle)
 
WRInaute discret
druart a dit:
Bonjour,

A mon avis cela vient de ton test sur
Code:
$count == 0

Visiblement c'est toi qui lui demande de n'en insérer qu'un seul (de ta 2e boucle)

mais le but de se "$count" est de ne pas inserer une nouvelle ligne si l'item existe deja...mais de a la place modifier. De plus je croyais que la fonction while faisait une boucle et que donc puisque la declaration de ma variable:
$count= 0;
est a l'interieur et bien qu'elle revenait a zero a chaque fois ..non?
 
WRInaute passionné
Bonjour,

oui effectivement.

Donc ton pb c'est qu'il ne te sort un seule range de la 1ere boucle ?

Moi j'essayerai de faire un écho des variables et de commenter les insert et update : ça te permettrai de pouvoir tracer tes données car là sans avoir accès aux données c'est pas évident ;-)
 
WRInaute accro
Ajoute un echo "trace 1" dans la première branche de ton if, et un echo "trace 2" dans la deuxième. A mon avis tu vas te rendre compte que dans la plupart des cas il exécute la deuxième branche (même si les lignes voulues n'existent pas dans la table de destination) à cause de ton test.

Jacques.
 
WRInaute discret
Bonjour,

Pour moi, ton while {} s'arrete juste aprés le $count=$count+1;
Ensuite, si ton $count est resté à 0 (et que tes autres variables de test correspondent à tes conditions), il passe à la suite du code qui est ton INSERT en Bdd. (si l'une des 3 conditions de ton if est fausse, il UPDATE, évidemment)

Puis, il s'arrête là... ton while étant fermé plus haut, tu n'as pas de boucle
Psero, je testerai ça
Code:
$query  = "SELECT * FROM cybersp1_kvd.groupe_d";
$result = mysql_query($query);
while($row = mysql_fetch_array($result)){


$count= 0;
$dgroupnum = $row['dgroupnum'];
$num_groupe = $row['num_groupe'];
$code_groupe = $row['code_groupe'];
$descrip = $row['descrip'];
$descrip_e = $row['descrip_e'];
$is_on_site = $row['is_on_site'];
$date = date("Y-m-d");
$heure = date("H:i:s");
$heuredate = "$date $heure";

$sqqql="SELECT * FROM cybersp1_kheopsosc.categories_description ";  
$answer = mysql_query($sqqql);
while ($answer_data2 = mysql_fetch_array($answer) ) 
{  
     if ($code_groupe==$answer_data2['categories_description']) { $count++; }       // Modif du code

if(($count == 0 ) && ($num_groupe == 03) && ($is_on_site == 1)){
//echo "elle existe pas<br>";
mysql_query("INSERT INTO cybersp1_kheopsosc.categories_description (language_id, categories_name, categories_description ) VALUES ('1', '$descrip_e', '$code_groupe')");
mysql_query("INSERT INTO cybersp1_kheopsosc.categories_description (language_id, categories_name, categories_description ) VALUES ('4', '$descrip', '$code_groupe')");
}else{
mysql_query("UPDATE cybersp1_kheopsosc.categories_description SET categories_name='$descrip_e'  WHERE categories_description = '$code_groupe' AND language_id = '1'");
mysql_query("UPDATE cybersp1_kheopsosc.categories_description SET categories_name='$descrip'  WHERE categories_description = '$code_groupe' AND language_id = '4'");
}

$count=0;  // Modif du code
}
 
WRInaute discret
retza a dit:
Bonjour,

Pour moi, ton while {} s'arrete juste aprés le $count=$count+1;
Ensuite, si ton $count est resté à 0 (et que tes autres variables de test correspondent à tes conditions), il passe à la suite du code qui est ton INSERT en Bdd. (si l'une des 3 conditions de ton if est fausse, il UPDATE, évidemment)

Puis, il s'arrête là... ton while étant fermé plus haut, tu n'as pas de boucle
Psero, je testerai ça
Code:
$query  = "SELECT * FROM cybersp1_kvd.groupe_d";
$result = mysql_query($query);
while($row = mysql_fetch_array($result)){


$count= 0;
$dgroupnum = $row['dgroupnum'];
$num_groupe = $row['num_groupe'];
$code_groupe = $row['code_groupe'];
$descrip = $row['descrip'];
$descrip_e = $row['descrip_e'];
$is_on_site = $row['is_on_site'];
$date = date("Y-m-d");
$heure = date("H:i:s");
$heuredate = "$date $heure";

$sqqql="SELECT * FROM cybersp1_kheopsosc.categories_description ";  
$answer = mysql_query($sqqql);
while ($answer_data2 = mysql_fetch_array($answer) ) 
{  
     if ($code_groupe==$answer_data2['categories_description']) { $count++; }       // Modif du code

if(($count == 0 ) && ($num_groupe == 03) && ($is_on_site == 1)){
//echo "elle existe pas<br>";
mysql_query("INSERT INTO cybersp1_kheopsosc.categories_description (language_id, categories_name, categories_description ) VALUES ('1', '$descrip_e', '$code_groupe')");
mysql_query("INSERT INTO cybersp1_kheopsosc.categories_description (language_id, categories_name, categories_description ) VALUES ('4', '$descrip', '$code_groupe')");
}else{
mysql_query("UPDATE cybersp1_kheopsosc.categories_description SET categories_name='$descrip_e'  WHERE categories_description = '$code_groupe' AND language_id = '1'");
mysql_query("UPDATE cybersp1_kheopsosc.categories_description SET categories_name='$descrip'  WHERE categories_description = '$code_groupe' AND language_id = '4'");
}

$count=0;  // Modif du code
}

Non malheureusement ca fait la meme chose que mon code... :?
 
WRInaute discret
RiPSO a dit:
je n'ai pas analysé complètement ton code mais a priori il ne serait pas plus interessant d'utiliser un ON DUPLICATE KEY?

http://dev.mysql.com/doc/refman/5.1/en/insert.html

Ca semble comme une tres bonne idee...mais voila dite moi le si je me trompe, mais "ON DUPLICATE KEY" verifie la premiere colonne ou celle qu'on defini comme index ou primary key et on dois la definir comme unique aussi.
Admettons que je modifie ma base de donne et definie la colone voullu comme primary key ou index et la definie comme unique aussi, ca ne fonctionnera pas car je dois lui permettre d'avoir le meme code 2 fois dans la colonne.

Exemple:
Je pars de cette base de donnee:
num_groupe | code_groupe | descrip | descri_e | is_on_site
03..................elec........electronic......electronique........1


Et je veus que si num_groupe==03 et que is_on_site==1 qu'il copie l'info de cette maniere dans cette base de donnee:( A noter que pour moi 1 =anglais et 4 francais dans language_id)
language_id | categories_name | categories_description
1........................electronic......................elec
4.......................electronique....................elec

Vous aurrez remarquer que pour une ligne de la premiere base de donnee j'en fait 2 dans la deuxieme(ce qui me pose un probleme avec ''ON DUPLICATE KEY'' la colonne a verifier serait code_groupe VS categories_description.
 
WRInaute accro
Code:
create table destination (language_id integer,categories_description text, categories_name text,primary key(language_id,categories_description));

insert into destination (language_id,categories_description, categories_name) select 1,descri_e,code_groupe from source where num_groupe='03' and is_on_site=1 on duplicate key update categories_name=descri_e;
insert into destination (language_id,categories_description, categories_name) select 4,descrip,code_groupe from source where num_groupe='03' and is_on_site=1 on duplicate key update categories_name=descrip;

Ou pas très loin en tous cas...

Jacques.
 
WRInaute impliqué
euhhhh, je sais pas si j'ai bien compris alors choppe les infos qui t'interessent dans ce que je dis :lol:

Déjà avant toute chose sauvegarde bien tes bases avant d'y toucher pour etre sur de pouvoir revenir en arrière.

Donc maintenant tu peux faire un index sur 2 colonnes. Par exemple créé une table : table1(champ1,champ2,champ3)
tu lui applique un index 'unique' (que j'ai appelé LINDEX ci-dessous) sur champ1 et champ2

Code:
CREATE TABLE IF NOT EXISTS `table1` (
  `CHAMP1` tinytext NOT NULL,
  `CHAMP2` tinytext NOT NULL,
  `CHAMP3` tinytext NOT NULL,
  UNIQUE KEY `LINDEX` (`CHAMP1`(10),`CHAMP2`(10))
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Ensuite tu entres les valeurs suivantes :
('a','a','')
('a','b','')
('b','a','')
('b','b','')
('b','c','')

Code:
INSERT INTO `table1` (`CHAMP1`, `CHAMP2`, `CHAMP3`) VALUES
('a', 'a', ''),
('a', 'b', ''),
('b', 'a', ''),
('b', 'b', ''),
('b', 'c', '');

en fait avec cet exemple tu vois que dans champ1 tu peux réutiliser autant de fois que tu veux la meme valeur du moment quand champ2 est différent des autres valeurs. Comme je t'ai dis je sais pas trop si c'est ce que tu veux mais c'est ce que j'en ai compris :mrgreen:

Ensuite j'ai cru voir que tu faisais un SELECT pour voir si la valeur existait ou pas dans ta base, puis un INSERT OU UPDATE suivant les cas. Bin là t'auras juste a faire un INSERT et grâce au ON DUPLICATE c'est mysql qui va se charger de verifier si la combinaison est bien unique, et si la combinaison CHAMP1+CHAMP2 existe déjà alors ca fera l'UPDATE au lieu de l'INSERT

[edit] AAAHHH attends je viens de relire ton message et a priori t'utilises 2 bdd differentes... ok bin ca va pas fonctionner alors :?
Bon bin tant pis dsl :lol:
 
WRInaute discret
jcaron a dit:
Code:
create table destination (language_id integer,categories_description text, categories_name text,primary key(language_id,categories_description));

insert into destination (language_id,categories_description, categories_name) select 1,descri_e,code_groupe from source where num_groupe='03' and is_on_site=1 on duplicate key update categories_name=descri_e;
insert into destination (language_id,categories_description, categories_name) select 4,descrip,code_groupe from source where num_groupe='03' and is_on_site=1 on duplicate key update categories_name=descrip;

Ou pas très loin en tous cas...

Jacques.
Non ca ne fonctionne pas...si je la mets primary key je suis incapple de rentrer ma 2e ligne qui doit avoir le meme code.
Il doit bien y avoir une facon d'utiliser une fontion while a l'interieur d'une autre...
 
WRInaute discret
Bon j'ai decider de modifier mon code et d'jouter des echo dans mon code pour voir ce qui ce passe comme ca....
Code:
if ($num_groupe != 03) {
echo"refuse car num_groupe egal pas 3<br>";
	} elseif ($is_on_site != 1) {
	 echo"refuse car is_on_site egal pas 1<br>";
	} elseif ($count==0) {
echo"cest un inserte<br>";
mysql_query("INSERT INTO cybersp1_kheopsosc.categories_description (language_id, categories_name, categories_description ) VALUES ('1', '$descrip_e', '$code_groupe')");
mysql_query("INSERT INTO cybersp1_kheopsosc.categories_description (language_id, categories_name, categories_description ) VALUES ('4', '$descrip', '$code_groupe')");
	} else {
echo"cest un updates<br>";
mysql_query("UPDATE cybersp1_kheopsosc.categories_description SET categories_name='$descrip_e'  WHERE categories_description = '$code_groupe' AND language_id = '1'");
mysql_query("UPDATE cybersp1_kheopsosc.categories_description SET categories_name='$descrip'  WHERE categories_description = '$code_groupe' AND language_id = '4'");
}

Voici ce que ca donne:(du moins une partie)
Code:
refuse car num_groupe egal pas 3
refuse car num_groupe egal pas 3
refuse car num_groupe egal pas 3
refuse car num_groupe egal pas 3
refuse car num_groupe egal pas 3
cest un inserte
cest un inserte
refuse car is_on_site egal pas 1
cest un inserte
cest un inserte
cest un inserte
cest un inserte
cest un inserte
cest un inserte
refuse car is_on_site egal pas 1
cest un inserte
cest un inserte
refuse car is_on_site egal pas 1
cest un inserte
refuse car is_on_site egal pas 1
cest un inserte
refuse car is_on_site egal pas 1
cest un inserte
cest un inserte
cest un inserte
cest un inserte
cest un inserte
refuse car is_on_site egal pas 1
refuse car is_on_site egal pas 1

Donc ma fonction while semble marcher mais il continue de seulement inserer une ligne... :?
 
WRInaute discret
Et bien j'ai finalement trouver pourquoi cea ne fonctionnait pas...mon code etait bon...c'est ma 2e base de donne qui avait la colonne categories_id en "unique" et la fonction auto_increment pas activé et donc il refusait de les ajouter car il avait la meme valeurs nul que les autres...merci a tous pour votre aide...
 
Discussions similaires
Haut