[php] PDO vide

Le problème exposé dans ce sujet a été résolu.

Bonjour,
Dans le fichier config.php, j’aimerais qu’une variable $db contenant mon objet PDO soit accessible dans tout le projet pour pouvoir y accéder dans mes controllers. Voici à quoi ressemble ce fichier pour le moment :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
<?php

$conf['debug'] = True;

$conf['host'] = 'localhost';
$conf['user'] = 'root';
$conf['pass'] = '';
$conf['dbname'] = 'fileshare';

try {
  $db = new PDO('mysql:host='.$conf['host'].';dbname='.$conf['dbname'].';charset=utf8', $conf['user'], $conf['pass']);

  var_dump($db);

  if($conf['debug']) {
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
  }
} catch (Exception $e) {
  die($e->getMessage());
}

Le var_dump($db) me renvoie ça :

1
object(PDO)#1 (0) { } 

J’ai vérifié mes identifiants pour mysql, c’est bien 'root':''. Du coup je ne comprend pas pourquoi il ne veut pas me créer mon objet PDO… J’utilise PHP 7.

Merci à vous ! :)

J’était droit en train de bosser sur un script PHP avec une base de donnée en PDO, et si je fais un var_dump() j’ai exactement le même résultat que toi et ma base de donnée fonctionne, donc c’est bien le résultat attendu.

Pourrais-tu nous montrer un extrait de ton script où tu appelles $db ?

Mais avant cela essaye juste, en haut de ton script où tu fais la requête de faire global $db; ;)

Ah bah tant mieux alors !

Du coup l’erreur est :

1
Notice: Undefined variable: db in D:\xampp\htdocs\fileshare\src\controllers\users.php on line 14

Mon fichier users.php ressemble à ça (un peu tronqué) :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<?php
require_once __DIR__.'/../models/User.php';
require_once __DIR__.'/../managers/UsersManager.php';

$user = $app['controllers_factory'];

$user->get('/{pseudo}', function($pseudo) {
  $m = new UsersManager($db); // l'erreur est ici..
  $user = $m->get_with_pseudo($pseudo);

  return 'You requested '.$user->pseudo().'.';
});

return $user;

Ce fichier est inclus par le fichier routes.php :

1
2
<?php
$app->mount("/user", include(__DIR__.'/../src/controllers/users.php'));

Qui est lui même inclus par le fichier index.php :

1
2
3
4
5
6
7
8
9
<?php
require_once __DIR__.'/../app/config.php';
require_once __DIR__.'/../vendor/autoload.php';

$app = new Silex\Application();
$app['debug'] = $conf['debug'];

require_once __DIR__.'/../app/routes.php';
$app->run();

global $db; ne change rien et j’ai l’impression que c’est pas une bonne pratique aussi. :-°

Peut-être est-ce une particularité de Symphony ? (Je ne sais pas comment se passe la portée des variables la dedans..)

Et sinon, peut-être que je dis une immense bêtise, mais ne pourrais-tu pas mettre ta variable de base de donnée dans une variable $_SESSION ?) Mais je ne sais pas du tout si cette pratique est déprécié où non..

Edit: @Tleb, sa variable est créé dans config.php qui est inclu dans index.php, donc théoriquement on a accès à la variable dans index.php, et si c’est pas le cas, c’est la preuve que ça fais trop longtemps que j’ai mis le PHP de côté :p

+0 -0

Je pense pas que Silex touche les variables (il y a moyen de les lister, donc on doit pouvoir les supprimer dynamiquement).

Non, $_SESSION est pour bien autre chose.

En théorie oui, mais en théorie, il devrait avoir accès à sa variable depuis son users.php.

Je te conseille de return un array dans ton fichier de config et récupérer la valeur avec le require. Tu aurras comme ça accès sans problème à toute ta config, stocké dans une variable.

J’ai suivi ton conseil, j’ai return l’array $conf en y ajoutant $db. J’ai ensuite rajouté dans mon index.php :

1
2
$conf = require_once __DIR__.'/../app/config.php';
$db = $conf['db'];

Mais ça ne change rien…
Le truc, c’est que la variable $db existe bien dans le fichier users.php puisqu’un var_dump($db) dans ce fichier me renvoie bien la même chose que dans le fichier config.php. Mais dès que je fais mon var_dump($db) dans la fonction $user->get(..), il me dit que $db vaut NULL… Je comprend pas trop pourquoi. :/

Or dans ce genre de fonction, on a pas accès au contexte extérieur. :/

Dans toute fonction, anonyme ou pas, tu as un nouveau scope donc les variables extérieures, à moins d’un global (ou $GLOBALS) ne sont pas "importées".

Le plus simple ici, est encore d’écrire : $user->get('/{pseudo}', function($pseudo) use($db) { pour justement importer $db.

+3 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte