php: проблемы с ооп. вероятно, очень простые

#php #mysql #oop

#php #mysql #ооп

Вопрос:

Привет, я следовал руководству и пытался упростить его для своих нужд. Я не могу заставить что-либо работать .. если не уверен, было бы здорово воспользоваться некоторыми советами по отладке!

Вот class.php файл:

 class MySQL{

  public static function connect($set_host, $set_username, $set_password, $set_database){

    mysql_connect("$set_host", "$set_username", "$set_password")or die("cannot connect");
    mysql_select_db("$set_database")or die("cannot select DB");

  }
}

class Posts {  

  public $id;  
  public $title;   

  function __construct($_id, $_title){  

    $this->id = $_id;  
    $this->title = $_title;

  }
}


class Generate {

  function queryPosts(){
    $query = mysql_query("SELECT * FROM posts ORDER BY id DESC");

    $postArray = array();  
    while ($row = mysql_fetch_assoc($query)){  

      $posts = new Posts($row["id"], $row['title']);  
      array_push($postArray, $posts);

    }     
    return $postArray;  
  }  
}
  

и вот индекс:

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>dev</title>
</head>

<body>

<?php  
include ("class.php");  

MySQL::connect('localhost', 'test', 'pass', 'table');  

$blog = Generate();

foreach ($blog as $post)  
{  
    echo $post->title . "<br/>";  
}  
?> 

</body>
</html>
  

Я действительно не могу заставить что-либо генерировать с помощью этого метода. Таблица / данные есть, и я могу отобразить их процедурным образом.. однако я пытаюсь разобраться в методах ооп для этого. Зная меня, это, вероятно, действительно глупая синтаксическая ошибка. Большое спасибо!

Комментарии:

1. возвращает ли он результат запроса к базе данных

Ответ №1:

Вы не используете ключевое слово new, а затем пытаетесь выполнить итерацию по $blog, который является объектом. Вам нужно вызвать метод объекта queryPosts и выполнить итерацию по его результатам.

 ...
$blog = new Generate();
$posts = $blog->queryPosts();

foreach ($posts as $post) {
...
  

Ответ №2:

Вы должны создавать экземпляр Generate с new :

 $blog = new Generate;

foreach($blog->queryPosts() as $postArray){

}
  

Ответ №3:

Еще одна вещь, почему вы ставите «до и после переменной. Это должно быть: mysql_connect($set_host, $set_username, $set_password) или die(«…»);

Ответ №4:

Как вы, возможно, уже знаете, ответ @David’s довольно хорошо решает проблему, однако, поскольку вы сказали, что следуете руководству, я хочу дать вам несколько рекомендаций, чтобы вы не пошли по темному пути PHP.

  • Вам следует рассмотреть возможность размещения разных классов в разных файлах
  • Наличие класса для прямого подключения к базе данных не так уж хорошо, попробуйте подключиться к базе данных с помощью queryPosts метода, а не в index.php файл
  • Для начальных целей реализация доступа к данным, подобная этой, поможет вам обойти проблему, но если вы начнете работать над более профессионально ориентированными приложениями, рассмотрите возможность использования ORM-фреймворка для доступа к данным, такого как Propel или Doctrine

Надеюсь, я смогу помочь!