0

I am connecting to mysql via PDO:

$instance = new PDO("mysql:host=$server;dbname=$database;", $username, $password);

I want to:

  • create and maintain a single/reusable connection per database
  • make sure that the connection has been set up properly

This is discussed on stackoverflow, the top answer seems like a good solution: How to properly set up a PDO connection

I've tried to use this code to create a connection to the database, but when I load the page there are no errors but a white page (it doesn't work):

    class StructureFactory{
    protected $provider = null;
    protected $connection = null;

    public function __construct( callable $provider )
    {
        $this->provider = $provider;
    }

    public function create( $name)
    {
        if ( $this->connection === null )
        {
            $this->connection = call_user_func( $this->provider );
        }
        return new $name( $this->connection );
    }
}

$server = 'localhost';
$username = 'dbuser';
$password = 'password';
$database = 'mydb';

$provider = function(){
    $instance = new PDO("mysql:host=$server;dbname=$database;", $username, $password);
    $instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $instance->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    return $instance;
};

$factory = new StructureFactory( $provider );

$something = $factory->create('Something');

The final line of code breaks the php script, why is this? How do I correctly implement the solution from StackOverflow?

Community
  • 1
  • 1
  • Turn on your error reporting and chances are there will be more than a white page. Otherwise, your code above doesn't actually output anything, so what else would you expect than a white page. – Markus AO Jan 09 '17 at 06:26
  • There is HTML which normally displays, and error reporting is enabled. So the final line, $something = $factory->create('Something'); , completely breaks php somehow with no error to report. using: ini_set('display_errors', 'On'); and (PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); – NurFACEGAMES Jan 09 '17 at 08:06
  • OK. Then: Why would you pass 'Something' into your `create()`? The line `new $name( $this->connection )` would evaluate as `new Something(...)`, is that what you're attempting to do here? Ie. do you have a class `Something` that accepts a PDO object as its argument? – Markus AO Jan 09 '17 at 08:32
  • You are aware that this factory pattern is only suitable for instantiating classes that accept a PDO object as the argument, right? Do you really want to use such a setup? Why not simplify it to a singleton factory that simply returns the requested object type (e.g. PDO), and then inject it into your classes outside the factory? I really don't see the benefit in delegating object instantiation to the factory here. – Markus AO Jan 09 '17 at 08:51

0 Answers0