MYSQL : update et select en une seule requête

MYSQL : update et select en une seule requête - SQL/NoSQL - Programmation

Marsh Posté le 13-03-2020 à 09:32:05    

Bonjour,
 
Je voudrais faire une requete la plus optimisé possible qui enregistre l'ip du visiteur, augmente l'occurence de 1 si l'ip existe déjà, et aussi fait un select sur cette même occurence pour me permettre de traiter en PHP par la suite.
 
Donc j'ai déjà fait cela :
 

Citation :

INSERT INTO logs_ip(ip) VALUES('$ip_visiteur') ON DUPLICATE KEY UPDATE nombre = nombre + 1


 
En une seule requête j'enregistre l'ip et si l'ip existe déja je mets à jour la colonne nombre.
 
Je cherche le moyen en plus de cela de faire un select ( c'est a dire de connaitre la valeur de " nombre " de cette ip ) toujours en une seul requête, est-ce possible ?
 
https://tof.cx/images/2020/03/13/3decd702033ab3aa52fb6245ebdbe245.png


Message édité par Stellvia_fr le 13-03-2020 à 09:37:24
Reply

Marsh Posté le 13-03-2020 à 09:32:05   

Reply

Marsh Posté le 13-03-2020 à 16:34:48    

Non, pas à ma connaissance.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 13-03-2020 à 17:57:27    

Salut,
 
on devrait (j'ai partiellement testé) pouvoir détourner LAST_INSERT_ID comme suit :

Code :
  1. $bdd = new PDO(/* ... */);
  2. $stmt = $bdd->prepare('INSERT INTO logs_ip(ip) VALUES(?) ON DUPLICATE KEY UPDATE nombre = LAST_INSERT_ID(nombre + 1)');
  3. $stmt->execute([$_SERVER['REMOTE_ADDR']]);
  4. if ($stmt->rowCount() == 1) {
  5.    // c'était une insertion, nombre vaut donc 1 (la valeur mise en default sur la colonne nombre)
  6.    #$nombre = 1;
  7. } else /*if ($stmt->rowCount() == 2)*/ {
  8.    // c'était un UPDATE et nombre vaut $stmt->lastInsertId()
  9.    #$nombre = $stmt->lastInsertId();
  10. }


 
Avec un autre SGBD, on aurait la clause RETURNING.


Message édité par pluj le 13-03-2020 à 18:05:08
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed