Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1431 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  DELETE dans une boucle

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

DELETE dans une boucle

n°1283991
mikedimoi
Posté le 15-01-2006 à 15:13:45  profilanswer
 

Bonjour,  
 
J'ai ce script qui me permet de lister un repertoire et d'ajouter les entrées à ma table.
Tout fonctionne pour le mieux.
 
Néanmoins, il reste simplement un petit bémol.
Ce repertoire est mis à jour régulièrement. On y ajoute des fichiers et on en retire fréquemment.
Comment, dans la boucle, pourrai-je supprimer les fichiers qui n'existe plus ?
 
Voici mon script :

Code :
  1. <?
  2. if ($fichiers = glob('../../mon_repertoire/*.doc' , GLOB_NOSORT))
  3. {       
  4.       $sql = mysql_connect('****', '*****', '******');       
  5.      mysql_select_db('mabase', $sql);       
  6.      foreach ($fichiers as $fichier)  
  7.      
  8.      {
  9.  $fichier=substr($fichier, 27);           
  10.      $query = "INSERT INTO matable(id, nom) VALUES('','".$fichier."')";           
  11.      mysql_query($query , $sql);  
  12.    
  13.      }       
  14.      mysql_close($sql);}  
  15. ?>


 
Merci d'avance

mood
Publicité
Posté le 15-01-2006 à 15:13:45  profilanswer
 

n°1284036
Ricco
Retour au pays
Posté le 15-01-2006 à 17:16:03  profilanswer
 

Le mieux ça serait pê de passer obligatoirement par le php pour ajouter/effacer des fichers et mettre à jour la base en même.
 
Ici, le plus simple est pê de vider la table avant de la remplir avec les fichiers qui sont présents.


---------------
"L'informatique n'est pas plus la science des ordinateurs que l'astronomie n'est celle des télescopes." Michael R. Fellows & Ian Parberry
n°1284040
mikedimoi
Posté le 15-01-2006 à 17:23:18  profilanswer
 

C'est bien ce que je faisais auparavant mais il faudrait que je remette tous les commentaires pour chaque fichier ! Quand il y en a plus de 1000, c'est un peu de travail !

n°1284055
afbilou
pouet your life
Posté le 15-01-2006 à 17:40:13  profilanswer
 
n°1284056
afbilou
pouet your life
Posté le 15-01-2006 à 17:41:50  profilanswer
 

Et tu lis au moins l'exemple 1 de chaque fonction avant de venir dire que tu ne comprends pas comment ca marche.

n°1284076
mikedimoi
Posté le 15-01-2006 à 18:15:22  profilanswer
 

A force de batailler un peu partout, voici ce que j'ai réussi à faire :
J'ai fait une autre boucle de ma table. J'avais peur que ca soit un peu lourd. Je cherchais donc une solution à çà.
 
 
 

Code :
  1. $connect = mysql_connect('*****', '*****', '****');     
  2. mysql_select_db('mabase', $connect);
  3. $sql = "SELECT titre,id FROM matable";
  4. $result = mysql_query($sql);
  5. while (list($fichier, $id) = mysql_fetch_array($result)) {
  6.    if (!file_exists("../../monchemin/".$fichier)) {
  7.       $sql_update = "DELETE FROM matable WHERE id='".$id."'";
  8.       mysql_query($sql_update);
  9.    }
  10. }
  11. mysql_close($connect);
  12. ?>


 
Il y avait une autre solution mais je me rends compte en même temps que j'ai un autre probleme.
En ajoutant un nouveau champs quelconque à ma table, j'aurai pu le supprimer en fonction.
Le probleme est que je ne peux plus rien ajouter dans cette requête :

Code :
  1. $query = "INSERT INTO table(id, titre) VALUES('','".$fichier."')";


 
Si je fais, par exemple :

Code :
  1. $query = "INSERT INTO table(id,auteur, titre) VALUES('','moi','".$fichier."')";


 
moi ne sera pas ajouter !!!
 
Ca devient un peu complexe tout çà !

n°1284253
smaragdus
whores, drugs & J.S. Bach
Posté le 16-01-2006 à 00:25:46  profilanswer
 

