使用PDO从MySQL表中选择并显示每页N = 50条记录

时间:2014-11-08 14:19:34

标签: php mysql select pdo

我正在编写一个查询MySQL数据库以显示表中所有记录的脚本。在过去,我有一个带有过程代码的工作解决方案,但现在我想使用PDO和一个类(我已定义的一种PDO包装器)。出于某种原因,我没有看到任何内容,页面已成功加载,但没有显示任何表格,也没有显示数据...但我也没有收到任何错误消息。任何有关调试以下代码的帮助将不胜感激。特别是,我想知道如何在这种情况下调试PDO。 这是list_patients脚本:

<?php

// Ok. Let's define the page title, dynamically: see config.inc.php for details
$page_title = 'Kardia: Patients List';

// First --> Let us then include info regarding the connection to the database, PHP functions, and header section and page title

require('../../includes/config.inc.php');
require('../../includes/class.dataBase.php');
require('../../includes/functions.php');
require('../elements/layouts/header.php');

// Second --> Let's 'Check whether user has the rights to see current page or not

if(!isLoggedIn()) //"isLoggedIn" is a pre-specified function in functions.php file
{
    header('Location: ../index.php');
    die();
}

// Number of records to show per page:

$display = 50;

try  {

// Determine how many pages there are...
if (isset($_GET['p']) && is_numeric($_GET['p'])) { // Already been determined. p = pages

    $pages = $_GET['p'];

} else { // Need to determine.

    // Count the number of records:

    $db = new dataBase(); // istantiate a new object (db) from the class Database
    // Run the query to count number of records in the demographics table


    $stmt = $db -> execute('SELECT COUNT(PID) FROM `demographics`;');



    // setting the fetch mode


    $row = $stmt-> single(PDO::FETCH_NUM);



    $records = $row[0];



    // Calculate the number of pages...
    if ($records > $display) { // More than 1 page.
        $pages = ceil ($records/$display);
    } else {
        $pages = 1;
    }

} // End of p IF.

// Determine where in the database to start returning results...
if (isset($_GET['s']) && is_numeric($_GET['s'])) {
    $start = $_GET['s'];
} else {
    $start = 0;
}

// Determine the sort order...
// Default is by registration date.
$sort = (isset($_GET['sort'])) ? $_GET['sort'] : 'RECRUIT_TS';

// Determine the sorting order:
switch ($sort) {
    case 'name':
        $order_by = 'LASTNAME ASC';
        break;
    case 'dob':
        $order_by = 'DOB ASC';
        break;
    case 'disease_1':
        $order_by = 'DISEASE_1 ASC';
        break;
    case 'ADDRESS':
        $order_by = 'ADDRESS ASC';
        break;
    case 'city':
        $order_by = 'CITY ASC';
        break;
    case 'phone_1':
        $order_by = 'PHONE_1 ASC';
        break;
    case 'email_1':
        $order_by = 'EMAIL_1 ASC';
        break;  
    default:
        $order_by = 'RECRUIT_TS ASC';
        $sort = 'RECRUIT_TS';
        break;
}


// Make the query to build the table subsequently:



$sql = "SELECT CONCAT(LASTNAME, ', ', FIRSTNAME) AS name,
             DATE_FORMAT(DOB,'%M-%d-%Y') AS dob,
             DATE_FORMAT(RECRIT_TS,'%M-%d-%Y') AS reg_date,
             DISEASE_1 as disease,
             ADDRESS as ADDRESS,
             CITY as city,
             PHONE_1 as phone,
             EMAIL_1 as email,
             PID
      FROM `demographics`
      ORDER BY $order_by LIMIT $start, $display";

$result = $db->single($sql);


// Count the number of returned rows:
    $num = $db->rowCount($result);

    if ($num > 0) { // If it ran OK, display the records.




echo '

// Table header. Here the names of the fields have to be reported as they really are (so recruit_d remain recruit_d NOT reg_date)

    <link rel="stylesheet" type="text/css" href= "http://10.0.0.1/public/css/tables.css" media="screen, tv, projection" title="Default" />
    <link rel="stylesheet" type="text/css" href= "http://10.0.0.1/public/css/forms.css" media="screen, tv, projection" title="Default" />
    <link rel="stylesheet" type="text/css" href= "http://10.0.0.1/public/css/validation.css" media="screen, tv, projection" title="Default" />

<body>
    <div id="header" class="full">   
         <h1>List of Patients</h1>
            <div id="inner_header" class="centered">
             <ul>
                <li><a href="home.php">Demographics</a></li>
                <li><a href="#hp_php">History-Physical</a></li>
                <li><a href="#biomark.php">Biomarkers</a></li>
                <li><a href="#ecg.php">ECG</a></li>
                <li><a href="#echo.php">ECHO</a></li>
                <li><a href="#ct_rmn.php">CT-RMN</a></li>
            </ul>
            <br class="clear" />&nbsp;
        </div>
    </div>


    <body>
    ';

    // Print how many users there are:
    echo "<p>There are currently <strong>$num</strong> patients in the DataBase.</p>\n";

    echo '
    <div id="table">
    <table align="center" cellspacing="1" cellpadding="0" width="100%">
    <tr>
        <th>Details/Edit</th>
        <th>Delete</th>
        <th><a href="list_patients.php?sort=name">Name</a></th>
        <th><a href="list_patients.php?sort=dob">Date of Birth</a></th>
        <th><a href="list_patients.php?sort=recruit_d">Date Registered</a></th>
        <th><a href="list_patients.php?sort=disease_1">Primary Disease</a></th>
        <th><a href="list_patients.php?sort=ADDRESS">Address</a></th>
        <th><a href="list_patients.php?sort=city">City</a></th>
        <th><a href="list_patients.php?sort=phone_1">Phone Number</a></th>
        <th><a href="list_patients.php?sort=email_1">Email</a></th>
    </tr>
            ';

// Fetch and print all the records....

 $bg = 'transparent'; // Set the initial background color.

        while($row = $db->single(PDO::FETCH_ASSOC)) {


     $bg = ($bg=='#eeeeee' ? '#ffffff' : '#eeeeee'); // Switch the background color (Ternary Operator).

     // Be CAREFULL HERE: you have to report the fields with the names defined in the AS part of the query NOT their real names !
     // so "recruit_d" becomes "reg_date", disease_1 simply disease, etc... 
     // Besides, pay attention on the occurrence of <a href="edit_patient.php?id=' . $row['pid'] . '" --> This define the $id var 
     // used later on to Update or Delete the patient !  
        echo '<tr bgcolor="' . $bg . '">
            <td align="left"><a href="edit_patient.php?id=' . $row['pid'] . '" 
                              style="background-color: transparent; color: #4169E1; font-weight: 700";>Details-Edit</a></td>
            <td align="left"><a href="delete_patient.php?id=' . $row['pid'] . '"
                              style="background-color: transparent; color: #4169E1; font-weight: 700";>Delete</a></td>
            <td align="left">' . $row['name'] . '</td>
            <td align="left">' . $row['dob'] . '</td> 
            <td align="left">' . $row['reg_date'] . '</td> 
            <td align="left">' . $row['disease'] . '</td>
            <td align="left">' . $row['ADDRESS'] . '</td>
            <td align="left">' . $row['city'] . '</td>
            <td align="left">' . $row['phone'] . '</td>
            <td align="left">' . $row['email'] . '</td>
        </tr>
        ';
    } // End of WHILE loop

    echo '
        </table>
    </div>
            ';




// Make the links to other pages, if necessary.
if ($pages >= 1) {

    echo '<br /><p>';
    $current_page = ($start/$display) + 1;

    // If it's not the first page, make a Previous button:
    if ($current_page != 1) {
        echo '<a href="list_patients.php?s=' . ($start - $display) . '&p=' . $pages . '&sort=' . $sort . '">Previous</a> ';
    }

    // Make all the numbered pages:
    for ($i = 1; $i <= $pages; $i++) {
        if ($i != $current_page) {
            echo '<a href="list_patients.php?s=' . (($display * ($i - 1))) . '&p=' . $pages . '&sort=' . $sort . '">' . $i . '</a> ';
        } else {
            echo $i . ' ';
        }
    } // End of FOR loop.

    // If it's not the last page, make a Next button:
    if ($current_page != $pages) {
        echo '<a href="list_patients.php?s=' . ($start + $display) . '&p=' . $pages . '&sort=' . $sort . '">Next</a>';
    }

    echo '</p>'; // Close the paragraph.


    } else { // If it did not run OK.



    } // End of links section.




} // End of if $num > 0 IF

 } catch (PDOException $e) {

    echo '<p class="error"> An Error Occurred: ' . $e->getMessage() . '</p>'; // Report the Error

}
?>
<?php
    // Let us  include the footer
    require_once '../elements/layouts/footer.php';
    exit();
