2013-11-24 6 views
0

У меня возникла проблема с классом базы данных, который я создал. Когда я пытаюсь отобразить данные, находящиеся в таблице, данные не отображаются, но он все еще передает базу данных-> select().Ошибка класса базы данных - php

<?php 

class database { 

private $DBhost = "localhost"; 
private $DBuser = "username"; 
private $DBpass = "password"; 
private $DBname = "database"; 

private $PDO = null; 
private $stmt = null; 

function __construct() { 
    $this->PDO = new PDO("mysql:host=" . $this->DBhost . ";dbname=" . $this->DBname . ";charset=utf8", $this->DBuser, $this->DBpass); 
} 

function __destruct() { 
    $this->PDO = null; 
} 

function select($query, $param = array()) { 
    try { 
    $this->stmt = $this->PDO->prepare($query); 
    if (count($param) != 0) { 
     $this->stmt->execute($param); 
    } else { 
     $this->stmt->execute(); 
    } 
    } catch(Exception $ex) { 
    $this->error($ex); 
    return false; 
    } 
} 



function resultset() { 
    return $this->stmt->fetchAll(); 
} 

function error($ex) { 
    die('Something broke :('); 
} 
} 
?> 

Я пытаюсь использовать это для отображения данных в таблице html, как показано на следующей странице.

<?php 
include 'code/db.php'; 
$DB = new database(); 
?> 
<html> 
<head> 
    <title>List</title> 
</head> 
<body> 
<table> 
    <tr> 
    <th>First Name</th> 
    <th>Last Name</th> 
    <th>Email</th> 
    <th>Phone number</th> 
    <th>Mobile number</th> 
    <th>Address</th> 
    <th>State</th> 
    <th>Post Code</th> 
    <th>Settings</th> 
    </tr> 
<?php 
$DB->select('SELECT * FROM owners ORDER BY first_name, last_name'); 

while($line = $DB->resultset()) { 
    echo "<tr>"; 
    echo "<td>" . $line['first_name'] . "</td>"; 
    echo "<td>" . $line['last_name'] . "</td>"; 
    echo "<td>" . $line['email'] . "</td>"; 
    echo "<td>" . $line['phone_number'] . "</td>"; 
    echo "<td>" . $line['mobile_number'] . "</td>"; 
    echo "<td>" . $line['address'] . "</td>"; 
    echo "<td>" . $line['state'] . "</td>"; 
    echo "<td>" . $line['post_code'] . "</td>"; 
    echo '<td><a href="item-list?id=' . $line['id'] . '">Details</a><a href="edit-owner?id=' . $line['id'] . '"</a></td>'; 
    echo "</tr>"; 
} 

?> 
</table> 
</body> 
</html> 

Если вы могли бы помочь мне с этим, это было бы здорово.

ответ

0

Вы используете fetchAll в своей функции resultset. Весь массив выбранных значений будет возвращен и сохранен в $line. Тогда вам придется перебирать его.

Изменение функция:

function resultset() { 
    return $this->stmt->fetch(PDO::FETCH_ASSOC); 
} 
0

Изменение этой линии

while($line = $DB->resultset()) { 

в

foreach($DB->resultset() as $line) { 
1

PDO уже класс базы данных, вам не нужны никакие другие. Особенно такой сдержанный. Вы просто вырыли себе огромную ловушку с этим бесполезным классом, и вскоре вы попадете в него.

Так, просто держать сырой ПДО:

<?php 

$DBhost = "localhost"; 
$DBuser = "username"; 
$DBpass = "password"; 
$DBname = "database"; 

$dsn = "mysql:host=$DBhostdbname=$DBname;charset=utf8"; 
$PDO = new PDO($dsn, $DBuser, $DBpass); 
$PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

То, что вы на самом деле нужно отделить SQL от HTML. Итак, сначала получите все свои данные, а затем используйте любой шаблон для его вывода.

<?php 
include 'code/db.php'; 
$stm = $PDO->query('SELECT * FROM owners ORDER BY first_name, last_name'); 
$data = $stm->fetchAll(); 
?> 
<html> 
<head> 
    <title>List</title> 
</head> 
<body> 
<table> 
    <tr> 
    <th>First Name</th> 
    <th>Last Name</th> 
    <th>Email</th> 
    <th>Phone number</th> 
    <th>Mobile number</th> 
    <th>Address</th> 
    <th>State</th> 
    <th>Post Code</th> 
    <th>Settings</th> 
    </tr> 
<?php foreach($data as $line):?> 
    <tr> 
    <td><?=$line['first_name']?></td> 
    <td><?=$line['last_name']?></td> 
    <td> 
     <a href="item-list?id=<?=$line['id']?>">Details</a> 
     <a href="edit-owner?id=<?=$line['id']?>Owner</a> 
    </td> 
    </tr> 
<?php endforeach ?> 
</table> 
</body> 
</html> 
+0

Что происходит, когда изменяется пароль его базы данных? Хотя я согласен с тем, что создание всех этих глупых функций для упаковки функций PDO больно больше, чем помогает (и у меня есть разработчики, которые это делают, обычно те, кто не понимает _why_ PDO-функции делают то, что они делают) Я согласен с OP, что небольшой класс оболочки PDO может быть полезным. Особенно, когда классы (и, следовательно, пароли) хранятся вне каталога 'public_html'. – dotancohen

+0

1. Я не понимаю ваш вопрос о пароле. 2. Я не понимаю ваше заявление о полезной обертке. –

+0

Я указывал на преимущества наличия класса оболочки PDO. С одной стороны, мы можем изменить пароль, не используя Perl, чтобы изменить текст в сотнях или тысячах файлов. – dotancohen

Смежные вопросы