Ca te rend quel type erreur au moment de l'insert ?
(y a pas de "or die mysql_error" etc... dans ton code)


Message édité par smaragdus le 16-01-2006 à 00:26:16
n°1284268
mikedimoi
Posté le 16-01-2006 à 07:34:21  profilanswer
 

Salut !
 
J'ai cette erreur :

Citation :

Erreur SQL !Resource id #2
Duplicate entry 'mon_fichier' for key 2


 
Le message disparait si je remplace INSERT par REPLACE.
J'ai rajouté la valeur Unique à id.
 
Cependant, ceci n'est pas une solution car il faudrait que je refasse tous les commentaires de mes fichiers.


Message édité par mikedimoi le 16-01-2006 à 07:44:32
n°1284272
mikedimoi
Posté le 16-01-2006 à 08:08:26  profilanswer
 

Je viens de modifier mon champs id pour UNSIGNED et BIGINT...toujours pareil !


Message édité par mikedimoi le 16-01-2006 à 08:16:53
n°1284277
smaragdus
whores, drugs & J.S. Bach
Posté le 16-01-2006 à 08:30:04  profilanswer
 

ok, peux tu mettre le script sql qui cree la table ?

mood
Publicité
Posté le 16-01-2006 à 08:30:04  profilanswer
 

n°1284278
mikedimoi
Posté le 16-01-2006 à 08:35:11  profilanswer
 

Je viens de trouver à l'instant même où je recois le mail pour ton post !
 
Il suffisait de changer le champs id de INT à tinyint.
 
Je savais bien que ca venait de la table !
 
Merci à tous

n°1284282
mikedimoi
Posté le 16-01-2006 à 08:47:35  profilanswer
 

Je vais trop vite moi !
En fait le probleme revient !!
Au lieu de me donner l'erreur :

Citation :

Erreur SQL !Resource id #2
Duplicate entry '****' for key 2

j'ai l'erreur

Citation :

Erreur SQL !Resource id #2
Duplicate entry '****' for key 3


 
Voici la structure :

Code :
  1. CREATE TABLE `download`.`bruekl` (
  2. `id` tinyint( 11 ) NOT NULL AUTO_INCREMENT ,
  3. `nom` varchar( 255 ) NOT NULL default '',
  4. `commentaire` varchar( 255 ) NOT NULL default '',
  5. PRIMARY KEY ( `id` ) ,
  6. UNIQUE KEY `id` ( `id` ) ,
  7. UNIQUE KEY `titre` ( `titre` )
  8. ) TYPE = MYISAM ;


 

n°1284379
omega2
Posté le 16-01-2006 à 12:16:57  profilanswer
 

replace utilise la clé primaire pour savoir quoi remplacé en cas de doublon.
Si tu lui donnes pas de valeur pour la clé primaire, alors ca sert strictement à rien de faireun "replace".
 
De plus si tu mets une colone en autoincrément, alors soit tu laisses la base de donnée gérer l'autoincrémentation et tu lui envoie aucune valeur pour cette colone, soit tu lui en précises une et l'autoincrémentation ne sera pas utilisé par la base de donnée.
 
Ceci dit, c'est quoi ta requette actuelle pour insérer les données?

n°1284418
smaragdus
whores, drugs & J.S. Bach
Posté le 16-01-2006 à 12:52:55  profilanswer
 

mikedimoi a écrit :


Citation :

Erreur SQL !Resource id #2
Duplicate entry '****' for key 2

j'ai l'erreur

Citation :

Erreur SQL !Resource id #2
Duplicate entry '****' for key 3


 
Voici la structure :

Code :
  1. CREATE TABLE `download`.`bruekl` (
  2. `id` tinyint( 11 ) NOT NULL AUTO_INCREMENT ,
  3. `nom` varchar( 255 ) NOT NULL default '',
  4. `commentaire` varchar( 255 ) NOT NULL default '',
  5. PRIMARY KEY ( `id` ) ,
  6. UNIQUE KEY `id` ( `id` ) ,
  7. UNIQUE KEY `titre` ( `titre` )
  8. ) TYPE = MYISAM ;



 