?>

这是我定义为PDO包装器的class.DataBase

class dataBase extends PDO{
    private $host      = 'localhost';
    private $user      = 'root';
    private $pass      = '';
    private $dbname    = 'kardia';
    private $port      = '3306';

    private $dbh;
    private $error;

    public function __construct(){
        // Set DSN
        $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname . ';port' . $this->port;
        // Set options (i.e. set PDO Attrbutes, to define what exceptions to catch)
        $options = array(
            PDO::ATTR_PERSISTENT    => true,
            PDO::ATTR_ERRMODE       => PDO::ERRMODE_EXCEPTION
        );
        // Create a new PDO instance
        try{
            $this->dbh = new PDO($dsn, $this->user, $this->pass, $options);
        }
            // Catch any errors
        catch(PDOException $e){
            $this->error = '<p class="error"> An Error Occurred: ' . $e->getMessage() . '</p>';
        }
    }
    // let us define the stmt attribute
        private $stmt;

        public function query($sql){
            $this->stmt = $this->dbh->prepare($sql);
        }

        public function bind($param, $value, $type = null){
            if (is_null($type)) {
                switch (true) {
                    case is_int($value):
                        $type = PDO::PARAM_INT;
                        break;
                    case is_bool($value):
                        $type = PDO::PARAM_BOOL;
                        break;
                    case is_null($value):
                        $type = PDO::PARAM_NULL;
                        break;
                    default:
                        $type = PDO::PARAM_STR;
                }
            }
            $this->stmt->bindValue($param, $value, $type);

        }

        public function execute(){
            return $this->stmt->execute();
        }

        public function resultset(){
            $this->execute();
            return $this->stmt->fetchAll(PDO::FETCH_ASSOC);
        }

        public function single(){
            $this->execute();
            return $this->stmt->fetch(PDO::FETCH_ASSOC);
        }

        public function rowCount(){
            return $this->stmt->rowCount();
        }

        public function lastId(){
            return $this->dbh->lastInsertId();
        }

        public function debugDumpParams(){
            return $this->stmt->debugDumpParams();
        }

}

1 个答案:

答案 0 :(得分:0)

此代码及其编写的样式存在很多错误。

要回答有关调试事项的问题,请使用print_r($ data)和var_dump($ data),其中$ data是您想知道的值。

另外,你不需要回应所有事情。您可以将HTML放在PHP文件中,它仍将呈现为HTML,前提是它不在标记内。例如:

<?php 
// your PHP code
?>

<strong>Some HTML table code here.</strong>

<?php 
// more PHP code here
?>

我首先要废弃所有的表格和HTML代码,然后确保使用数据库类从数据库中获取相关数据,并使用print_r($data);

在PHP中打印结果

然后我会考虑将其转化为HTML。