Question

Problem with PDO php 5.5.9 and mysql 5.4 on Ubuntu 14.04

Hi,

I have created a droplet with one click app LAMP 14.04. I have read several help pages on how to enable PDO and have added extension=pdo.so and extension=pdo_mysql.so -lines to /etc/php5/apache2/php.ini and restarted apache.

In info.php:

Additional .ini files parsed include
/etc/php5/apache2/conf.d/05-opcache.ini, /etc/php5/apache2/conf.d/10-pdo.ini, /etc/php5/apache2/conf.d/20-apcu.ini, /etc/php5/apache2/conf.d/20-gd.ini, /etc/php5/apache2/conf.d/20-json.ini, /etc/php5/apache2/conf.d/20-mysql.ini, /etc/php5/apache2/conf.d/20-mysqli.ini, /etc/php5/apache2/conf.d/20-pdo_mysql.ini, /etc/php5/apache2/conf.d/20-readline.ini 

php -m on the command line shows PDO and pdo_mysql.

I have tried out learn what is wrong for a few hours now and can’t get the problem solved.

Thank you for your help in advance,

Antti Karttunen


Submit an answer


This textbox defaults to using Markdown to format your answer.

You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!

Sign In or Sign Up to Answer

These answers are provided by our Community. If you find them useful, show some love by clicking the heart. If you run into issues leave a comment, or add your own answer to help others.

Accepted Answer

@AnttiKarttunen

I actually work with PHP quite a bit, so if you can share the rest of the class, I can take a look at what’s running to see where there may be an issue. The snippet you provided cites a getPdo method, but I don’t see a reference to that.

As a quick reference, here’s a really simple MySQL Class that uses PDO.

<?php
use PDO;
use PDOException;

class MySql
{
    protected $db;
    protected $dbChar;
    protected $dbHost;
    protected $dbName;
    protected $dbOpts               =   [];
    protected $dbPass;
    protected $dbPort;
    protected $dbUser;
    protected $dsn;
    
    public function __construct( array $params )
    {
        list(
            'dbChar' => $this->dbChar,
            'dbHost' => $this->dbHost,
            'dbName' => $this->dbName,
            'dbOpts' => $this->dbOpts,
            'dbPass' => $this->dbPass,
            'dbPort' => $this->dbPort,
            'dbUser' => $this->dbUser
        ) = $params;

        $this->dsn   = "mysql:";
        $this->dsn  .= "host=$this->dbHost;";
        $this->dsn  .= "dbname=$this->dbName;";

        if ( ! empty( $this->dbPort ) )
        {
            $this->dsn  .= "port=$this->dbPort;";
        }
        else
        {
            $this->dsn  .= "port:3306;";
        }

        if ( ! empty( $this->dbChar ) )
        {
            $this->dsn  .= "charset=$this->dbChar;";
        }
    }

    public function connect()
    {
        try
        {
            $this->db = new PDO( $this->dsn, $this->dbUser, $this->dbPass, $this->dbOpts );

            if ( isset( $this->db ) )
            {
                return $this->db;
            }

            return false;
        }
        catch ( PDOException $e )
        {
            return $e->getMessage();
        }
    }
}

When constructed, you need to pass an array $params, for example:

$params =  [
    'dbChar'                        =>  'utf8',
    'dbHost'                        =>  'localhost',
    'dbName'                        =>  'mysqldbname',
    'dbOpts'                        =>  [
        PDO::ATTR_DEFAULT_FETCH_MODE    =>  PDO::FETCH_OBJ,
        PDO::ATTR_EMULATE_PREPARES      =>  false,
        PDO::ATTR_ERRMODE               =>  PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_PERSISTENT            =>  true,
        PDO::ATTR_TIMEOUT               =>  30
    ],
    'dbPass'                        =>  'mysqldbpass',
    'dbPort'                        =>  '3306',
    'dbUser'                        =>  'mysqldbuser'
];

Note: You’ll need to change mysqldbname, mysqldbpass, and mysqldbuser to match yours.

So to create an instance of this MySql class, I’d use:

$db = new MySql( $params );

To connect, I’d then use:

$dbc = $db->connect();

Now I can run:

$vars    = [
    ':id' => 1
];

$query   = $dbc->prepare('SELECT * FROM tableName WHERE id = :id LIMIT 1');

$query->execute( $vars );

$results = $query->fetchAll();

var_dump( $results );

And that should dump the results from my query.

I just tested this locally and on a Droplet with PHP 7.x and 7.1 and it works, so if you run in to issues with the above, then there most likely is an issue with PDO not working. If that works, then the issue would be in your code.

@AnttiKarttunen

What error(s) are you receiving when trying to make a connection via PDO and what does your code look like (for the connection)?

Try DigitalOcean for free

Click below to sign up and get $200 of credit to try our products over 60 days!

Sign up

Get our biweekly newsletter

Sign up for Infrastructure as a Newsletter.

Hollie's Hub for Good

Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.

Become a contributor

Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.

Welcome to the developer cloud

DigitalOcean makes it simple to launch in the cloud and scale up as you grow — whether you're running one virtual machine or ten thousand.

Learn more
DigitalOcean Cloud Control Panel