DELETE dans une boucle

DELETE dans une boucle - PHP - Programmation

Marsh Posté le 15-01-2006 à 15:13:45    

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

Reply

Marsh Posté le 15-01-2006 à 15:13:45   

Reply

Marsh Posté le 15-01-2006 à 17:16:03    

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
Reply

Marsh Posté le 15-01-2006 à 17:23:18    

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 !

Reply

Marsh Posté le 15-01-2006 à 17:41:50    

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

Reply

Marsh Posté le 15-01-2006 à 18:15:22    

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 çà !

Reply

Marsh Posté le 16-01-2006 à 00:25:46    

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
Reply

Marsh Posté le 16-01-2006 à 07:34:21    

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
Reply

Marsh Posté le 16-01-2006 à 08:08:26    

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


Message édité par mikedimoi le 16-01-2006 à 08:16:53
Reply

Marsh Posté le 16-01-2006 à 08:30:04    

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

Reply

Marsh Posté le 16-01-2006 à 08:30:04   

Reply

Marsh Posté le 16-01-2006 à 08:35:11    

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

Reply

Marsh Posté le 16-01-2006 à 08:47:35    

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 ;


 

Reply

Marsh Posté le 16-01-2006 à 12:16:57    

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?

Reply

Marsh Posté le 16-01-2006 à 12:52:55    

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
Reply

Marsh Posté le 16-01-2006 à 12:58:02    

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
Reply

Marsh Posté le 16-01-2006 à 13:04:07    

VARCHAR(255), NotNull.

Reply

Marsh Posté le 16-01-2006 à 13:05:48    

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

Reply

Marsh Posté le 16-01-2006 à 13:08:07    

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
Reply

Marsh Posté le 16-01-2006 à 14:01:02    

mikedimoi a écrit :

VARCHAR(255), NotNull.


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

Reply

Marsh Posté le 16-01-2006 à 17:10:10    

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
Reply

Marsh Posté le 16-01-2006 à 17:51:52    

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
Reply

Marsh Posté le 16-01-2006 à 17:57:12    

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.

Reply

Marsh Posté le 16-01-2006 à 18:27:33    

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.

Reply

Marsh Posté le 16-01-2006 à 18:33:17    

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?

Reply

Marsh Posté le 16-01-2006 à 18:59:47    

Oui et j'ai toujours la meme erreur !

Reply

Marsh Posté le 16-01-2006 à 20:10:24    

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
Reply

Marsh Posté le 16-01-2006 à 20:12:38    

Celle-ci :

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

Reply

Marsh Posté le 16-01-2006 à 20:46:11    

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
Reply

Marsh Posté le 16-01-2006 à 20:50:52    

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 !

Reply

Marsh Posté le 16-01-2006 à 21:07:11    

heu, tu sais lire ? :love:

Reply

Marsh Posté le 16-01-2006 à 21:14:25    

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

Reply

Marsh Posté le 17-01-2006 à 01:45:13    

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
Reply

Marsh Posté le 17-01-2006 à 09:22:29    

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.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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