Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Insertion dans plusieurs tables

9 réponses
Avatar
ADB
Bonsoir,
Je suis toujours avec mon pb d'insertion, désolé.
J'ai concocté le code suivant, qui doit me permettre d'insérer un
enregistrement s'il n'existait pas auparavant, ou de mettre à jour la
table si l'enregistrement correspondant existait.
J'ai donc cela:

include("database2.php3"); // Fonctions d\"accès à la base de données

$id_connex2=ouvrir_base2();
$requete="SELECT * FROM wa_abonnes WHERE abo_email='$email' ";
echo"<br><br><br>$requete";
//envoi de la requête
$id_result=mysql_query($requete, $id_connex2);

if(!$id_result)
{
$date=time();
$req1="update a1.wa_abonnes set abo_email='$email',
abo_register_date='$date' ";
echo"<br><br><br>$req1<br>";
$req2="update a1.wa_abo_liste set abo_id=wa_abonnes.abo_id,
liste_id='1', format='2' ";
echo"$req2";
}
else {
$date=time();
$req1="insert into a1.wa_abonnes set abo_email='$email',
abo_register_date='$date' ";
$id_result=mysql_query($req1, $id_connex2);
echo"<br><br><br>$req1<br>";
$req2="SELECT * FROM wa_abonnes WHERE abo_email='$email' ";
$id_resultx=mysql_query($req2, $id_connex2);
while($table=
mysql_fetch_array($id_resultx, MYSQL_ASSOC))
{
$req3="insert into a1.wa_abo_liste set abo_id='$table[abo_id]',
liste_id='1', format='2' ";
echo"$req2<br>$req3";
}
}

Actuellement, l'enregistrement n'existe pas et je fais bien un premier
insert dans a1.wa_abonnes.
En revanche, je n'ai pas d'insert dans a1.wa_abo_liste
Je ne comprends pas pourquoi.
Merci de bien vouloir m'éclairer.
ADB

9 réponses

Avatar
Antoine Dinimant
Actuellement, l'enregistrement n'existe pas et je fais bien un premier
insert dans a1.wa_abonnes.
En revanche, je n'ai pas d'insert dans a1.wa_abo_liste
Je ne comprends pas pourquoi.
Merci de bien vouloir m'éclairer.
ADB



sur le fond, je ne comprends pas gd-chose à ton modèle de données. Pour
ton pb d'insertion global, je ne comprends tj pas pourquoi tu ne fais
pas tout simplement

INSERT INTO wa_abo_liste (abo_id, liste_id, format)
SELECT wa_abonnes.abo_id, 1, 2 FROM wa_abonnes

ainsi qu'il t'a été sugéré, mais tu dois avoir tes raisons.

Ceci dit, sur ta construction PHP/MySQL, je relève pas mal des trucs qui
me semblent bizarre (toujours sans rien comprendre à tes données ;-)) :

- ta structure est if (pas trouvé) UPDATE else INSERT... ça ne devrait
pas être le contraire ?
Généralement parlant, on utilise if (! truc) tout court, ou if (truc)
... else, mais écrire if (! truc) ... else, même si c'est correct
syntaxiquement, c'est vraiment chercher à attirer les ennuis.

- dans la première branche de ton if, tu écris $req1=... et $req2=...,
puis tu envoies $req1 et $req2 en echo, mais il n'y a pas de mysql_query...

- de même dans la seconde branche (else), tu envoies effectivement $req1
et $req2 en mysql_query, mais tu as un $req3 dans une boucle qui n'est
pas envoyé à la BDD.

- juste pour chipoter, tu pourrais mettre ton $date=time(); avant le if
plutôt que de le répéter dans chaque branche

- en MySQL, il existe REPLACE, qui se comporte comme INSERT s'il s'agit
d'un nouvel enregistrement, et comme UPDATE si c'est un enreg déjà
existant... ça te permettrait peut-être de simplifier ton code ?

bon courage !

