Vous n'êtes pas identifié(e).
Pages :: 1
Bonjour,
Je cherche à enregistrer des éléments (images) dans ma base, mais avant l'enregistrement, je veux tester si le nom existe déjà. Si il existe, le nouveau nom se modifiera en un style "fichier02".
En premier lieu, je lit la base et je recherche la valeur de $nom (identifiant unique de cet enregistrement = idph (sous table). id provient d'une autre table ...)
$fichier est l'élément que je veux inscrire dans la table.
if ($fichier == $nom)
$fichier = $fichier .'02';
A ce point, si je veux enregistrer un fichier (B) portant un nom déjà existant (A) dans la base, j'aurais deux fois l'existant (A). Et à l'affichage, j'aurais donc deux fois la même image (A).
Merci d'avance de m'aider .....
Hors ligne
Pourquoi mettre l'attribut nom en tant que clé alors que tu as un ID ?
Le fait d'enlever ton attribut nom de la clé te permettrai sans soucis ce que tu veux, tu n'aurai même pas à renommer.
Enfin après il semble que tu porte un intérêt à ce renommage. Que comptes-tu faire des noms ? Quel intérêt as-tu à avoir deux mêmes fichiers dont l'un est appelé fichier1 et l'autre fichier2 ?
Hors ligne
Pourquoi mettre l'attribut nom en tant que clé alors que tu as un ID ?
Le fait d'enlever ton attribut nom de la clé te permettrai sans soucis ce que tu veux, tu n'aurai même pas à renommer.Enfin après il semble que tu porte un intérêt à ce renommage. Que comptes-tu faire des noms ? Quel intérêt as-tu à avoir deux mêmes fichiers dont l'un est appelé fichier1 et l'autre fichier2 ?
Pourquoi mettre l'attribut nom en tant que clé alors que tu as un ID ? => c'est parcequ'il n'y a que le nom que je cherche, pour voir s'il existe déjà dans la base.
Le fait d'enlever ton attribut nom de la clé te permettrai sans soucis ce que tu veux, tu n'aurai même pas à renommer => ben le renommer, c'est ce que je cherche à faire, pour éviter qu'il y ait deux fois le même nom.
Que comptes-tu faire des noms ? => J'affiche les photos à l'écran. Et s'il y a deux fois le même nom, il y a deux fois l'affichage de la même foto.
Quel intérêt as-tu à avoir deux mêmes fichiers dont l'un est appelé fichier1 et l'autre fichier2 => pour éviter l'affichage en double de la même foto.
Exemple : je mets en place une image représentant la mer, ayant pour nom "1.jpeg". Le lendemain je veux mettre d'autres images. Je met en place une image représentant le ciel, ayant pour nom "1.jpeg". Ben quand je lirais ma base et que j'afficherais les images, je verrais deux fois celle représentant la mer .....
Hors ligne
Enregistres-tu le chemin de l'image ?
Si oui il n'y a aucune raison qu'il t'affiche deux fois l'image de la mer.
D'après tes derniers propos j'ai du mal à me représenter ton système. En général on enregistre un ID unique pour chaque photo, un nom pour l'affichage et un chemin vers le fichier.
Donc avoir le même nom ne pose pas problème vu que le chemin vers le fichier est différent.
Et dans le cas où tu aurais deux fichiers ayant le même nom ils ne sont pas dans le même répertoire sinon c'est impossible, donc ce n'est pas un soucis non plus.
Hors ligne
Enregistres-tu le chemin de l'image ?
Si oui il n'y a aucune raison qu'il t'affiche deux fois l'image de la mer.D'après tes derniers propos j'ai du mal à me représenter ton système. En général on enregistre un ID unique pour chaque photo, un nom pour l'affichage et un chemin vers le fichier.
Donc avoir le même nom ne pose pas problème vu que le chemin vers le fichier est différent.
Et dans le cas où tu aurais deux fichiers ayant le même nom ils ne sont pas dans le même répertoire sinon c'est impossible, donc ce n'est pas un soucis non plus.
Les images je les upload dans un fichier sur serveur. Donc, elles se retrouvent toute ensemble, avec le même chemin d'accès. Que j'enregistre dans la base le chemin (ce que j'avais fait au début) style : "images/gestion/photo.jpg" , ou que j'enregistre uniquement le nom "photo.jpg" et que je mette le chemin dans le script, le résultat mènera au même vu que ce sera le même chemin, et que si il y a deux photos du même nom = conflit. C'est pour ça que je veux pouvoir changer le nom si il existe déjà dans la base.
Je suis d'accord avec toi pour l'id unique (idph pour moi, ici).
J'ai deux tables. Une avec l'id unique, titre et soustitre. L'autre avec l'idph unique, un idliaison identique à l'id de la première table (pour récupérer le titre et soustitre de la l'album), le nom de la photo, le lien, commentaire, .....
A l'upload, si je tente d'uploader ^deux images avec le même nom, je n'aurais que la deuxième. Donc, j'en ai perdu une ......
Faudrait peut-être que je fasse autrement, mais comment ????
Dernière modification par t14 (31-12-2009 18:31:15)
Hors ligne
Aaaaah ! C'est pour le code de ton formulaire d'upload que tu cherches cela... Bah fallais le dire... Enfin j'avais pas compris.
Dans ce cas je te propose la chose suivante pour trouver le nouveau numero :
Tu récupéreras donc X enregistrements, tu les comptes avec count() et tu modifies le nom de ton fichier uploadé par : $nouveauNom = $nomDuFichier.($nbrEnregistrement + 1)
Ensuite tu enregistres dans ta table avec l'ancien nom ($nomDuFichier) et le chemin correct (celui avec $nouveauNom qui pointe vers le bon fichier).
Tu auras donc X enregistrements avec le même nom dans ta table mais avec tous un chemin différent.
Hors ligne
En fait, le problème est à l'upload, donc à l'écriture dans la base.
Si j'upload 2 photos du même nom, les deux seront inscrites dans la base, mais le dossier de réception ne comportera que la deuxième image qui aura écrasé la première (du même nom).
A l'upload, j'écris :
Faudrait peut-être que je change le NAME="fichier[]" et lui rajouter une extension ? Mais je sais pas comment !
Et supposons un cas : j'upload "photo123.jpeg" en 4° position. Deux jours après, je rajoute des photos pour le même album, et par le plus grand des hasards je cherche à uploader une photo (autre) nommée aussi "photo123.jpeg" en 4° position. Ce deuxième upload écrasera le premier !
Y'a de quoi se tirer les cheveux, non ?
Hors ligne
La variable $nouveauNomDeFichier n'est pas là pour faire joli.
Bonjour xTG, et meilleurs voeux.
OK, j'abonde dans ton sens même si je ne comprends pas tout ........ !!!!
J'ai écrit ceici :
$nbfichier = count($fichier);
$newfichier = $fichier.($nbfichier + 1);
..........
$sql2 = "INSERT INTO photos(nom, lien) VALUES('$fic[0]', '$dossier$newfichier')";
mysql_query($sql2) or die('Erreur SQL !'.$req_fich.mysql_error());
mais là, si je fais un echo des variables, $nbfichier reste à 0, $newfichier reste à 1. Ce qui fait que je récupère un nom toujours = à 1.
Dernière modification par t14 (01-01-2010 11:59:43)
Hors ligne
Le count il faut le faire sur le select. ^^
Voilà un petit code vite fait pour que tu comprennes mieux :
$sql = mysql_query('SELECT id FROM photos WHERE nom='.$nomDeFichierDansLaBase );
if( ($nbDePhotosAyantLeMemeNom = mysql_num_row($sql)) > 0 )
$nomDeFichier .= $nbDePhotosAyantLeMemeNom + 1;
//Traitement de l'insertion dans la bdd avec $nomDeFichierDansLaBase
//Traitement de l'upload sur le ftp avec $nomDeFichier
?>
Hors ligne
Bonsoir xTG.
OK et merci pour le bout de script.
Mais qu'est ce que $nbDePhotosAyantLeMemeNom ? Comment le récupérer ?
Hors ligne
Baaaaah euh... Bonne question, là j'avoue tu me tends un piège digne du grand Satan en personne !
C'est le retour de mysql_num_rows.
Pour rappel en PHP :
= affectation de valeur
== comparaison
^_-
Hors ligne
OK !!!! Après relecture je comprends mieux où tu veux en venir ....
Par contre, j'ai encore une erreur où je ne trouve pas la solution :
Fatal error: Call to undefined function mysql_num_row()
J'ai cru que c'était parceque la base était vide, mais non !!!!!
Hors ligne
mysql_num_rows() ce serai mieux
a++
Hors ligne
mysql_num_rows() ce serai mieux
a++
Merci Pierrot ! Autant pour moi ......
mais maintenant j'ai l'erreur Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource
Alors j'ai modifié en simplifiant :
$nomDeFichierDansLaBase = $fichier;
$sql = mysql_query('SELECT idph FROM photos WHERE nom='.$nomDeFichierDansLaBase );
$nb = mysql_num_rows($sql);
if($nb > 0 )
$fichier = $nbDePhotosAyantLeMemeNom + 1;
Et si je fais un echo de $fichier et $nomDeFichierDansLaBase, ces variables sont vides ... ???? C'est navrant ......
Hors ligne
>>lors j'ai modifié en simplifiant
Hors ligne
:mad:Ouais ! Ben c'est pô marrant car j'ai toujours pô trouvé ....
Si j'écris ceci, c'est pareil. Le nom ne change pas (ajout de la valeur +1 à la fin) :
$sql = mysql_query('SELECT idph FROM photos WHERE nom='.$fichier );
if( ($nbDePhotosAyantLeMemeNom = mysql_num_rows($sql)) > 0 )
$fichier = $nbDePhotosAyantLeMemeNom + 1;
Comprende pô .... ????
Encore un 'tit coup de main ?
Hors ligne
[code : php]
<?php
function NameFile($name,$bcl){
$nb=current(mysql_fetch_array(mysql_query("SELECT count(*) FROM photos WHERE nom='$name$bcl'")));
if ($nb>0){
$bcl++;
$name=NameFile($name,$bcl);
}
else{
return $name;
}
}
?>
[/code]
Cette fonction devrait faire l'affaire
$nomfichier=NameFile($name);
a++
Dernière modification par Pierrot (03-01-2010 20:31:08)
Hors ligne
Bonjour Pierrot,
Je ne connais pas trop ces fonctions, mais pourquoi pas .....
Je suppose que $name correspond au nom du fichier, et que $bcl correspond à son extension qui prendra des valeurs successives en cas de doublon !
Mais si $bcl n’existe pas encore (au début) ?
J'ai écris ceci :
et j'ai cette erreur :
Fatal error: Cannot redeclare namefile() (previously declared in ........
Hors ligne
Vérifies que dans ton programme principal tu appelles la fonction avec le bon nombre de paramètres.
Ton erreur pourrait être causée par un appel de ce genre :
Hors ligne
Bonjour,
J'ai trouvé autrement (en sachant que "doublon" set un champ de la base que je vais incrémenter) :
$fic = explode(".", $fichier);
//------------------verif doublon fichier-----------------
$verif = "SELECT nom,doublon FROM photos where nom like '$fic[0]'";
$result = mysql_query($verif,$link) or die ('Erreur : '.mysql_error() );
while($row = mysql_fetch_row($result))
{
//récup des infos de $result
$nom = $row[0];
$doublon = $row[1];$doublon2 = $doublon + 1;
//mise à jour du champ "doublon" pour l'élément déjà existant
$maj_doub = mysql_query("UPDATE photos SET doublon='$doublon2' WHERE nom='$row[0]'");
$doublon3 = $doublon2 + 1; //champ doublon du nouvel enregistrement
$fic[0] = $fic[0].$doublon2; //nouveau nom du fichier sans son extension
$fichier = "$fic[0].$fic[1]"; //nouveau nom du fichier avec son extension
}
Y'a certainement mieux, mais ça fonctionne ....
Dernière modification par t14 (16-01-2010 18:00:19)
Hors ligne
Pages :: 1