Eviter une entré en doucble en bdd via un script

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 : Eviter une entré en doucble en bdd via un script

Re: Eviter une entré en doucble en bdd via un script

par yoann38 » 24 sept. 2015, 21:16

// Récupération des données en fonction du tagname du XML
	$number = addslashes($item->number);
    $titre = addslashes($item->name);

// .....

$adresse_nouvelle = mysql_query("SELECT id_table FROM table WHERE number = ".$number."");

	
	$resultat = mysql_query ($adresse_nouvelle);
    $nombre_adresse = mysql_num_rows($resultat);
    if($nombre_adresse < 1)
    {
		
	// Pseudo libre
	 $sql = "INSERT INTO `table` (id_simply_user,titre,price,photo,url_fnac,date_debut_sortie,horaire_debut,date_fin_sortie,horaire_fin,description,street,postcode,city,id_region,id_departements,id_type_loisirs,number,valide) VALUES ('$id_simply_user','$titre','$price','$photo','$url_fnac','$date_debut_sortie', '$heureDebut', '$date_fin_sortie', '$heurefin', '$description','$street','$pieces[0]','$pieces[1]','$region','$departement','$id_type_loisirs','$number','$valide')";
  $req = mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());
  echo 'Insertion en bdd';
	
	
	}else{
		echo "déjà existant";
	}
	
	}
	
?>
J'ai corrigé justement j'avais oublié de supprimer un truc, tous s'insère bien le problème c'est qu'il ne vérifier pas en bdd le champ number si celui existe déjà ....

PS: Il y a 30.000 entrée dans ce fichier XML

Re: Eviter une entré en doucble en bdd via un script

par Elie » 24 sept. 2015, 21:11

if(mysql_num_rows($result) == 1){

$result n'existe plus ...

Déjà, je te conseille de garder tous les number dans un array() si possible.
Plutot que de repeter la requete SELECT a chaque fois ...
Comme ca tu fais un if(!in_array()) { Je fais l'insert }

Re: Eviter une entré en doucble en bdd via un script

par Elie » 24 sept. 2015, 17:23

Euh, je suis le seul a être choqué par des virgues dans un WHERE ?
$result = mysql_query("SELECT id_loisirs FROM loisirs WHERE titre = ".$titre." AND city = ".$pieces[2]." AND postcode = ".$pieces[1]." AND  date_debut_sortie = ".$dateDebut." AND date_fin_sortie = ".$dateFin);
Je serais toi, je ferais un chaine de caractère dans un champ en plus que et ne comparer que ce champ.

Exemple champ "recherche" = titre-ville-postcode-debut-fin Et tu compares ca.

Re: Eviter une entré en doucble en bdd via un script

par or 1 » 23 sept. 2015, 23:36

tu affiches la requete sql générée, tu l'exécutes dans phpmyadmin et tu cherches à comprendre ce qu'il faut modifier pour que cela ne retourne qu'un seul résultat.

Re: Eviter une entré en doucble en bdd via un script

par yoann38 » 23 sept. 2015, 23:22

Alors je ne vois plus trop quoi faire la, ça marche pas .....
// description
		$description = addslashes($desc_genre);
	
	$result = mysql_query("SELECT id_loisirs FROM loisirs WHERE titre = ".$titre.", city = ".$pieces[2].", postcode = ".$pieces[1].", date_debut_sortie = ".$dateDebut.", date_fin_sortie = ".$dateFin."");
	if(mysql_num_rows($result) == 1){
	
	 if (in_array($titre,  $result)) {
    echo "Déja enregistré";
  }

	}else{
		
	// Pseudo libre
	 $sql = "INSERT INTO `loisirs` (id_simply_user,titre,price,photo,url_fnac,date_debut_sortie,horaire_debut,date_fin_sortie,horaire_fin,description,street,postcode,city,id_region,id_departements,id_type_loisirs,valide) VALUES ('$id_simply_user','$titre','$price','$photo','$url_fnac','$date_debut_sortie', '$heureDebut', '$date_fin_sortie', '$heurefin', '$description','$street','$pieces[0]','$pieces[1]','$region','$departement','$id_type_loisirs','$valide')";
  $req = mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());
  echo 'Insertion en bdd';
	}
	}
?>

Re: Eviter une entré en doucble en bdd via un script

par hyflender » 23 sept. 2015, 14:03

Code : Tout sélectionner

if (in_array($titre, $id_simply_user,$pieces[2],$pieces[1],$dateDebut,$dateFin)) { echo "Déja enregistré"; }
Tu n'as pas mis dans quel tableau chercher : $result

Essaye juste ça :

Code : Tout sélectionner

