This is my first attempt at PHP PDO. I needed to get data from two tables in my MySQL database. I'm pleased to say the code works, and I was just wondering if what I've done is correct.


// MySQL Database Connection
$db = new PDO('mysql:host=localhost;dbname=database;charset=utf8mb4', 'root', '');
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

// Display Data
foreach($db->query('SELECT * FROM data1 LEFT JOIN data2 ON data1.id = data2.id WHERE data1.id=1') as $row) {
    // Data is displayed in their respected places.

<!doctype html>

<html lang="en">
<meta charset="utf-8">

<meta name="description" content="Description">
<meta name="author" content="Author">

<link rel="stylesheet" href="css/styles.css">

<!--[if lt IE 9]>
<script src="https://cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.js"></script>

<table border="1">
        <td><?php echo $row['sample1']; ?></td>
        <td><?php echo $row['sample2']; ?></td>
        <td><?php echo $row['extra1']; ?></td>
        <td><?php echo $row['extra2']; ?></td>
  • \$\begingroup\$ This is not working code as, at a minimum, you would need another iteration through data set to echo out the results to the table. Show your whole code. \$\endgroup\$
    – Mike Brant
    Sep 8, 2016 at 17:35
  • \$\begingroup\$ Yes it is, the code is working on my end, the above is the whole code from my php file, the only thing "missing" is my database dump. \$\endgroup\$
    – ToCode
    Sep 10, 2016 at 9:18
  • \$\begingroup\$ If you think something is "missing" in the code please can you expand on this, thank you very much. \$\endgroup\$
    – ToCode
    Sep 10, 2016 at 9:26
  • \$\begingroup\$ The is no code inside your for each that deals with the result set. \$\endgroup\$
    – Mike Brant
    Sep 12, 2016 at 4:00
  • \$\begingroup\$ It's working for me though. \$\endgroup\$
    – ToCode
    Sep 12, 2016 at 7:30

1 Answer 1



Don't have an empty foreach loop... ever. Similarly, just because php lets $row escape from the context it is in does not mean you should use it after the foreach-loop is over.


I recommend against using PDO::query, especially because you lack a thorough understanding of what you are doing. You can use it when executing complete static queries (those that do not have variables), but you already have a where-clause in that sql statement and it is only a matter of time until you want to change that to something dynamic. Use PDO::prepare instead.


You are using $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);. Good. Except that you do not use prepared statements at all. Keep in mind that your mysql driver must be able to use native prepared statements too.


You are setting the error mode to PDO::ERRMODE_EXCEPTION. Good. Except that you do not catch any of them and instead let the page return blank.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.