Antoun
Avatar
ADB
Bonjour,
Vi vi je sais, je suis pas toujours logique. Ou c'est une logique de
gaucher -))
En plus, la conception évolue en même temps que je pose les questions...
J'encombre, peut-être...


Antoine Dinimant wrote:


sur le fond, je ne comprends pas gd-chose à ton modèle de données. Pour
ton pb d'insertion global, je ne comprends tj pas pourquoi tu ne fais
pas tout simplement

INSERT INTO wa_abo_liste (abo_id, liste_id, format)
SELECT wa_abonnes.abo_id, 1, 2 FROM wa_abonnes




Parce que liste_id peut changer en fonction de l'adresse e-mail de
provenance (j'ai plusieurs listes et leur afectation dépend du mail,
grosso modo)


Ceci dit, sur ta construction PHP/MySQL, je relève pas mal des trucs qui
me semblent bizarre (toujours sans rien comprendre à tes données ;-)) :

- ta structure est if (pas trouvé) UPDATE else INSERT... ça ne devrait
pas être le contraire ?
Généralement parlant, on utilise if (! truc) tout court, ou if (truc)
... else, mais écrire if (! truc) ... else, même si c'est correct
syntaxiquement, c'est vraiment chercher à attirer les ennuis.



mon raisonnement est : si l'enregistrement est trouvé, donc nblignes >=1
(=> !=0), je fais quelque chose. S'il n'est pas trouvé, je fais autre
chose.
Pour moi, il me semble logique de commencer par ce qui est trouvable.
Quels ennuis puis-je m'attirer ?


- dans la première branche de ton if, tu écris $req1=... et $req2=...,
puis tu envoies $req1 et $req2 en echo, mais il n'y a pas de mysql_query...



Ces echos ne sont que pour le contrôle visuel de la syntaxe. Il ne
servent à rien d'autre.


- de même dans la seconde branche (else), tu envoies effectivement $req1
et $req2 en mysql_query, mais tu as un $req3 dans une boucle qui n'est
pas envoyé à la BDD.



idem


- juste pour chipoter, tu pourrais mettre ton $date=time(); avant le if
plutôt que de le répéter dans chaque branche



Tu as raison. Fait.


- en MySQL, il existe REPLACE, qui se comporte comme INSERT s'il s'agit
d'un nouvel enregistrement, et comme UPDATE si c'est un enreg déjà
existant... ça te permettrait peut-être de simplifier ton code ?



Mais j'ai cru comprendre que les paramètres étaient différents. J'ai
peut-être pas les bons bouquins, mais, pour moi :

REPLACE ne permet pas de clause Where, UPDATE si.
Donc j'ai un meilleur contrôle de ce que je fais.
Je ne savais pas que REPLACE remplaçait aussi INSERT. Pour moi, il me
semble logique que REPLACE soit pour Remplacer, INSERT pour insérer, et
UPDATE pour Mettre à jour.


bon courage !

Antoun




Merci. J'ai progressé encore, grâce à vou tous.
Merci
ADB
Avatar
Antoine Dinimant
sur le fond, je ne comprends pas gd-chose à ton modèle de données.
Pour ton pb d'insertion global, je ne comprends tj pas pourquoi tu ne
fais pas tout simplement

INSERT INTO wa_abo_liste (abo_id, liste_id, format)
SELECT wa_abonnes.abo_id, 1, 2 FROM wa_abonnes




Parce que liste_id peut changer en fonction de l'adresse e-mail de
provenance (j'ai plusieurs listes et leur afectation dépend du mail,
grosso modo)



dans ce cas, ne pourrais-tu pas intégrer dans un truc standard, soit
avec un CASE WHEN en SQL, soit en déterminant à l'avance ta liste_id en
PHP ?


- ta structure est if (pas trouvé) UPDATE else INSERT... ça ne devrait
pas être le contraire ?
Généralement parlant, on utilise if (! truc) tout court, ou if (truc)
... else, mais écrire if (! truc) ... else, même si c'est correct
syntaxiquement, c'est vraiment chercher à attirer les ennuis.