if (in_array($titre, $result)) { echo "Déja enregistré"; }

Re: Eviter une entré en doucble en bdd via un script

par yoann38 » 23 sept. 2015, 07:15

Ca ne change pas grand chose :/

foreach (explode(' ; ', /*(string)*/ $item->merchantCategoryPath) as $subtype) {
  $id_type_table = $type[$subtype];
  
  }  
  
// bla bla

    // description
    $description = addslashes($desc_genre);
  
$result = mysql_query("SELECT id_loisirs FROM loisirs WHERE titre = ".$titre.", city = ".$pieces[2].", postcode = ".$pieces[1].", date_debut_sortie = ".$dateDebut.", date_fin_sortie = ".$dateFin."");
	if(mysql_num_rows($result) == 1){
	
	if (in_array($titre, $id_simply_user,$pieces[2],$pieces[1],$dateDebut,$dateFin)) {
		echo "Déja enregistré";
	}

	}else{
    
  // Pseudo libre
   $sql = "INSERT INTO `table` (id_simply_user,titre,price,photo,url_fnac,date_debut_sortie,horaire_debut,date_fin_sortie,horaire_fin,description,street,postcode,city,id_region,id_departements,id_type_table,valide) VALUES ('$id_simply_user','$titre','$price','$photo','$url_fnac','$date_debut_sortie', '$heureDebut', '$date_fin_sortie', '$heurefin', '$description','$street','$pieces[0]','$pieces[1]','$region','$departement','$id_type_table','$valide')";
  $req = mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());
  echo 'Insertion en bdd';
  }
  }
?>

Re: Eviter une entré en doucble en bdd via un script

par hyflender » 22 sept. 2015, 23:20

Rajoute une condition :

Code : Tout sélectionner

$result = $pdo->execute('SELECT id_table FROM table'); $user = $result->fetch(); if (in_array($titre, $user)) { echo "Déja enregistré"; }
Pas sur que ça marche XD

PS : in_array() est sensible à la casse.

Re: Eviter une entré en doucble en bdd via un script

par yoann38 » 22 sept. 2015, 23:07

En fait meme si l'entrée existe déjà en bdd ca me l'insert de nouveau du coup....
Je cherche du coup à éviter ces fameux doublons :/

Re: Eviter une entré en doucble en bdd via un script

par or 1 » 22 sept. 2015, 22:40

quelle est la question ? car le principe est correct.

Eviter une entré en doucble en bdd via un script

par yoann38 » 22 sept. 2015, 21:12

