Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用PDO从MySQL表中选择并显示N=50条记录/页_Php_Mysql_Select_Pdo - Fatal编程技术网

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

Php 使用PDO从MySQL表中选择并显示N=50条记录/页,php,mysql,select,pdo,Php,Mysql,Select,Pdo,我正在编写一个查询MySQL数据库以显示表中所有记录的脚本。在过去,我有一个使用过程代码的工作解决方案,但现在我想使用PDO和我定义的一种PDO包装器类。由于某些原因,我没有看到任何东西,页面已成功加载,但没有显示任何表和数据…但我也没有收到任何错误消息。如果您能在调试以下代码时提供帮助,我们将不胜感激。特别是,我想知道在这种情况下如何调试PDO。 以下是患者脚本列表: <?php // Ok. Let's define the page title, dynamically: see

我正在编写一个查询MySQL数据库以显示表中所有记录的脚本。在过去,我有一个使用过程代码的工作解决方案,但现在我想使用PDO和我定义的一种PDO包装器类。由于某些原因,我没有看到任何东西,页面已成功加载,但没有显示任何表和数据…但我也没有收到任何错误消息。如果您能在调试以下代码时提供帮助,我们将不胜感激。特别是,我想知道在这种情况下如何调试PDO。 以下是患者脚本列表:

<?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();
        }

}

这段代码及其编写风格有太多错误

要回答有关调试的问题,请使用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。

非常感谢您的回复和建议。我已经分离了HTML和PHP,去掉了那些重复的句子,我还尝试了打印不同的变量……不过,我还是得到了标题,然后是一个空白页面。最后,我已经手动测试了SQL查询,没有错误,但是我在屏幕上还看不到任何东西……如果你只看到标题下方的白色,也许你没有登录?你的脚本到底能运行多久?您是否打开了PHP错误?如果没有,请将其放在代码的顶部:error_reporting-1;ini_设置“显示错误”、“打开”;不…该脚本位于页面中,只有在成功完成正确的登录过程并在配置文件中打开EXCEDEPTIONS后才能运行。为了简洁起见,我在这里没有报告。显然,这个构造正在产生问题:$stmt=$db->execute'SELECT COUNTPID FROM demographics;';虽然查询在PHPMyAdmin中运行正常…脚本在这里停止…可能是该命令和类有问题吗?请确保您有完整的错误报告。我已经尝试了您的数据库类,并将其用于我的测试数据库中的一个基本查询,它的错误:致命错误:对C:\xampp\htdocs\euler\17\index.php中非对象执行的成员函数的调用,第58行还有语法错误$stmt=$db->应该是$stmt=$db->不要在$db和->之间放置空格。