[RESOLU] BDD double entrée

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] BDD double entrée

Re: [RESOLU] BDD double entrée

par Mysve » 09 févr. 2021, 13:31

Salut !
J'ai travaillé sur un code (ci-dessous)
<?php
  session_start();
   $servername = "";
$username = "";
$password = '';
$dbname = "";
$conn = new mysqli($servername, $username, $password, $dbname);
$page = "https://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
$user = $_SESSION["username"];
 
     
 //les connexions
   try
   {
       $bdd = new PDO('mysql:host=tout la connexion');
   $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
   }
   catch(Exception $e)
   {
           die('Erreur : '.$e->getMessage());
   }
    
   $reponse = $bdd->prepare("SELECT company_token FROM web_pages WHERE page_url = '$page'"); //ici je fais une manip pour récupérerle token qui sert d'identifier l'entreprise de façon crypter
   $reponse->execute();
   while ($donnees = $reponse->fetch())
   {
       
  $company_token = $donnees['company_token'];
   }
    
   $reponse->closeCursor();
 
   //--------------------------------------------------
      
      $sql = "INSERT INTO Proxima (page, user, company_token) VALUES ('$page', '$user', '$company_token ')"; //j'insère le pack dans la base de donnée
       
      if ($conn->query($sql) === TRUE) {
        echo "New record created successfully";
      } else {
        echo "Error: " . $sql . "<br>" . $conn->error;
      }
$conn->close();
 
 
//affichage

Je rencontre cependant un problème : j'aimerais que ce soit insérer une seule fois et je n'ai pas envie que il y ait 20.000 vues à cause du même utilisateur.

Je me suis demandé comment faire et j'ai travaillé sur un if else mais je n'ai aucune idée de quoi mettre dans les paranthèses du if
Et au passage merci beaucoup j'ai réussi à faire le système d'historique et tout il ne me manque plus qu'à compter qu'une seule fois une vue ;-)
Merci par avance

Re: BDD double entrée

par Mysve » 28 janv. 2021, 16:51

Merci beaucoup, je vais travailler sur ça !

Re: BDD double entrée

par Ryle » 28 janv. 2021, 15:23

Ça ne devrait pas dans la mesure où ta table ne contiendra que des identifiants (de la page et de l'utilisateur) et que tes recherches seront ciblés.

Une requête du type " SELECT COUNT(*) FROM la_table WHERE id_user = X AND id_page = Y " est suffisante pour savoir si l'enregistrement existe et ne retourne aucune donnée, elle s'exécutera donc très facilement et rapidement. Ça sera peut être un peu plus long si tu veux récupérer la liste des pages déjà vues par un utilisateur (pour les identifier ou au contraire identifier celles qu'il n'aurait pas encore vues), mais ça devrait se compter en fractions de secondes.

Si vraiment tu as un doute sur les performances de ta base de données, tu peux facilement faire un script qui va insérer un million d'enregistrements dans une table de ce type avec des valeurs aléatoires et voir comment elle se comporte quand tu l'interroges :)

Re: BDD double entrée

par Mysve » 28 janv. 2021, 14:21

Merci , c'est intelligent
Est ce que ça sera trop dur à exploiter niveau CPU (avoir un temps long de réponse) si j'ai plus de 100k lignes voir plusieurs millions

Re: BDD double entrée

par Ryle » 28 janv. 2021, 13:30

En fait tu n'as besoin que d'une seule table qui contiendra 2 colonnes : la page consultée et l'utilisateur qui l'a consulté.

A chaque fois qu'un utilisateur consulte une page, tu ajoutes une ligne dans cette table pour dire que l'utilisateur N1 a vu la page 1.

Pour reprendre ton exemple ci-dessus, cela se traduirait par :
PAGE_VUE | UTILISATEUR
Page01   | User N1
Page02   | User N1
Page02   | User N2
Il te suffit ensuite d'interroger cette même table pour connaître toutes les pages que l'utilisateur a déjà consulté (N1 a consulté la page 1 et la page 2 et N2 a consulté la page 2). Tu peux aussi vérifier facilement si un utilisateur a consulté une page en particulier : si tu trouves un enregistrement P2 / N2, c'est que l'utilisateur N2 a déjà vu la page P2, si en revanche tu ne trouves pas cette ligne, c'est qu'il ne l'a jamais consultée et tu peux le lui indiquer :)

L'avantage, c'est que tu n'a pas besoin de modifier la structure de la table quand une nouvelle page est créée, il suffit juste d'insérer une ligne quand elle est consultée.

Re: BDD double entrée

par Mysve » 27 janv. 2021, 22:02

Le problème étant que je ne peux pas générer des tables à l'infini (limite de mon hebergeur = 100)
Est il possible de tout regrouper ainsi ?
----------------------------------- Page 1 ------------------------------------- Page 2
User N1 ------------------------------1-------------------------------------------1
User N2------------------------------ 0----------------------------------------------1

1 étant pour vu 0 pour non vu et des collonnes s'ajouterait automatiquement suite à un blogueur qui ajoute une page sur un formulaire et des lignes pour les utilisateurs

Merci pour ta réponse évidemment c'est très gentil

Re: BDD double entrée

par Ryle » 27 janv. 2021, 11:50

Ok, donc en fait tu as besoin d'une table en base de données, dans laquelle tu vas lister les pages de ton site lorsqu'elle sont consultées par un utilisateur, une page pouvant être vue 0 ou N fois par un utilisateur et un utilisateur pouvant consulter 0 à N pages.

Il te suffit donc d'une table contenant l'identifiant de ta page (son nom ou autre), et l'identifiant de ton utilisateur. Quand il visite une page pour la première fois (c'est à dire qu'il n'existe pas encore de couple page/utilisateur correspondant) dans cette table, tu ajoutes le couple et le tour est joué :)

Re: BDD double entrée

par Mysve » 26 janv. 2021, 20:20

Dans le but d'enregistrer dans si un utilisateur à vue une page j'ai besoin d'avoir d'un coté les utilisateurs de l'autre les pages web et faire une relation 0;1

Re: BDD double entrée

par Ryle » 26 janv. 2021, 20:09

Hello !

J'ai malheureusement bien peur de rien comprendre à ce que tu veux faire :(
Peux-tu donner plus de détails, ou l'illustrer éventuellement ?

BDD double entrée

par Mysve » 26 janv. 2021, 18:34

Bonjour,
Je voudrais faire un système d'historique pour les utilisateurs de mon site mais il y a bcp de pages et je voulais savoir comment faire pour que avoir des doubles entrées d'un cote users et de l'autre page