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 :

PDO erreur de connexion


Sujet :

PHP & Base de données

  1. #1
    Membre extrêmement actif
    PDO erreur de connexion
    Bonjour,

    Mon environnement est un NAS Synology avec :
    - Apache/2.2.34 (Unix)
    - PHP Version 5.6.40
    - mysqlnd 5.0.11

    Je souhaite me connecter à la base de données mais n'y arrive pas.

    J'ai donc fait un script très court :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    try {
        $dbh = new PDO('mysql:host=localhost;dbname=agora', 'user', 'password');
        foreach($dbh->query('SELECT * from FOO') as $row) {
            print_r($row);
        }
        $dbh = null;
    } catch (PDOException $e) {
        print "Erreur !: " . $e->getMessage() . "<br/>";
        die();
    }
    ?>


    Et j'ai l'erreur suivante :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Erreur !: SQLSTATE[HY000] [2002] No such file or directory


    Ma base de données existe bien puisque je la vois depuis phpMyAdmin avec le même login/password.
    Le serveur base de donnée affiché dans phpMyAdmin est
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Serveur : MariaDB 10 (Localhost via UNIX socket)


    Merci pour votre retour d'expérience sur une connexion via PDO, c'est une 1ère pour moi.
    Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose.

  2. #2
    Modératrice

    Question bête : est-ce que ça fonctionne si tu utilise mysqli ?
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  3. #3
    Membre extrêmement actif
    Oh que ce n'est pas bête. J'ai donc fait ceci :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $mysqli = new mysqli("localhost", "user", "password", "agora");
    if ($mysqli->connect_errno) {
        echo "Echec lors de la connexion à MySQL : (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
    }
    echo $mysqli->host_info . "\n";
     
    $mysqli = new mysqli("127.0.0.1", "user", "password", "database", 3306);
    if ($mysqli->connect_errno) {
        echo "Echec lors de la connexion à MySQL : (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
    }


    et le retour est
    Warning: mysqli::mysqli(): (HY000/2002): No such file or directory in
    Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose.

  4. #4
    Membre extrêmement actif
    Bonjour,

    J'ai modifié mon script pour le host :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $mysqli = new mysqli("localhost", "user", "password", "agora");
    if ($mysqli->connect_errno) {
        echo "Echec lors de la connexion à MySQL : (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
    }
    echo $mysqli->host_info . "\n";
     
    $mysqli = new mysqli("127.0.0.1", "user", "password", "database", 3306);
    if ($mysqli->connect_errno) {
        echo "Echec lors de la connexion à MySQL : (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;


    Et l'erreur qui s'affiche maintenant est :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    MySQL : (2002) Connection refused
    Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose.

  5. #5
    Invité
    Invité(e)
    Bonjour,

    1- Euhhh... Je ne pense pas que Celira te proposais d'utiliser mysqli_, mais juste de tester la connexion avec.

    Le mieux est quand même d'utiliser PDO.

    A LIRE :


    2- Vérifie aussi tes paramètres de connexion à la BDD.
    En local, souvent, "user", "password" vaut "root", "".

  6. #6
    Membre extrêmement actif
    Citation Envoyé par jreaux62 Voir le message
    Bonjour,

    1- Euhhh... Je ne pense pas que Celira te proposais d'utiliser mysqli_, mais juste de tester la connexion avec.

    Le mieux est quand même d'utiliser PDO.

    A LIRE :


    2- Vérifie aussi tes paramètres de connexion à la BDD.
    En local, souvent, "user", "password" vaut "root", "".
    Merci le mysqli est juste pour le test, oui j'utiliserai que le PDO.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    try {
        $dbh = new PDO('mysql:host=localhost:/run/mysqld/mysqld10.sock;dbname=agora', 'root', 'root');
        foreach($dbh->query('SELECT * from FOO') as $row) {
            print_r($row);
        }
        $dbh = null;
    } catch (PDOException $e) {
        print "Erreur !: " . $e->getMessage() . "<br/>";
        die();


    Je garde cette erreur
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Erreur !: SQLSTATE[HY000] [2002] Connection refused


    Les identifiants fonctionnent avec PHPMyAdmin.
    Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose.

  7. #7
    Invité
    Invité(e)
    Je t'ai mis des liens.
    Manifestement, tu n'as pas lu...

  8. #8
    Membre extrêmement actif
    Citation Envoyé par jreaux62 Voir le message
    Je t'ai mis des liens.
    Manifestement, tu n'as pas lu...
    Oui merci pour ces liens que je l'avoue j'avais lu lundi pour voir d'où provenait mon erreur et je ne suis pas retourné depuis.

    J'ai installé sur mon PC le logiciel Agora qui s'est installé tout seul.
    Je l'ai ensuite installé sur mon NAS Synology et impossible de l'installé.
    Je me suis douté qu'il pouvait éventuellement y avoir un problème au niveau de la connexion à la base de données et notamment avec le hostname.
    D'où mon petit script indépendant de test de connexion pour essayer de me connecter.
    L'objectif n'étant pas de réécrire l'accès de agora à la base de données, mais de comprendre quel(s) paramètre(s) je lui donne et qui est faux.

    Et si j'applique ce qu'il y a dans les liens :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    try {
                $pdo = new PDO('mysql:host=localhost:/run/mysqld/mysqld10.sock;port=3306;dbname=agora;charset=utf8','root', 'root', [
                PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_EMULATE_PREPARES   => false
                ]);
             } 
             catch (PDOException $e) {
                throw new InvalidArgumentException('Erreur connexion à la base de données : '.$e->getMessage());
                exit;
             }


    J'ai cette erreur qui est identique à mes autres tests :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Fatal error: Uncaught exception 'InvalidArgumentException' with message 'Erreur connexion à la base de données : SQLSTATE[HY000] [2002] Connection refused' in /volume1/web/agora/test.php:37 Stack trace: #0 {main} thrown in /volume1/web/agora/test.php on line 37


    Tape pas trop fort si l'erreur est une évidence.

    Merci.
    Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose.

  9. #9
    Membre extrêmement actif
    Citation Envoyé par jreaux62 Voir le message
    Je t'ai mis des liens.
    Manifestement, tu n'as pas lu...
    J'ai repris le script de connexion des liens pour faire un autre test :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    <?php
    // @author : rawsrc - 2018 - Pour DVP
    // on vérifie si la fonction de connexion a déjà été définie afin d'éviter de la redéfinir
    if ( ! function_exists('db_connexion')) {
       function db_connexion() {
          // une fois ouverte, on renvoie toujours la même connexion
          static $pdo;
          // on vérifie si la connexion n'a pas déjà été initialisée
          if ( ! ($pdo instanceof PDO)) {
             // tentative d'ouverture de la connexion MySQL
             try {
                $pdo = new PDO('mysql:host=localhost:/run/mysqld/mysqld10.sock;port=3306;dbname=agora;charset=utf8','root', 'root', [
                PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_EMULATE_PREPARES   => false
                ]);
             } 
             catch (PDOException $e) {
                throw new InvalidArgumentException('Erreur connexion à la base de données : '.$e->getMessage());
                exit;
             }
          }
          // renvoi de la ressource : connexion à la base de données
          return $pdo;
       }
    }
    return db_connexion();


    Lorsque je l'exécute, j'ai toujours le même message :
    Fatal error: Uncaught exception 'InvalidArgumentException' with message 'Erreur connexion à la base de données : SQLSTATE[HY000] [2002] Connection refused' in /volume1/web/test_db_mysql.php:18 Stack trace: #0 /volume1/web/test_db_mysql.php(26): db_connexion() #1 /volume1/web/test.php(4): include('/volume1/web/te...') #2 {main} thrown in /volume1/web/test_db_mysql.php on line 18
    Je ne dois pas savoir lire ou mes lunettes peut-être.

    Le type de base de données est MariaDB sur mon Synology.
    Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose.

  10. #10
    Modératrice

    Dans ton dernier test, il y a un truc qui m'embête : tu as à la fois le host et la socket, ça fait un peu beaucoup. Essaye avec : 'mysql:unix_socket=/run/mysqld/mysqld10.sock;port=3306;dbname=agora;charset=utf8'.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  11. #11
    Membre extrêmement actif
    Citation Envoyé par Celira Voir le message
    Dans ton dernier test, il y a un truc qui m'embête : tu as à la fois le host et la socket, ça fait un peu beaucoup. Essaye avec : 'mysql:unix_socket=/run/mysqld/mysqld10.sock;port=3306;dbname=agora;charset=utf8'.
    Merci effectivement je n'ai plus d'anomalie dans mon script de test.

    J'avais choisi
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    host=localhost:/run/mysqld/mysqld10.sock

    Parce que dans d'autres applications web de mon synology, c'était ce qui était enregistré dans le scipt de connexion et ces application fonctionnent.

    Je vais donc essayer d'aller un peu plus loin dans l'installation de mon package agora.
    Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose.

  12. #12
    Membre extrêmement actif
    Citation Envoyé par Celira Voir le message
    Dans ton dernier test, il y a un truc qui m'embête : tu as à la fois le host et la socket, ça fait un peu beaucoup. Essaye avec : 'mysql:unix_socket=/run/mysqld/mysqld10.sock;port=3306;dbname=agora;charset=utf8'.
    Dans le script de connexion du package agora c'est comme ceci :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //CONNEXION À LA BDD
    define("db_host", "unix_socket=/run/mysqld/mysqld10.sock");
    define("db_login", "root");
    define("db_password", "root");
    define("db_name", "agora");


    Et du coup j'ai l'erreur
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Warning: PDO::__construct(): php_network_getaddresses: gethostbyname failed. errno=0 in /volume1/web/agora/app/ModOffline/CtrlOffline.php on line 208


    Le ligne 208 :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    $objPDO=new PDO("mysql:host=".$db_host.";dbname=".$db_name.";charset=utf8;", $db_login, $db_password, array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION));
    Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose.

  13. #13
    Invité
    Invité(e)
    Argh...

    Ce sont des CONSTANTES PHP que tu définis !

    Il ne faut donc pas de $ devant :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    $objPDO=new PDO("mysql:host=".db_host.";dbname=".db_name.";charset=utf8;", db_login, db_password, array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION));


    N.B. Conventionnellement, on écrit les CONSTANTES en MAJUSCULES.
    Ça permet justement de les distinguer.

  14. #14
    Membre extrêmement actif
    Merci, mais c'est le code du soft qui est comme cela et il fonctionne très bien sur mon PC mais pas sur mon synology.
    Donc je laisse "$" en place.

    Enfin il me semble que c'est mieux de ne rien toucher au soft.
    Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose.

  15. #15
    Invité
    Invité(e)
    Pas mieux.

  16. #16
    Modératrice

    Je pense que le problème, c'est que tu as le morceau "host:" en dur dans ton soft. Essaye peut-être d'ajouter un ";" au début de la chaine du host pour voir si il l'ignore au profit de la socket :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    define("db_host", ";unix_socket=/run/mysqld/mysqld10.sock");
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  17. #17
    Membre extrêmement actif
    Citation Envoyé par Celira Voir le message
    Je pense que le problème, c'est que tu as le morceau "host:" en dur dans ton soft. Essaye peut-être d'ajouter un ";" au début de la chaine du host pour voir si il l'ignore au profit de la socket :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    define("db_host", ";unix_socket=/run/mysqld/mysqld10.sock");
    Merci pour cette information que je vais tester.
    J'avais déjà pris le parti de modifier le soft comme ça en suivant ta recommandation :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
     $objPDO=new PDO("mysql:unix_socket=".$db_host.";dbname=".$db_name.";charset=utf8;", $db_login, $db_password, array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION));

    Et c'est clair que la connexion fonctionne maintenant.
    Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose.

  18. #18
    Nouveau membre du Club
    Bonjour

    J'ai aussi un problème de connexion même avec un code que copier d'ici (Comprendre le PDO)

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    try {
        $strConnection = 'mysql:host=mzfs.myd.infomaniak.com;dbname=mzfs_rttans'; //Ligne 1
        $arrExtraParam= array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"); //Ligne 2
        $pdo = new PDO($ConnectStr, ' ', ' ', $arrExtraParam); //Ligne 3; Instancie la connexion
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);//Ligne 4
    }
    catch(PDOException $e) {
        $msg = 'ERREUR PDO dans ' . $e->getFile() . ' L.' . $e->getLine() . ' : ' . $e->getMessage();
        die($msg);
    }
    ?>

    et il m'indique:
    ERREUR PDO dans /home/clients/7f5f92c8e92b09ec7590e92c28bb70ec/web/RTTANS/Membres/maconnexion.php L.13 : invalid data source name
    La ligne 13 est celle
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    $PDO=New PDO($connectStr, 'utilisateur','mot de passe',EtraParam);


    Je pense à un problème avec le fournisseur mais pas sûr du tout!
    Merci d'avance
    Cestmoi

  19. #19
    Invité
    Invité(e)
    Bonjour,

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
        $strConnection = '....';
        ....
        $pdo = new PDO($ConnectStr....

    Tu vois ou pas ?

  20. #20
    Nouveau membre du Club
    Oui je viens de voir!! Merci

###raw>template_hook.ano_emploi###