mon raisonnement est : si l'enregistrement est trouvé, donc nblignes >=1
(=> !=0), je fais quelque chose.



tout à fait. sauf que tu as écrit if (!$id_result),
càd if($id_result == 0)

S'il n'est pas trouvé, je fais autre
chose.

Pour moi, il me semble logique de commencer par ce qui est trouvable.



'bsolument. C'est ce que tu devrais faire, mais tu fais le contraire
(enfin, si j'ai bien compris)

Quels ennuis puis-je m'attirer ?



exactement ce qui est en train de t'arriver : quand on écrit un truc pas
logique, comme if (not truc) ... else ..., on rétablit machinalement la
logique à la relecture et on croit avoir écrit if (truc)... else ...
Avatar
Antoine Dinimant
mon raisonnement est : si l'enregistrement est trouvé, donc nblignes >=1
(=> !=0), je fais quelque chose. S'il n'est pas trouvé, je fais autre
chose.



je me suis laissé avoir dans mes deux premières réponses, mais en fait
le gros du dysfonctionnement est là :

$id_result=mysql_query($requete, $id_connex2);
if(!$id_result)

ton $id_result n'est pas le nb de lignes, mais simplement un identifiant
de ressource (un id résultat quoi ;-)), laquelle peut comprendre
n'importe quel nb de lignes, y compris zéro ! Cf la doc PHP :

"mysql_query() retourne TRUE ou FALSE, pour indiquer le succès ou
l'échec de la requête. En cas de retour TRUE, la requête était valide et
a pu être exécuté sur le serveur. Cela n'indique pas le nombre de ligne
affectées, ou retournées. Il est parfaitement possible qu'une requête
valide n'affecte aucune ligne ou ne retourne aucune ligne. "

autrement dit, $id_result est toujours vrai, et !$id_result toujours
faux, donc c'est toujours ton else qui est exécuté.

une construction fonctionnelle et lisible serait :

$id_result=mysql_query($requete, $id_connex2);
if(mysql_num_rows($id_result)) {
requêtes UPDATE
} else {
requêtes INSERT
}
Avatar
Antoine Dinimant
- dans la première branche de ton if, tu écris $req1=... et
$req2=..., puis tu envoies $req1 et $req2 en echo, mais il n'y a pas
de mysql_query...




Ces echos ne sont que pour le contrôle visuel de la syntaxe. Il ne
servent à rien d'autre.



OK, mais à quoi ça te sert de contrôler la syntaxe de requêtes que tu
n'exécutes pas ?
Avatar
ADB
Antoine Dinimant wrote:


- dans la première branche de ton if, tu écris $req1=... et
$req2=..., puis tu envoies $req1 et $req2 en echo, mais il n'y a pas
de mysql_query...





Ces echos ne sont que pour le contrôle visuel de la syntaxe. Il ne
servent à rien d'autre.




OK, mais à quoi ça te sert de contrôler la syntaxe de requêtes que tu
n'exécutes pas ?



Juste pour vérifier que les variables passent bien.
Tu sais, je me suis mis au php il y a un peu plus de 4 mois et je pige
pas toujours tout dans ce que je reprends à droite et à gauche (j'ai 50
ans).
C'est le cas avec le !id_result
Je l'ai repris de je ne sais plus où, il se retrouve dans plusieurs
bouts de prg et ça marche jusqu'à présent ailleurs. C pourquoi je me
suis pas posé la question.
Il me semble d'ailleurs que !id_result ne conditionne que le msg
d'erreur et rien d'autre :
$id_result=mysql_query($requete, $id_connex2);
if(!$id_result) {echo "Lecture impossible, erreur N°", mysql_errno(),
mysql_error(); }

Je vais essayer de transformer le truc.

Pour l'heure j'ai des pb avec des
Cannot redeclare ouvrir_base() (previously declared in
./pg_database.php3:7)
Si tu savais comme je me paume, parfois -)))