C'est normal que ça plante vu que tu as mis le titre en clé unique et que tu dois inserer 2 fois le même titre. Le message est suffisamment clair à ce propos "Duplicate entry"
 
Pourquoi tu fais "insert id values ('')" ? Ca sert à rien (c'est faux même, non ? mysql va pas essayer de mettre 0 ? flemme de tester)
 
Conclusion : Ouvrir un livre traitant de SQL ou de MySQL pour comprendre ce que tu copies-colles. La doc officielle est très bien pour ça.


Message édité par smaragdus le 16-01-2006 à 12:54:31
n°1284421
smaragdus
whores, drugs & J.S. Bach
Posté le 16-01-2006 à 12:58:02  profilanswer
 

Arf lol, j'avais pas vu un truc evident  :pt1cable:  
Question naïve à mikedimoi :  
 
Quel est le type de de la colonne 'titre' ?  :whistle:
 
edit : et le primay key + unique key sur 'id' c'est top  :pt1cable:  
 


Message édité par smaragdus le 16-01-2006 à 13:01:03
n°1284423
mikedimoi
Posté le 16-01-2006 à 13:04:07  profilanswer
 

VARCHAR(255), NotNull.

n°1284427
mikedimoi
Posté le 16-01-2006 à 13:05:48  profilanswer
 

J'ai enlevé le UNIQUE sur id. C'était simplement pur un test

n°1284431
mikedimoi
Posté le 16-01-2006 à 13:08:07  profilanswer
 

Ma requête :

Code :
  1. <? 
  2.    
  3.   if ($fichiers = glob('../../mon_chemin/*.doc' , GLOB_NOSORT))   
  4.    
  5.    {         
  6.         $sql = mysql_connect('*****', '****', '*****');         
  7.        mysql_select_db('mabase', $sql);         
  8.        foreach ($fichiers as $fichier)   
  9.          
  10.        {   
  11.        $fichier=substr($fichier, 27);             
  12.        $query = "INSERT INTO matable(titre) VALUES('".$fichier."')";             
  13.         mysql_query($query , $sql)or die('Erreur SQL !'.$sql.'<br>'.mysql_error());   
  14.      
  15.        
  16.        }         
  17.        mysql_close($sql);}   
  18.   ?>   
  19.    <? $connect = mysql_connect('*****', '****', '*****');         
  20.    mysql_select_db('mabase', $connect);   
  21.   $sql = "SELECT titre,id FROM matable";   
  22.    $result = mysql_query($sql);   
  23.   while (list($fichier, $id) = mysql_fetch_array($result)) {   
  24.      if (!file_exists("../../monchemin/".$fichier)) {   
  25.          $sql_update = "DELETE FROM matable WHERE id='".$id."'";   
  26.        mysql_query($sql_update);   
  27.      }   
  28.   }   
  29. mysql_close($connect);   
  30.   ?>   
  31.      
  32.    <?php   
  33.   mysql_connect('*****', '****', '*****');     
  34.   mysql_select_db("mabase" );   
  35.      
  36.      
  37.    $retour = mysql_query("SELECT COUNT(*) AS nbre_entrees FROM mabase" );   
  38.   $donnees = mysql_fetch_array($retour);   
  39.      
  40.    ?>


Message édité par mikedimoi le 16-01-2006 à 13:21:39
n°1284486
smaragdus
whores, drugs & J.S. Bach
Posté le 16-01-2006 à 14:01:02  profilanswer
 

mikedimoi a écrit :

VARCHAR(255), NotNull.


ah ok donc le script de la table que tu as posté plus haut était faux.  :whistle:

n°1284749
mikedimoi
Posté le 16-01-2006 à 17:10:10  profilanswer
 

Oui, désolé
 

Code :
  1. requête SQL : [Modifier] [Créer source PHP]
  2. CREATE TABLE `download`.`test` (
  3. `id` int( 11 ) NOT NULL AUTO_INCREMENT ,
  4. `titre` varchar( 255 ) NOT NULL default '',
  5. `url` varchar( 200 ) NOT NULL default '',
  6. `commentaire` varchar( 255 ) NOT NULL default '',
  7. PRIMARY KEY ( `id` )
  8. ) TYPE = MYISAM ;


Message édité par mikedimoi le 16-01-2006 à 17:12:07
n°1284792
mikedimoi
Posté le 16-01-2006 à 17:51:52  profilanswer
 

J'ai donc enlevé la valeur UNIQUE à TITRE et fait ce script avec une boucle qui vérifie les entrées.
 

Code :
  1. <?php //et non <?  
  2. //début du if  
  3. if ($fichiers = glob('../../monchemin/*.doc' , GLOB_NOSORT))  
  4. {  
  5. $sql = mysql_connect('l*****', '*****', '******');  
  6. mysql_select_db('mabase', $sql);  
  7. //début du foreach  
  8. foreach ($fichiers as $fichier)  
  9. {  
  10. $fichier=substr($fichier, 27);  
  11. //on recherche si $fichier existe dans ta table  
  12. $sql=mysql_query("SELECT COUNT(*) FROM matable WHERE titre='".$fichier."'" );  
  13. $data=mysql_fetch_array($sql);  
  14. //si le fichier existe déjà dans ta table, tu l'insères  
  15. if ($data[0]==0) {  
  16. $query = "INSERT INTO matable(id, titre) VALUES('','".$fichier."')";  
  17. //fin du if ($data[0]==0)  
  18. }  
  19. //fin du foreach  
  20. }  
  21. //vérification, une seule fois, des fichiers à détruire  
  22. //ta requête SELECT puis  
  23. while (list($titre, $id) = mysql_fetch_array($result)) {  
  24. if (!file_exists("../../monchemin/".$titre)) {  
  25. $sql_update = "DELETE FROM matble WHERE id='".$id."'";   
  26. mysql_query($sql_update,$query , $sql);   
  27. mysql_close($sql);  
  28. }  
  29. }   
  30. }   
  31. //le reste inchangé  
  32. //fin du if($fichiers = glob(etc))  
  33. ?>


 
Cependant, il me reste cette erreur :

Citation :

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in d:\mes sites web\accueil\film.php on line 39


 
J'ai toujours quelque chose qui coince !


Message édité par mikedimoi le 16-01-2006 à 19:17:51
n°1284799
omega2
Posté le 16-01-2006 à 17:57:12  profilanswer
 

Ca serait peut être bien une bonne idée que de vérifier que la requette à bien marché et qu'elle retourne des données. Evidement, comme tu vérifie pas, t'as une alerte quand ca marche pas ou que ca retourne rien.
 
Je te laisse chercher dans la doc comment corriger ce probléme.

n°1284836
mikedimoi
Posté le 16-01-2006 à 18:27:33  profilanswer
 

Sache que ca fait plusieurs fois que je la potasse !
 
Si je rajoute une ligne pour les erreurs mysql, j'ai toujours la meme chose.

n°1284840
omega2
Posté le 16-01-2006 à 18:33:17  profilanswer
 

Et t'as regardé aussi les exemples?

Code :
  1. <?php
  2. $result = mysql_query('SELECT * WHERE 1=1');
  3. if (!$result) {
  4.     die('Requête invalide : ' . mysql_error());
  5. }
  6. ?>


Dans ton code à toi, elle est où cette vérification?

n°1284861
mikedimoi
Posté le 16-01-2006 à 18:59:47  profilanswer
 

Oui et j'ai toujours la meme erreur !

n°1284935
Ricco
Retour au pays
Posté le 16-01-2006 à 20:10:24  profilanswer
 

Elle est où cette ligne 39 ??


---------------
"L'informatique n'est pas plus la science des ordinateurs que l'astronomie n'est celle des télescopes." Michael R. Fellows & Ian Parberry
n°1284942
mikedimoi
Posté le 16-01-2006 à 20:12:38  profilanswer
 

Celle-ci :

Code :
  1. while (list($titre, $id) = mysql_fetch_array($result)) {

n°1284966
smaragdus
whores, drugs & J.S. Bach
Posté le 16-01-2006 à 20:46:11  profilanswer
 

mikedimoi a écrit :

Celle-ci :

Code :
  1. while (list($titre, $id) = mysql_fetch_array($result)) {



 
Puisque tu n'écoutes pas ce qu'on te conseille (faire le controle de $result), va lire une doc, t'en as bien besoin.


Message édité par smaragdus le 16-01-2006 à 20:46:32
n°1284972
mikedimoi
Posté le 16-01-2006 à 20:50:52  profilanswer
 

Je te dis que je l'ai fait et que je n'ai pas de nouveau message d'erreur !!!!!
 
J'avais fait çà avant que omega2 ne poste :

Code :
  1. $sql=mysql_query("SELECT COUNT(*) FROM matable WHERE titre='".$fichier."'" ) or die(mysql_error());


 
Je n'avais rien de plus non plus !

n°1284992
smaragdus
whores, drugs & J.S. Bach
Posté le 16-01-2006 à 21:07:11  profilanswer
 

heu, tu sais lire ? :love:

n°1284998
mikedimoi
Posté le 16-01-2006 à 21:14:25  profilanswer
 

Et toi ??????
 
Je t'ai dit que j'avais aussi fait ce qu'omega2 m'avait dit !!! Je n'ai rien de plus !!!!!

n°1285197
smaragdus
whores, drugs & J.S. Bach
Posté le 17-01-2006 à 01:45:13  profilanswer
 

T'as vraiment copié du code sans lire la doc :

Code :
  1. while (list($titre, $id) = mysql_fetch_array($result))


$result est initialisé à quelle valeur ? [:dawa]

Code :
  1. mysql_query($sql_update,$query , $sql);


avec :
$query = "INSERT INTO matable(id, titre) VALUES('','".$fichier."')";
$sql=mysql_query("SELECT COUNT(*) FROM matable WHERE titre='".$fichier."'" );
$sql_update = "DELETE FROM matble WHERE id='".$id."'";
 
Et ça c'est une nouvelle syntax que t'as inventée ? [:dawa]
 
C'est nawak ton code  :sarcastic:  
 
Comme je disais, tu copies-colles des lignes de codes sans comprendre ce que tu fais => va lire la doc PHP plutôt que de la ramener.
 
A propos tu connais l'utilisation du double-quote ?
Ca permet d'écrire "SELECT COUNT(*) FROM matable WHERE titre='$fichier'" sans concaténer...
C'est un peu la base de PHP [:dawa]


Message édité par smaragdus le 17-01-2006 à 01:48:34
n°1285249
omega2
Posté le 17-01-2006 à 09:22:29  profilanswer
 

mikedimoi a écrit :

Je te dis que je l'ai fait et que je n'ai pas de nouveau message d'erreur !!!!!
 
J'avais fait çà avant que omega2 ne poste :

Code :
  1. $sql=mysql_query("SELECT COUNT(*) FROM matable WHERE titre='".$fichier."'" ) or die(mysql_error());


 
Je n'avais rien de plus non plus !


mikedimoi a écrit :

Celle-ci :

Code :
  1. while (list($titre, $id) = mysql_fetch_array($result)) {


chercher l'erreur : $sql d'un côté, $result de l'autre
Si tu fais la vérification à la sorti de la fonction, c'est bien, mais si c'est pour utiliser derriére une variable qui correspond pas et dans laquelle tu n'as rien mis du tout, ca sert pour ainsi dire à rien.
 
Smaragdus > Ne jamais mettre de nom de variable dans une chaine, même si ca marche, c'est une trop grande source d'erreur.

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  DELETE dans une boucle

 

Sujets relatifs
Problème de boucle de lectureErreur dans une boucle "for" :'(
Question sur delete[RESOLU] Problème avec un IF imbriqué dans une boucle FOR
[GLUT] Probleme avec boucle while[résolu] Comment faire une boucle de ce code au lieu de l'ecrir
Lecture d'un fichier texte en boucle C++ Afficher plusieur fois les résultats d'une boucle
[java] [linux] arreter un programme java qui boucleBoucle sur un fichier
Plus de sujets relatifs à : DELETE dans une boucle


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR