2014-11-08 95 views
0

我正在研究查询MySQL数据库以显示表中所有记录的脚本。在过去,我得到了一个有程序代码的工作解决方案,但现在我想使用PDO和一个类(我定义的一种PDO包装)。出于某种原因,我什么都看不到,页面加载成功,但没有显示表格和数据......我也没有收到错误信息。任何帮助调试下面的代码将不胜感激。特别是,我想知道如何在这种情况下调试PDO。 这是list_patients脚本:从PDO的MySQL表中选择并显示每页50条记录

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

} 

回答

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代码开始,只用确保你得到的相关数据从数据库中使用数据库类,并打印在PHP结果print_r($data);

然后我会考虑把它变成正常工作的HTML。

+0

非常感谢您的回复和建议。我已经分离了HTML和PHP,摆脱了那些回声''的句子,并且我也尝试了print_r不同的变量......但是,我得到了页眉,然后是空白页。最后,我手动测试了SQL查询并且没有错误,但是我在屏幕上看不到任何东西...... – Diego 2014-11-08 15:05:55

+0

如果您只是在标题下方看到白色,或许您未登录?你的脚本到底有多远?你有开启PHP错误吗?如果没有,请将其放在代码顶部: error_reporting(-1); ini_set('display_errors','On'); – 2014-11-08 15:12:13

+0

不...脚本处于成功登录过程(正确完成)后才运行的页面,并且在配置文件(我没有为简洁起见而在此报道)中打开Excdeptions。显然这个构造会产生问题:$ stmt = $ db - > execute('SELECT COUNT(PID)FROM'demographics';');尽管查询在PHPMyAdmin中运行正常...脚本停在这里......也许这个命令和类有问题? – Diego 2014-11-08 15:20:33

相关问题