ADB
Avatar
Antoine Dinimant
Tu sais, je me suis mis au php il y a un peu plus de 4 mois et je pige
pas toujours tout dans ce que je reprends à droite et à gauche (j'ai 50
ans).



dans le pire des cas, il te reste encore une bonne quinzaine d'années
avant l'Alzheimer, donc mauvaise excuse ;-) (un peu comme la "logique de
gaucher")

C'est le cas avec le !id_result
Je l'ai repris de je ne sais plus où, il se retrouve dans plusieurs
bouts de prg et ça marche jusqu'à présent ailleurs.



ça ne devrait pas 8-)

C pourquoi je me
suis pas posé la question.



comme tu dis que tu débutes, et juste pour être sûr qu'on se comprenne
bien, je rappelle que ! veut dire "not". Donc if (! $toto) est
équivalent à if ($toto == FALSE), sachant que le FALSE peut être, outre
FALSE lui-même, 0, NULL, ou erreur (si tu veux faire un test exact,
c'est avec trois = : if ($toto === FALSE) ne marche qu'avec un vrai
FALSE et pas avec un 0 ou une erreur).

Il me semble d'ailleurs que !id_result ne conditionne que le msg
d'erreur et rien d'autre :
$id_result=mysql_query($requete, $id_connex2);
if(!$id_result) {echo "Lecture impossible, erreur N°", mysql_errno(),
mysql_error(); }



yep. C'est ce que je notais dans mon message de 18:04, où je citais la doc.

Je vais essayer de transformer le truc.



tu peux par ex. partir de ma suggestion du message sus-cité...

Pour l'heure j'ai des pb avec des
Cannot redeclare ouvrir_base() (previously declared in
./pg_database.php3:7)
Si tu savais comme je me paume, parfois -)))



je constate ;-)

si ça peut te rassurer, j'ai bcp pédalé au début avec PHP, et pourtant
j'avais deux décennies de moins !

Si je peux me permettre de te conseiller, reprendre des trucs de ci de
là, ça peut être pas mal pour commencer, mais à un moment ou un autre il
faut formaliser tout ça et se mettre à tout faire soi-même, le temps de
passer à la vitesse supérieure. L'expérience ainsi acquise te permettra
ensuite de mieux comprendre ce que tu récupères, de l'utiliser à
meilleur escient et, le cas échéant, de détecter les erreurs qui s'y
sont glissées...

Quelle expérience de programmation as-tu eu avant PHP ?
Avatar
ADB
Tu vas rire : BASIC sur ZX81 ! Tu devais pas être né !! -)))
Bon mine de rien, tout de même, je me démerde... en me faisant aider à
droite et à gauche pour des points de détail.
Evidemment, le problo, c'est le vocabulaire.
Mais les choses fonctionnent.
C'est peut-être pas beau non plus, mais je m'en fous.
Si tu veux voir, c'est à http://carnets.2presse.com
Si tu veux, Pour la partie "privée", login = (me contacter, on est en ng -))
Merci pour tout, en tous cas
ADB

Antoine Dinimant wrote:


Tu sais, je me suis mis au php il y a un peu plus de 4 mois et je
pige pas toujours tout dans ce que je reprends à droite et à gauche
(j'ai 50 ans).




dans le pire des cas, il te reste encore une bonne quinzaine d'années
avant l'Alzheimer, donc mauvaise excuse ;-) (un peu comme la "logique de
gaucher")

C'est le cas avec le !id_result
Je l'ai repris de je ne sais plus où, il se retrouve dans plusieurs
bouts de prg et ça marche jusqu'à présent ailleurs.




ça ne devrait pas 8-)

> C pourquoi je me

suis pas posé la question.




