IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 MySQL Discussion :

vérifier si une ligne existe, et lister les champs


Sujet :

MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 103
    Points : 46
    Points
    46
    Par défaut vérifier si une ligne existe, et lister les champs
    Bonjour
    Je suis full débutant en php-mysql et j'ai deux questions:

    1) J'ai besoin d'une fonction qui vérifie si une ligne existe ou non:
    J'ai fait ceci:

    function existe ($fichier)
    {
    $req = "SELECT Id FROM table WHERE fichier = '$fichier'" ;
    $res = mysql_num_rows(mysql_query($req)) ;
    if ($res !=0 ) return ('oui') ; else return ('non');
    }

    Ca fonctionne.... mais lentement !
    Le code me parait un peu lourd.. y'a t'il un moyen de vérifier rapidement si une ligne existe ?

    2) je voudrais lister les valeurs des champs d'une colonne. J'ai pas trouvé de fonction qui ressemble à ce que je veux faire, alors avant de me lancer dans des doubles imbrications, y'a t'il un moyen rapide?
    Un exemple, j'ai une colonne "date" qui peut avoir les valeurs:
    1975
    1975
    1954
    1954
    1981
    2002
    1954

    Je voudrais sortir un tableau:
    annee[0]=1975
    annee[1]=1954
    annee[2]=1981
    annee[3]=2002

    Merci !

  2. #2
    Candidat au Club
    Inscrit en
    Décembre 2005
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    2) pour filtrer il suffit de faire soit un :
    - select distinct nomdu champ from table
    ou alors
    - select nom_du_champ from table group by nom_du_champ

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 103
    Points : 46
    Points
    46
    Par défaut
    Super !
    C'etait donc "DISTINCT" qui me manquait
    merci !

  4. #4
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut Re: vérifier si une ligne existe, et lister les champs
    Alors:

    1)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Id
    FROM tatable
    WHERE fichier = '$fichier'
    LIMIT 1
    Le LIMIT 1 fait que MySQL s'arrête au premier enregistrement trouvé.

    2) Pour avoir la liste des dates distinctes de ta table:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DISTINCT champDate
    FROM tatable
    Ensuite, tu remplis ton tableau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $annee = new Array(); 
    while( $row = mysql_fetch_array($res) ){
      $annee[] = $row('champDate') ;
    }
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 103
    Points : 46
    Points
    46
    Par défaut
    Je venais d'ecrire cette portion de code grace à "distinct" donné par Ivanovic.
    Le LIMIT fait gagner une seconde (14" au lieu de 15") de traitement sur mon tableau à 2000 entrées.
    C'est pas faramineux, mais il n'y a peut-être pas moyen d'aller plus vite!
    Merci à vous deux
    A+

  6. #6
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Quoi? 14 secondes pour 2000 entées seulement? Là c'est vraiment pas normal ! (pour 2.000.000 d'entrées, peut-être mais pas pour 2000). Il y a quelque chose qui cloche mais ça vient d'ailleurs...
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 103
    Points : 46
    Points
    46
    Par défaut
    Oui, c'est très long.
    En fait je checke tous les fichiers d'un repertoire windows, et pour chaque fichier je vérifie si il existe bien dans la BD (avec son nom de fichier)
    while (($file = readdir($dh)) !== false)
    {
    if (existe(addslashes ($file)) == 'non')
    {.... ajoutage dans la base blablabla }
    }

    comme on n'entre pas dans le "if" (tous les fichiers sont déjà listés), le délai ne peut venir que de windows qui envoit "à son rythme" les noms de fichiers ....

    Je pensais que le délai venait du test "existe" mais d'après ce que tu dis, ce n'est pas le cas.
    Tant pis, là on peut pas y faire grand chose!

  8. #8
    Candidat au Club
    Inscrit en
    Décembre 2005
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    si je peux donner mon avis, je pense qu'il y a un problème de conception.
    - la manière dont la requette est faite, ca veut dire que tu va là lancer autant de fois qu'il y a de fichiers sur le serveur (si il y en a 2000 ca va faire 2000 connexions ca va rammer..), je pense que tu devrait stocker les 2000 lignes de la table en mémoire et ensuite faire un traitement pour chaque fichier si existe ou pas en mémoire.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 103
    Points : 46
    Points
    46
    Par défaut
    Citation Envoyé par Ivanovic
    si je peux donner mon avis,
    ben oui, c'est pour ca que j'ai posté

    Citation Envoyé par Ivanovic
    je pense qu'il y a un problème de conception.
    - la manière dont la requette est faite, ca veut dire que tu va là lancer autant de fois qu'il y a de fichiers sur le serveur (si il y en a 2000 ca va faire 2000 connexions ca va rammer..), je pense que tu devrait stocker les 2000 lignes de la table en mémoire et ensuite faire un traitement pour chaque fichier si existe ou pas en mémoire.
    ok pour le principe, je vais voir comment je peux faire pour le mettre en oeuvre (c'est surement très simple, mais je rame un peu )
    Merci, a+

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 103
    Points : 46
    Points
    46
    Par défaut
    Y'a comme un souci, c'est encore plus lent
    Tout ceci n'est pas très grave, du moment que ca marche... mais j'aime bien comprendre

    J'ai fait ceci:
    D'abord je crée le tableau en memoire
    while ($data=mysql_fetch_assoc($req))
    {
    $fichier[] = $data['fichier'] ;
    }
    $nbfichier = mysql_num_rows(mysql_query($sql)) ; //

    Ensuite je teste...
    while (($file = readdir($dh)) !== false)
    {
    for ($i = 0 ; $i <$nbfichier ; $i++)
    { if ($file == $fichier[$i]) {$existe = 1 ;} }

    if ($existe == 0)
    [ { ..... blablabla traitement insertion BD }

    ----------
    La création du tableau est quasi immédiate, mais le test dure cette fois 25 secondes !

  11. #11
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Cher AIexis,

    Il y a encore plus simple: tu veux vérifier si le fichier existe déjà dans ta table avant de l'insérer, dans ce cas:

    1) tu mets un attribut UNIQUE sur le champ de ta table correspondant au nom de fichier

    2) tu fais soit un INSERT IGNORE (si le fichier existe déjà, l'erreur est ignorée), soit un REPLACE (si le fichier existe, remplace la ligne dans la table, sinon, se comporte comme un INSERT)

    Et c'est tout !
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 103
    Points : 46
    Points
    46
    Par défaut
    Merci cher Pcaboche !
    Ne le prends pas mal, mais c'est encore pire! je l'ai arrété avant que ca finisse...
    L'idée est certainement excellente (merci au passage pour l'attribut UNIQUE que je ne connaissais pas!) , mais dans mon cas ce n'est guère utilisable:
    En fait les fichiers en question sont des mp3, et je lis le tag ID3 pour mettre les infos dans la BD.
    Donc avec cette méthode, php lit tous les tags mp3 (2000 fichiers), ce qui est forcément très long.
    L'avantage des méthodes précédentes c'est que la lecture du tag ne se faisait que lorsque le fichier n'existe pas dans le BD.


    On va dire que ca va rester comme ca

  13. #13
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par AIexis
    En fait les fichiers en question sont des mp3, et je lis le tag ID3 pour mettre les infos dans la BD.
    Ah ben on comprend mieux pourquoi ça mettait autant de temps...
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 103
    Points : 46
    Points
    46
    Par défaut
    euh oui, mais non, car la lecture du tag ne se fait QUE dans le cas ou le fichier n'existe pas dans la BD
    sinon ca mettrait plus que 14 secondes 8)

    faudrait trouver un code qui permette de ne pas faire 2000 requetes, en gardant le test d'existance pour éviter de lire les tags inutiles...
    bah.. je le ferai en 2008, ou sinon je loue un serveur plus rapide

  15. #15
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Il y a peut-être une solution:

    1) Tu créés une table temporaire, dans laquelle tu mets la liste des fichiers présents dans le/les répertoire(s).

    2) Tu fais une requête avec une jointure de type LEFT OUTER JOIN entre ta table temporaire (T1) et la table contenant tes tags ID3 (T2). Les fichiers n'ayant pas de correspondance dans T2 auront les champs de cette table égaux à NULL (propriété qu'il est facile de vérifier avec la clause WHERE champDeT2 IS NULL). Ainsi tu auras la liste des fichiers non présents en base

    3) Tu extrais les tags ID3 des fichiers appartenant à cette liste uniquement

    4) Tu vides (ou détruis) ta table temporaire

    Maintenant rassure-moi: tes fichiers MP3 sont tout ce qu'il y a de plus légaux? Parce que je n'ai pas envie de me faire accuser de complicité de recel d'objet volé ou autre m**** du genre...
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 103
    Points : 46
    Points
    46
    Par défaut
    Je verrai tout cela demain à tete reposée, mais je souhaitais te rassurer afin que tu puisses dormir sur tes deux oreilles:
    c'est pour le compte d'une société qui s'acquite de ses droits SACEM et SCPP (et c'est rare! )

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 19/09/2014, 09h12
  2. [Batch] Comment vérifier si une ligne de texte existe dans un fichier .txt ?
    Par noder347 dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 19/06/2013, 00h54
  3. Réponses: 2
    Dernier message: 07/05/2010, 13h36
  4. [VB6/ACCESS] Lister les champs d'une table
    Par Sytchev3 dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 07/06/2006, 19h01
  5. Oracle 9i : Vérifier qu'une ligne existe
    Par Fatah93 dans le forum Oracle
    Réponses: 4
    Dernier message: 14/06/2005, 12h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo