我正在编写一个查询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" />
</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 :(得分: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);
然后我会考虑将其转化为HTML。