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

PHP & Base de données Discussion :

mysql_select_db


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Janvier 2024
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Janvier 2024
    Messages : 73
    Par défaut mysql_select_db
    bonjour
    je suis plus que débutant .
    Je tente une requête à ma bdd.
    Je suis sur mon ordi perso, wamp est lancé, je me connecte en localhost
    j'ai le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    mysqli_connect('localhost', 'root', '') or die ("Connexion au serveur impossible");
    mysqli_select_db('proglyrics',NULL) or die ("Connexion a la base impossible");
    echo 'ici';
    $resultat=mysql_query("SELECT adresse FROM groupes WHERE groupe LIKE
    'toto'");
    Quand j'écrit mysqli je reçois comme erreur que mon premier argument "must be of type mysqli, string'

    Quand j'écrit mysql je reçois "undefined function mysql_select_db() "

    Evidemment ma bdd se nomme 'proglyrics'

    Qu'est-ce que je dois corriger ?

  2. #2
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 660
    Par défaut
    regardez la documentation des fonctions, elle contient des informations et parfois des exemples d'utilisation.
    par exemple pour mysqli_query :
    https://php.net/mysqli_query

  3. #3
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Janvier 2024
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Janvier 2024
    Messages : 73
    Par défaut
    J'avoue que je n'ai pas compris grand chose à ce que j'ai lu, mais j'ai un peu deviné.
    J'ai corrigé ça comme suit et ça fonctionne vaille que vaille

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $resultat=mysqli_query($bdd,"SELECT adresse FROM groupes WHERE groupe
    LIKE 'toto');
    $row = mysqli_fetch_array($resultat);
    printf($row[0]);
    echo  '<a href="'.$row[0].'"> toto</a><br>' ;
    Et j'obtiens bien ce qui est écrit dans ma bdd.
    Evidemment maintenant le nouveau problème est de passer le mot 'toto' par un argument d'un formulaire.
    J'ai donc ajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $groupe=$_GET['Mot']; 
    settype($groupe,"string");
    car le label est "Mot" et je le converti en string puisqu'apparemment quand je ne le mets pas j'ai un message d'erreur

    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $resultat=mysqli_query($bdd,"SELECT adresse FROM groupes WHERE groupe
    LIKE $groupe);
    Dans le formulaire j'écrit 'toto' et la réponse est cette fois
    "Champ 'toto' inconnu dans where clause"

    et là je ne vois pas très bien ce que je dois changer (comme je l'ai dit je suis archi débutant en sql et je cherche à fabriquer un tout petit moteur de recherche pour mon site perso)

  4. #4
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 660
    Par défaut
    si vous affichez la requête construite vous verrez que vous obtenez quelque chose comme WHERE groupe LIKE toto à la fin, ce qui fait que mysql analyse "toto" comme le nom d'une colonne au lieu d'une chaine de caractères.

    une solution serait d'utiliser le code suivant
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $resultat = mysqli_query($bdd, "SELECT adresse FROM groupes WHERE groupe LIKE '$groupe'");
    mais si un trouble fête tape dans le formulaire '; DELETE * FROM groupes; le résultat sera alors WHERE groupe LIKE ''; DELETE * FROM groupes; ce qui va supprimer le contenu de la table parce que ce code permettra à l'utilisateur de lancer n'importe quel requête sql.

    pour éviter cette injection sql, vous pouvez utiliser une requête préparée comme cela
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $stmt = mysqli_prepare($bdd, "SELECT adresse FROM groupes WHERE groupe LIKE ?");
     
    $resultat = mysqli_stmt_execute($stmt, [$_GET["mot"]]);

  5. #5
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Janvier 2024
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Janvier 2024
    Messages : 73
    Par défaut
    déjà j'ai pigé le coup des requêtes préparées, oui c'est préférable !!!
    Il y a quelque chose que je pige pas.
    $groupe est de type string. Pourquoi faut-il mettre à nouveau des ' ' ?

    Mais il y a pire car $resultat est devenu un booléen !!

    comment faire pour récupérer la valeur de mon ancien
    mysqli_query($bdd,"SELECT adresse FROM groupes WHERE groupe
    LIKE 'toto');

    J'ai essayé au pif diverse choses mais rien ne donne quoi que ce soit sinon des erreurs.
    La nature des "prepare" ou des "execute" me reste assez obscure.

    execute n'a pas l'air d'exécuter ce que je pense puisque le resultat est un booléen (j'imagine un bit de contrôle)
    Ou alors où se trouve le résultat de l'exécution ?

  6. #6
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 660
    Par défaut
    Citation Envoyé par noradan Voir le message
    $groupe est de type string. Pourquoi faut-il mettre à nouveau des ' ' ?
    parce qu'une fois la requête construite, mysql ne sait pas que c'est une chaine. s'il n'y pas de guillemet, mysql interprète cela comme le nom d'une colonne d'une table.


    pour le code essayez comme cela :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $stmt = mysqli_prepare($bdd, "SELECT adresse FROM groupes WHERE groupe LIKE ?");
     
    mysqli_stmt_execute($stmt, [$_GET["mot"]]);
    $resultat = mysqli_stmt_get_result($stmt);
     
    // parcours des lignes du résultat
    while ($row = mysqli_fetch_assoc($result)) {
     
     
     
    }

  7. #7
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Janvier 2024
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Janvier 2024
    Messages : 73
    Par défaut
    Pfff ! OUh, là, là !

    J'ai mis un temps fou à arriver à un vague résultat.
    Je ne comprends pas du tout "l'esprit" du sql. Et surtout je ne comprends pas du tout la nature des objets.
    Si je suis ce que j'ai compris (merci de me corriger)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $result = mysqli_stmt_get_result($stmt);
    met dans la variable $result le résultat de la recherche au format "résultat" ??? Je ne comprends pas ce que ça veut dire mais admettons qu'il y a un format spécial dit "résultat".
    D'après ce que j'ai lu, "Retourne un tableau associatif "la fonction myqsli_fetch_assoc prend des variables de type "résultat" et retourne un array.
    $row devrait donc être un array sauf que $row[0] plante, et je dois mettre en fait le nom de la colonne : ici "adresse". C'est donc un array d'un genre spécial par rapport au array que je connais dans les autres langages que je connais.
    Avant j'avais écrit $row = mysqli_fetch_array($resultat); et j'avais bien un objet de type array avec $row[0] qui donnais le résultat.
    Je pensais que c'était "assoc" qui changeait la donne et j'ai remis à la place "array".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while ($row = mysqli_fetch_array($result)) {printf("%s\n",$row[0]);   }
    Pas d'erreur mais tout simplement rien du tout ! printf ne m'imprime rien et je ne comprends pas pourquoi. A tout hasard j'ai tenté coup avec $row[1] qui lui a bien planté comme de droit.
    Pour essayer d'avoir une adresse cliquable j'ai refais ce que j'avais fait avant soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo  '<a href="'.$row[0].'"> toto</a><br>
    dans les { } du while, mais ça ne retourne rien. Pas d'erreur mais vide !

    Je n'ai pas trouvé comment récupérer la chaîne obtenue dans le while pour en faire quelque chose.

    Bref comme vous voyez, je ne comprends absolument pas comment ça fonctionne. Et tout ça pour une simple recherche sur un seul mot !
    Je frémis à l'avance pour une recherche avec plusieurs mot. J'ai lu qu'il y avait un objet "ensemble" SET qui devra peut-être m'aider par la suite mais pour le moment j'aimerais bien piger quelque chose à ce que j'écris et c'est infiniment loin d'être le cas
    Les tutos que je lis donne très peu d'exemple et quasiment toujours l'ajout d'une ligne dans la bdd par un visiteur qui remplit un formulaire ce qui n'a aucun lien avec ce que je fais qui est de récupérer une chaîne dans ma bdd et travailler avec.
    Merci de m'éclairer un peu

  8. #8
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 660
    Par défaut
    la variable $result contient un objet du type mysqli_result qui détaillé ici :
    https://www.php.net/manual/fr/class.mysqli-result.php

    ensuite dans $row vous devriez avoir un tableau php.
    pour afficher son contenu, essayez cette fonction qui affichera n'importe quelle variable composée d'objets, tableaux, code XML :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function aff($var)
    {
    	echo "<pre>";
    	echo htmlspecialchars(var_export($var, TRUE));
    	echo "</pre>";
    }

    est ce que vous utilisez php 8.1 ou plus récent ? avant cette version les erreurs mysql étaient cachées par défaut ce qui pouvait vous faire passer à côté d'informations utiles pour débuger.

  9. #9
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Janvier 2024
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Janvier 2024
    Messages : 73
    Par défaut
    Désolé mais ma réponse précédente n'est apparemment pas partie... Mystère !!

    J'y disais donc que wamp m'annonce php 5,7,8

    Par approximations successives j'ai réussi à écrire le code suivant qui donne en gros ce que je voulais à savoir
    le lien "toto" qui pointe sur l'adresse.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while ($row = mysqli_fetch_array($result)) {
    echo '<a href="'.$row["adresse"].'"> toto</a><br>' ;
      }
    Evidemment une fois que c'est fait ça semble simple mais j'aiquand même mis un moment.
    Maintenant il faudrait que ça puisse fonctionne avec plusieurs mots aussi bien en entrée qu'en sortie.
    Concrètement je voudrais obtenir l'adresse de "Le Seigneur des Anneaux" aussi bien avec la recherche sur "seigneur", sur "anneaux" ou bien sûr "le seigneur des anneaux".

    Du peu que j'ai peut-être compris, après "where" il y a un booléen (ça me parait logique).
    En réfléchissant à ce que je ferais si j'étais en Python,
    ici le booléen doit être une fonction car j'envisage d'abord de "hacher" l'entrée "mot" en "mots_clefs" avec explode,
    puis faire une boucle sur toutes les colonnes du array "mot_clefs" en utilisant str_contains
    un truc du genre

    function recherche(groupe,motsclef):
    for clef in motsclef :
    if str_contains(groupe, clef): return TRUE

    ceci pour rechercher un des mots clef, par exemple "anneaux" dans la chaîne "Le Seigneur des Anneaux" et après avoir mis tout le monde en minuscule puisque c'est sensible à la casse.
    J'ai vu qu'il y avait une sorte de "for clef in" en php qui est "foreach" ici ça donnerait foreach(motsclef as clef).

    LA question qui me vient alors à l'esprit est : peut-on écrire "SELECT adresse FROM groupes WHERE recherche(groupe,mots_clef)
    où "groupe" est une des colonnes de ma table ? peut-on passer un élément de table froidement en argument ? pas de problème de "parsing" ?

    Avant de tâtonner j'aimerais quand même savoir si je suis sur une piste ou si c'est du n'importe quoi.

  10. #10
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 660
    Par défaut
    il y a plusieurs pages au sujet de la recherche dans la documentation officielle (en anglais) :
    https://dev.mysql.com/doc/refman/8.4...xt-search.html

    par contre si vous avez d'autres questions, il vaut mieux que vous créiez une nouvelle discussion vu que votre souci initial est réglé.

  11. #11
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Janvier 2024
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Janvier 2024
    Messages : 73
    Par défaut
    Merci,
    j'ai été un peu interrompu dans ce travail, mais je vais m'y remettre.
    En tout cas je commence un peu à pouvoir remuer ! Je ne suis pas encore sorti des ronces, de la congère ou de la glaise mais... je vois que l'on peut faire quelque chose.
    Je recréerai en effet un sujet plus sur le sujet lui-même.

    bye @+

Discussions similaires

  1. Dreamweaver et mysql_select_db()
    Par Anibel dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 10/03/2013, 20h07
  2. [MySQL] Probleme selection BDD avec mysql_select_db
    Par mercure07 dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 23/09/2011, 07h48
  3. [PDO] Équivalent de mysql_select_db
    Par fandz dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 14/06/2010, 11h08
  4. Un doute sur mysql_select_db
    Par FoxLeRenard dans le forum Débuter
    Réponses: 2
    Dernier message: 25/05/2009, 11h25
  5. [MySQL] Question sur argument de mysql_connect() et mysql_select_db()
    Par kuja2053 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 17/02/2008, 22h11

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