2014-01-17 3 views
1

데이터베이스 처리가 클래스에 있도록 두 코드 스 니펫을 클래스에 넣을 수 있습니까? PDO 연결처럼 또는 데이터베이스와 관련된 모든 것을 클래스에 넣으면 어떻게 할 것입니까?클래스에 PHP 코드가 있습니까?

다음은 서로 다른 파일의 코드 두 부분입니다. 블로그 응용 프로그램을 개발하려고합니다.

<?php 
mysql_connect("localhost", "root", "")or die(mysql_error()); 
mysql_select_db("blogg1")or die(mysql_error()); 
if(isset($_POST["submit"])){ 
$title = $_POST["title"]; 
$category = $_POST["category"]; 
$content = $_POST ["content"]; 

mysql_query("INSERT INTO blogdata(title , category , content) VALUES('$title', '$category', '$content')"); 
}else{ 
?> 



<?php 
     mysql_connect("localhost", "root", "")or die(mysql_error()); 
     mysql_select_db("blogg1")or die(mysql_error()); 
     $sql = mysql_query("SELECT * FROM blogdata ORDER BY id DESC")or die(mysql_error());; 
     while($row = mysql_fetch_array($sql)){ 
     $title = $row["title"]; 
     $category = $row["category"]; 
     $content = $row["content"]; 


     ?> 

     <table border = "1"> 
     <tr><td><?php echo $title; ?></td><td><?php echo $category; ?></td></tr> 
     <tr><td colspan="2"><?php echo $content; ?></td></tr> 
    </table> 
     <?php 
     } 
     ?> 
+0

정확히 무엇이 궁금합니까? –

+0

여기 >>> http://www.php.net/manual/en/language.oop5.php –

+1

mysql_ * 함수 대신 PDO를 사용해야합니다. mysql_ * 함수가 더 이상 사용되지 않음 –

답변

1

먼저 폴더에 별도의 PHP 파일에 데이터베이스 자격 증명을 유지해야을 ~/lib/db.php와 같이 웹에서 액세스 할 수 없습니다.

<?php 
    define('SQL_HOST', 'localhost'); 
    define('SQL_DATABASE', 'your-db-name'); 
    define('SQL_USER', 'your-db-user'); 
    define('SQL_PASS', 'your-db-password'); 
?> 

그런 다음 데이터베이스 클래스 (도 ~/lib 디렉토리에서) :

<?php 
    require_once('~/lib/db.php'); 
    require_once('~/lib/BlogData.php'); 
    class Database 
    { 
     protected $db = null; 

     function __construct() 
     { 
      // db connection options 
      $driverOptions = array(
       PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'", 
       PDO::ATTR_ERRMODE    => PDO::ERRMODE_EXCEPTION, 
       PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ, 
       PDO::ATTR_EMULATE_PREPARES  => false 
      ); 

      // set new connection 
      $this->db = PDO(
       "mysql:dbname=".SQL_DATABASE.";host=".SQL_HOST, 
       SQL_USER, SQL_PASS, $driverOptions 
      );    
     } 

     // This function lets you fetch blog data using any sort order you'd like and any WHERE criteria you want 
     function getBlogData($where = "1", $orderBy = "id DESC") 
     { 
      $stmt = $this->db->prepare(" 
       SELECT * 
       FROM {'blogdata'} WHERE $where 
       ORDER BY $orderBy 
      "); 
      $blogData = Array(); 
      if ($stmt->execute()) 
      { 
       while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
        $oneBlogData = new BlogData($this); 
        $oneBlogData->init($row); 
        $blogData[] = $oneBlogData; 
       } 
      } 
      return $blogData; 
     } 

     function insertBlogData(BlogData $blogData) 
     { 
      $stmt = $this->db->prepare(" 
       INSERT INTO {'blogdata'} (title , category , content) VALUES 
       (:title, :category, :content); 
      "); 

      $stmt->bindParam(':title', $blogData->title, PDO::PARAM_STR); 
      $stmt->bindParam(':category', $blogData->category, PDO::PARAM_STR); 
      $stmt->bindParam(':content', $blogData->content, PDO::PARAM_STR); 
      $stmt->execute(); 
     } 
    } 
?> 

가 그럼 난 당신의 블로그 데이터를 다른 클래스를 정의하는 것입니다 :

<?php 
    class BlogData { 
     public $title; 
     public $category; 
     public $content; 
     private $db; 

     function __construct(Database $db) 
     { 
      $this->db = $db; 
     } 
     function init($dbRow) 
     { 
      $this->title = $dbRow['title']; 
      $this->category = $dbRow['category']; 
      $this->content = $dbRow['content']; 
     } 
     function save() 
     { 
      // TODO: Write sql statement to save the row... 
     } 
    } 
?> 

를 다음 코드의 첫 번째 블록을 만들 수있는 새로운 BlogData 이 같은 항목 :

<?php 
    require_once('~/lib/Database.php'); 
    $db = new Database(); 
    if(isset($_POST["submit"])) 
    { 
     $blogData = new BlogData($db); 
     $blogData->title = $_POST["title"]; 
     $blogData->category = $_POST["category"]; 
     $blogData->content = $_POST["content"]; 
     $db->insertBlogData($blogData); 
    } 
?> 

그리고 코드의 두 번째 블록은 다음과 같이 수 :

<?php 
    require_once('~/lib/Database.php'); 
    $db = new Database(); 
    $blogDataArray = $db->getBlogData("1", "id DESC"); 
    echo "<table border = '1'>"; 
    foreach($blogDataArray as $blogData) 
    { 
     echo "<tr><td>" . $blogData->title . "</td><td>" . $blogData->category . "</td></tr>"; 
     echo "<tr><td colspan='2'>" . $blogData->content . "</td></tr>"; 
    } 
    echo "</table>"; 
?> 

또한 BlogData 항목을 수정하는 것이 매우 쉽습니다. getBlogData 함수를 사용하여 데이터베이스에서 블로그 데이터를 가져오고 값을 변경하고 save를 호출하여 객체를 수정하면됩니다. 예를 들면 다음과 같습니다.

<?php 
    // ... 
    $newContent = "New Content"; 
    $blogData = $db->getBlogData("id='1'"); 
    $blogData->content = $newContent; 
    $blogData->save(); 
?> 

또한 블로그 데이터 항목에 고유 한 필드가 필요하다는 것을 분명히 지적해야합니다. 어떤 ID를 사용하면 addToDatabase를 작성하고 하나의 함수로 저장하는 것이 더 쉬울 것이다.

+0

이 답변을 게시하는 데 많은 시간을 보냈지 만, 슬프게도 오래되어서 아주 나쁜 코딩 방법으로 가득차 있습니다. 그래서 제가 -1, 당신의 대답은 아마도 구글을 통해 여기에 도착한 사람들이 ** 사용해서는 안되는 ** 것을 권장하기 때문입니다. 우리는 구식 mysql_ * 확장의 필요성을 대체하는이 시대와 시대에 PDO를 보유하고 있습니다. –

+0

mysql_ *을 사용하는 이유는 OP가 PDO에 익숙하지 않고 PHP에 비교적 익숙하지 않기 때문입니다. 그는 코드를 클래스로 분리 할 수있는 방법을 찾고 있습니다. 그 코드는 내가 익숙한 관행을 사용하여 보여준 것입니다. 그렇게하면 동시에 수업과 PDO를 알아 내려고하지 않아도됩니다. 필자는 결국 PDO를 사용하겠다고 말했지만, 적어도 OP는 클래스로 분리 된 다음 데이터베이스 클래스 만 변경하면 PDO로 업데이트 할 수 있습니다. – Guy

+0

그리고 그것은 당신이하지 말아야 할 것입니다. 만약 누군가가 잘못된 길을 간다면 적절한 것을 보여줌으로써 도움을 줄 수 있습니다. 이미 오염 된 주제를 더 이상 오염시키지 않아야합니다.예를 PDO로 바꾸고 싶다면 기꺼이 내 downvote를 제거 할 것입니다. –

0

코드 예제 아래를 참조하십시오 :

class SomeClass { 

    protected $db = null; 
    protected $table = 'blogdata'; 

    public function __construct() 
    { 
     // db connection options 
     $driverOptions = array(
      PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'", 
      PDO::ATTR_ERRMODE    => PDO::ERRMODE_EXCEPTION, 
      PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ, 
     ); 

     // set new connection 
     $this->db = PDO(
      "mysql:dbname=blogg1;host=localhost", 
      'root', '', $driverOptions 
     ); 
    } 

    public function save($data) 
    { 
     // prepare your data 
     $title = $data["title"]; 
     $category = $data["category"]; 
     $content = $data ["content"]; 

     // prepare statement 
     $stmt = $this->db->prepare(" 
      INSERT INTO {$this->table} (title , category , content) VALUES 
      (:title, :category, :content); 
     "); 

     $stmt->bindParam(':title', $title, PDO::PARAM_STR); 
     $stmt->bindParam(':category', $category, PDO::PARAM_STR); 
     $stmt->bindParam(':content', $content, PDO::PARAM_STR); 
     $stmt->execute();  
    } 

    public function getRecords() 
    { 
     $stmt = $this->db->prepare(" 
      SELECT * 
      FROM {$this->table} 
      ORDER BY id DESC 
     "); 
     $stmt->execute(); 
     return $stmt->fetchAll(); 
    } 
} 

그리고 사용 예 :

<?php 

require_once('SomeClass.php'); 
$ent = new SomeClass(); 

if (isset($_POST["submit"])) { 
    $ent->save($_POST); 
} 
else { 

    // get and output 
    $records = $ent->getRecords(); 

    if (count($records) > 0) { 
?> 
<table> 
    <?php 
     foreach ($records as $record) { 
      echo "<tr><td>{$record->title}</td><td>{$record->category}</td></tr> 
      <tr><td colspan='2'>{$record->content}</td></tr>"; 
     } 
    ?> 
</table>