Salut à tous.
Je travaille sur un fichier XML tout marche très bien.
J'essaie juste de modifier mon script poutr faire en sorte que si l'entrée du xml est déjà existante en bdd alors ne pas l'inserée.
En gros: Si tous les champs si identique alors ne pas insérer l'entrée.
je vous met que l'essentiel du code ;)
// bla bla
                     // Cinéma
                         'FIL|Film' => 18, 'ACI|Abonnement/Pass cinéma' => 18, 'ACT|Action' => 18, 'ANI|Animation' => 18, 'ARM|Arts martiaux' => 18, 'AVE|Aventure' => 18, 'AVP|Avant-première' => 18, 'BIO|Biopic' => 18, 'BOL|Bollywood' => 18, 'CIC|Ciné-concert' => 18,
                         'CIE|Cinéma jeune public' => 18, 'CLA|Classique' => 18, 'COD|Comédie dramatique' => 18, 'COM|Comédie' => 18, 'DEA|Dessin animé' => 18, 'DIV|Divers' => 18, 'DOC|Documentaire' => 18, 'DRA|Drame' => 18, 'EPO|Epouvante-horreur' => 18, 'ERO|Erotique' => 18,
                         'ESP|Espionnage' => 18, 'FAN|Fantastique ' => 18, 'FCE|Comédie érotique' => 18, 'FFA|Famille' => 18, 'GUE|Guerre' => 18, 'HIS|Historique' => 18, 'JUD|Judiciaire' => 18, 'MED|Médical' => 18, 'MOB|Mobisode' => 18, 'MUS|Musical' => 18,
                         'NUI|Nuit à thème (cinéma)' => 18, 'PEP|Péplum' => 18,  'POL|Policier' => 18, 'ROM|Romance' => 18, 'SCF|Science fiction' => 18, 'SOA|Soap' => 18, 'THR|Thriller' => 18,
                         'WEB|Web série' => 18, 'WES|Western' => 18, '131F|Cinéma' => 18,  '13CI|Cinéma' => 18, 'ROC|Retransmission Opéra/Concert ;' => 18, 'ROC|Retransmission Opéra/Concert;' => 18, '81F|Cinéma' => 18, '8CI|Cinéma' => 18,
                        );
 
     
	
	                       
    // On entre les entrees en bdd 
	function multiexplode ($delimiters,$string) {
   
    $ready = str_replace($delimiters, $delimiters[0], $string);
    $launch = explode($delimiters[0], $ready);
    return  $launch;
	}                
    foreach ($flux->product as $item) {
		

    // Récupération des données en fonction du tagname du XML
    $titre = addslashes($item->name);
    $price = $item->price;
    $url_fnac = $item->deepLink;
	$date_debut_sortie = $item->validFrom;
    $date_fin_sortie = $item->validTo;
    $street = addslashes($item->terms);
    $photo = $item->largeImage;
    $genre = $item->merchantCategoryPath;
	
	
      // Code postal
      $postcode  = addslashes($item->extra2);
      $pieces = explode(" | ", $postcode);
	
	  // on parcourt le tag longDescription du XML
	  $longDescription = addslashes($item->longDescription);
	  $decoupe = multiexplode(array("|"," ","|"," "),$longDescription);
	  
	  // Début événement
	  $dateDebut = $decoupe[0];
	  $heureDebut = $decoupe[1];
	  $dateFin = $decoupe[2];
	  $heurefin = $decoupe[3];
	  
	  
	    //conversion de la date debut du format fr(jj:mm:aaaa hh:mm:ss) en format us(aaaa-mm-jj hh:mm:ss)
	  $dateDebut = date_create_from_format('d/m/Y',$dateDebut);
	  $dateDebut = date_format($dateDebut, 'Y-m-d');
	  
	  
	  // si il n y a pas de date de fin alors je lui attribue la date de début
	  
	  
	   if (empty($date_debut_sortie)) {
	  $date_debut_sortie = $dateDebut;
	  } else {
	  $decoupe[1] = $dateDebut; 
	  }
	  
	  
	  // si il n y a pas d'heure de fin alors je lui attribue la date de début
	  if (!isset($decoupe[1])) {
	  $heureDebut = NULL;
	  } else {
	  $decoupe[1] = $heureDebut; 
	  }
	  
	   if (empty($date_fin_sortie)) {
	  $date_fin_sortie = $date_debut_sortie;
	  } else {
	  $decoupe[2] = $dateFin; 
	  }

	  // si il n y a pas de date de fin alors je lui attribue la date de début
	  if (!isset($decoupe[2])) {
	  $dateFin = $dateDebut;
	  } else {
	  $decoupe[2] = $dateFin; 
	  }
	  
	   if (empty($date_fin_sortie)) {
	  $date_fin_sortie = $date_debut_sortie;
	  } else {
	  $decoupe[2] = $dateDebut; 
	  }
	  
	  // si il n y a pas d'heure de fin alors je lui attribue l'heure de début
	  if (!isset($decoupe[3])) {
	  $heurefin = $heureDebut;
	  } else {
	  $decoupe[3] = $heurefin; 
	  }
	  
	




	
    // On attribut le département en fonction des 2 premiers chiffre du code postal
    $departement = substr($postcode, 0, 2);
     
    $region = regionIdByDepartement($departement);
     
    // Attribution de la valeur id 1010 pour la fnac
    $id_simply_user = '999';
     
    // On valide la sortie par default
    $valide = '1';
	
	

	foreach (explode(' ; ', /*(string)*/ $item->merchantCategoryPath) as $subtype) {
	$id_type_table = $type[$subtype];
	
	}  
	
// bla bla

		// description
		$description = addslashes($desc_genre);
	
	$result = mysql_query("SELECT id_table FROM table WHERE titre = ".$titre.", city = ".$pieces[2].", postcode = ".$pieces[1].", date_debut_sortie = ".$dateDebut.", date_fin_sortie = ".$dateFin."");
	if(mysql_num_rows($result) == 1){
		
	//Entrée déjà existante
	echo 'Cette entrée existe déjà';
	
	}else{
		
	// Pseudo libre
	 $sql = "INSERT INTO `table` (id_simply_user,titre,price,photo,url_fnac,date_debut_sortie,horaire_debut,date_fin_sortie,horaire_fin,description,street,postcode,city,id_region,id_departements,id_type_table,valide) VALUES ('$id_simply_user','$titre','$price','$photo','$url_fnac','$date_debut_sortie', '$heureDebut', '$date_fin_sortie', '$heurefin', '$description','$street','$pieces[0]','$pieces[1]','$region','$departement','$id_type_table','$valide')";
  $req = mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());
  echo 'Insertion en bdd';
	}
	}
?>
Ps: Je suis obligé de passé par l'ancienne syntaxe