Lisa
Lisa

Reputation: 416

Uncaught exception 'PDOException' message 'invalid data source name'

I´m trying to connect to my database with PDO and show some blogposts on a page. However I´m getting this error message:

Fatal error: Uncaught exception 'PDOException' with message 'invalid data source name' in index.php on line 61...

I´ve been searching for help but really can´t figure out what is wrong so if anyone have any idea it is much appreciated!

I have a separate connect.inc.php file which is included in the index.php file.

This is the connect.inc.php file:

<?php
class DB extends PDO
{
function database_connection() {
   $db_host = "localhost";
   $db_name = "blogdata";
   $db_user = "username";
   $db_pass = "password";
   try {
   global $db_host, $db_name, $db_user, $db_pass;
   $pdo = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
   }
   catch(PDOException $e) {
   die( 'Query failed: ' . $e->getMessage() );
}
}
}
?>

And this is the section in the index.php file which is pointed out in the error message:

<?php
    require 'connect.inc.php';  
    $db = new DB('blogdata');

    $query = "SELECT * FROM blogposts";
    if ($result = $db->query($query)) {
    while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
        echo ' 
            <section id="content">
            <article class="post_title"><h3> ', $row['title'],' </h3></article>
            <article class="post_message"> ', nl2br ($row['message']),' </article>
            <article class="post_time"> ',$row['time'],' </article>
            </section>
            ';
        }
    } ;
    ?>

Upvotes: 5

Views: 35504

Answers (3)

For future references, you could keep the DB class and refer to the following solution that hasn't much to do with the php class:

enter link description here

Upvotes: 0

gedq
gedq

Reputation: 610

Why are you declaring your DB variables global after initialising them? I can't test it but if memory serves that'll pull in existing values from global, overwriting the ones you've just declared.

I disagree with not using an inherited class though - being able to write a custom constructor means you can set all modes and attributes once and then just call the custom constructor to have it done automatically. Much cleaner than having to do it every time.

Upvotes: 0

Your Common Sense
Your Common Sense

Reputation: 157839

Gotcha.

For some reason you are extending your class from PDO. So, your 'blogdata' is taken as a DSN.

Just get rid of your DB class and use raw PDO

connect.inc.php:

<?php 
$db_host = "localhost";
$db_name = "blogdata";
$db_user = "username";
$db_pass = "password";
$db = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

index.php:

<?php
require 'connect.inc.php'; 

$query = "SELECT * FROM blogposts";
$result = $db->query($query);
while ($row = $result->fetch(PDO::FETCH_ASSOC)) {

Upvotes: 11

Related Questions