comme tu dis que tu débutes, et juste pour être sûr qu'on se comprenne
bien, je rappelle que ! veut dire "not". Donc if (! $toto) est
équivalent à if ($toto == FALSE), sachant que le FALSE peut être, outre
FALSE lui-même, 0, NULL, ou erreur (si tu veux faire un test exact,
c'est avec trois = : if ($toto === FALSE) ne marche qu'avec un vrai
FALSE et pas avec un 0 ou une erreur).

Il me semble d'ailleurs que !id_result ne conditionne que le msg
d'erreur et rien d'autre :
$id_result=mysql_query($requete, $id_connex2);
if(!$id_result) {echo "Lecture impossible, erreur N°", mysql_errno(),
mysql_error(); }




yep. C'est ce que je notais dans mon message de 18:04, où je citais la doc.

Je vais essayer de transformer le truc.




tu peux par ex. partir de ma suggestion du message sus-cité...

Pour l'heure j'ai des pb avec des
Cannot redeclare ouvrir_base() (previously declared in
./pg_database.php3:7)
Si tu savais comme je me paume, parfois -)))




je constate ;-)

si ça peut te rassurer, j'ai bcp pédalé au début avec PHP, et pourtant
j'avais deux décennies de moins !

Si je peux me permettre de te conseiller, reprendre des trucs de ci de
là, ça peut être pas mal pour commencer, mais à un moment ou un autre il
faut formaliser tout ça et se mettre à tout faire soi-même, le temps de
passer à la vitesse supérieure. L'expérience ainsi acquise te permettra
ensuite de mieux comprendre ce que tu récupères, de l'utiliser à
meilleur escient et, le cas échéant, de détecter les erreurs qui s'y
sont glissées...

Quelle expérience de programmation as-tu eu avant PHP ?

Avatar
Antoine Dinimant
ADB a écrit:
Tu vas rire : BASIC sur ZX81 ! Tu devais pas être né !! -)))



si... c'est même comme ça que j'ai commencé !

bon, moi qui venais du Basic comme toi, ce qui m'a posé le + de pb à
comprendre, c'est le côté "orienté expression"... qq exemples
commentés :

$a = $b = 5 ;
ça n'aurait aucun sens en Basic, mais en PHP ça marche sans pb. ça se
lit $a = ($b = 5), sachant que "$b = 5" est une expression qui a
elle-même une valeur, celle qui a été transmise à $b.

par comparaison, voir
$a = $b == 5 ;
ça ça serait possible en Basic ; c'est l'équivalent de
if ($b == 5) $a = TRUE else $a = FALSE ;
ce qui pourrait ausi s'écrire :
$a = $b == 5 ? TRUE : FALSE ;

bon, jusque-là, facile. Maintenant :
if ($a = $b) ;
"$a = $b" est bien une assignation ($a doit prendre la valeur de $b) et
non une comparaison ($a == $b, càd est-ce que les deux variables ont les
mêmes valeurs ?), mais c'est aussi une expression qui renvoie la valeur
de $b. Donc si $b est "vrai", le if sera exécuté, et si $b est "faux"
(0, FALSE, NULL, "" ou erreur) c'est le else (s'il existe) qui sera
exécuté. Autrement dit, c'est un raccourci pour :
$a = $b ;
if ($a) ...

C'est la construction du while($ligne = mysql_fetch_array($id_result))
{...}. mysql_fetch_array renvoie la ligne courante dans un tableau, donc
$ligne est vrai et la boucle fait un tour de plus. Quand
mysql_fetch_array arrive à la fin, elle renvoie FALSE; $ligne est alors
FALSE elle aussi, et la boucle s'arrête.

Bon mine de rien, tout de même, je me démerde... en me faisant aider à
droite et à gauche pour des points de détail.
Evidemment, le problo, c'est le vocabulaire.
Mais les choses fonctionnent.
C'est peut-être pas beau non plus, mais je m'en fous.
Si tu veux voir, c'est à http://carnets.2presse.com



tu vas rigoler, à l'origine je suis journaliste !

Si tu veux, Pour la partie "privée", login = (me contacter, on est en ng
-))
Merci pour tout, en tous cas



you welcome !