PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 31-12-2009 10:40:39

t14
Membre
Inscription : 10-09-2009
Messages : 96

Vérifier existance élément dans base mysql

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.

$sql = "SELECT nom FROM photos WHERE idph = '$id' ";    
$resultat =mysql_query($sql) or die('Erreur SQL !'.$req_fich.mysql_error());
$ligne=mysql_fetch_array($resultat);       // extraction d'une ligne du résultat
$nom=$ligne['nom'];

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

#2 31-12-2009 13:16:28

xTG
GrandGourou
Inscription : 18-06-2009
Messages : 1 127
Site Web

Re : Vérifier existance élément dans base mysql

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

#3 31-12-2009 14:26:33

t14
Membre
Inscription : 10-09-2009
Messages : 96

Re : Vérifier existance élément dans base mysql

xTG a écrit :

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

#4 31-12-2009 16:56:47

xTG
GrandGourou
Inscription : 18-06-2009
Messages : 1 127
Site Web

Re : Vérifier existance élément dans base mysql

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

#5 31-12-2009 17:20:50

t14
Membre
Inscription : 10-09-2009
Messages : 96

Re : Vérifier existance élément dans base mysql

xTG a écrit :

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

#6 31-12-2009 18:32:36

xTG
GrandGourou
Inscription : 18-06-2009
Messages : 1 127
Site Web

Re : Vérifier existance élément dans base mysql

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 :

SELECT id FROM photos WHERE nom=leNomDeLaPhoto

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

#7 31-12-2009 19:39:23

t14
Membre
Inscription : 10-09-2009
Messages : 96

Re : Vérifier existance élément dans base mysql

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). sad

A l'upload, j'écris :

Photo 4 : <INPUT TYPE=FILE NAME="fichier[]" size="76"><br>
Commentaire Photo 4:<br>
<INPUT type=text name="commentaire[]" id="texte4" size="90" maxlength="500"><p>

Faudrait peut-être que je change le NAME="fichier[]" et lui rajouter une extension ? Mais je sais pas comment ! hmm
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 ! hmm

Y'a de quoi se tirer les cheveux, non ?

Hors ligne

#8 31-12-2009 19:57:30

xTG
GrandGourou
Inscription : 18-06-2009
Messages : 1 127
Site Web

Re : Vérifier existance élément dans base mysql

La variable $nouveauNomDeFichier n'est pas là pour faire joli. roll

Hors ligne

#9 01-01-2010 11:58:50

t14
Membre
Inscription : 10-09-2009
Messages : 96

Re : Vérifier existance élément dans base mysql

xTG a écrit :

La variable $nouveauNomDeFichier n'est pas là pour faire joli. roll

Bonjour xTG, et meilleurs voeux.

OK, j'abonde dans ton sens même si je ne comprends pas tout ........ !!!!

J'ai écrit ceici :

$fichier = $_POST['fichier'];

$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

#10 01-01-2010 19:24:38

xTG
GrandGourou
Inscription : 18-06-2009
Messages : 1 127
Site Web

Re : Vérifier existance élément dans base mysql

Le count il faut le faire sur le select. ^^

Voilà un petit code vite fait pour que tu comprennes mieux :

<?php
$nomDeFichier = $_POST['fichier'];
$nomDeFichierDansLaBase = $nomDeFichier;

$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

#11 02-01-2010 18:55:02

t14
Membre
Inscription : 10-09-2009
Messages : 96

Re : Vérifier existance élément dans base mysql

Bonsoir xTG.

OK et merci pour le bout de script. smile
Mais qu'est ce que $nbDePhotosAyantLeMemeNom ? Comment le récupérer ? hmm

Hors ligne

#12 02-01-2010 19:52:55

xTG
GrandGourou
Inscription : 18-06-2009
Messages : 1 127
Site Web

Re : Vérifier existance élément dans base mysql

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

#13 03-01-2010 13:18:44

t14
Membre
Inscription : 10-09-2009
Messages : 96

Re : Vérifier existance élément dans base mysql

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

hmm

Hors ligne

#14 03-01-2010 13:28:41

Pierrot
Ancien nouveau
Inscription : 08-05-2009
Messages : 1 195

Re : Vérifier existance élément dans base mysql

mysql_num_rows()  ce serai mieux wink
a++

Hors ligne

#15 03-01-2010 14:11:59

t14
Membre
Inscription : 10-09-2009
Messages : 96

Re : Vérifier existance élément dans base mysql

Pierrot a écrit :

mysql_num_rows()  ce serai mieux wink
a++

Merci Pierrot  ! Autant pour moi ...... tongue

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 :

$fichier = $_POST['fichier'];

$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 ... ???? sad  C'est navrant ...... mad

Hors ligne

#16 03-01-2010 14:16:43

Pierrot
Ancien nouveau
Inscription : 08-05-2009
Messages : 1 195

Re : Vérifier existance élément dans base mysql

>>lors j'ai modifié en simplifiant
ptdr.gif

Hors ligne

#17 03-01-2010 17:13:25

t14
Membre
Inscription : 10-09-2009
Messages : 96

Re : Vérifier existance élément dans base mysql

: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) sad :


$fichier = $_POST['fichier'];

$sql = mysql_query('SELECT idph FROM photos WHERE nom='.$fichier );
if( ($nbDePhotosAyantLeMemeNom = mysql_num_rows($sql)) > 0 )
    $fichier = $nbDePhotosAyantLeMemeNom + 1;

Comprende pô .... ???? mad

Encore un 'tit coup de main ?
tongue

Hors ligne

#18 03-01-2010 17:30:53

Pierrot
Ancien nouveau
Inscription : 08-05-2009
Messages : 1 195

Re : Vérifier existance élément dans base mysql

[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 wink


$nomfichier=NameFile($name);

a++

Dernière modification par Pierrot (03-01-2010 20:31:08)

Hors ligne

#19 04-01-2010 17:25:51

t14
Membre
Inscription : 10-09-2009
Messages : 96

Re : Vérifier existance élément dans base mysql

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 :

function NameFile($fichier,$bcl)
{
  $nb=current(mysql_fetch_array(mysql_query("SELECT count(*) FROM photos WHERE nom='$fichier$bcl'")));
  if ($nb>0)
  {
     $bcl++;
     $fichier=NameFile($fichier,$bcl);
  }
  else{
    return $fichier;
  }
}

et j'ai cette erreur :

Fatal error: Cannot redeclare namefile() (previously declared in ........

Hors ligne

#20 04-01-2010 18:18:11

xTG
GrandGourou
Inscription : 18-06-2009
Messages : 1 127
Site Web

Re : Vérifier existance élément dans base mysql

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 :

$nomFichier = namefile($fichier); // oublie de $bcl

Hors ligne

#21 16-01-2010 17:59:40

t14
Membre
Inscription : 10-09-2009
Messages : 96

Re : Vérifier existance élément dans base mysql

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
      }

wink Y'a certainement mieux, mais ça fonctionne .... tongue

Dernière modification par t14 (16-01-2010 18:00:19)

Hors ligne

Pied de page des forums