2012-05-14 103 views
0

我正拼命地朝着OOP方向發展,但我無法將自己的頭包裹在何時使用它。我得到的機制,但何時使用它們只是不點擊。我很好奇,如果我目前的方案已經成熟的OOP方法。PHP OOP vs Inline

我有3頁。 Details.php顯示了兩個並排的div。用戶可以在其中添加一個筆記,另一個用戶可以在其中查看存儲在MySQL中的以前的筆記。他們可以通過Details.php中的AJAX函數添加筆記並提取筆記。 javascript函數調用add_notes.php來向數據庫添加註釋,並調用load_notes.php通過Jquery .load()加載頁面上的註釋,以及當提交新註釋刷新div時。

我是一個新手,但我覺得在我的骨頭裏有一個更好的方法來組織這段代碼。我會研究一個框架,但是我對這個項目深感不安,所以尋找OOP的想法來更好地解決這個問題,或者驗證我正在以儘可能精簡的方式進行操作。所有評論都很有幫助!

DETAILS.PHP

<script type="text/javascript"> 
$(document).ready(function(){ 
//When loading page load notes/messages tables and then reload when ajax is done   
$('#note_holder').load('load_notes.php?subcat=<? echo $subcat;?>'); 
    //onclick handler send message btn 
    $("#notes_submit").click(function(){ 
     $(this).closest('form').submit(function(){ 
      return false; 
     }); 
     var frm = $(this).closest('form');    
     var data = $(frm).serialize(); 
      if($(frm).valid()){         
        $.post( 
          "../php/add_notes_ajax.php", 
          data, 
          function(data){        
           $('#note_holder').load('load_notes.php?subcat=<? echo $subcat;?>'); 
          } 
        ); 
      } 
    });   
}); 
</script> 

<div style="float:left; margin-left:15px;"> 
    <form name="messages1" class="form" id="myforma" method="post" action="#" enctype="multipart/form-data"> 
     <fieldset style="width:500px; height:400px; overflow:auto; font-size:11px;"> 
      <legend>Click to View Previous Notes/Messages</legend>    
      <div style="height:350px; overflow:auto;" class="note_holder" id="note_holder"> 
      <!--This div is being called from the ajax script to load add_notes_ajax.php-->    
      </div>   
     </fieldset> 
     <div style="margin-top:20px;"></div> 
    </form>  
</div> 

<div style=" float:right;"> 
    <form name="notes" class="notes" id="notes" method="post" action="#" enctype="multipart/form-data"> 
    <fieldset style="width:300px; height:400px;"> 
     <legend>Enter a Note</legend> 
     <div style="margin-top:00px;"></div> 
     <div> 
    <textarea rows="20" cols="20" style="height:300px; width:290px;" name="notes"></textarea> 
    <input type="submit" name="notes_submit" id="notes_submit" value="Submit Note" class="button" /> 
    <input type="hidden" name="subcat" value= "<?php echo $subcat; ?>" /> 
     </div> 
    </fieldset> 
    <div style="margin-top:20px;"></div> 
    </form> 
</div> 

筆錄AJAX.PHP

<?php 
include_once('../bootstrap.php'); 
include_once('../site_globals/common_functions.php'); 
include_once('../site_globals/common_queries.php'); 
include_once('../php/gump.class.php'); 
page_protect(); 
error_reporting(0); 

$firstname = filter($_SESSION['user_name']); 
$myid  = filter($_SESSION['user_id']); 

// All the variables from the submission form 
$notes  = filter($_POST['notes']); 
$subcat = filter($_POST['subcat']); 

//Insert Notes into the database 

    $stmt = $dbh->prepare(' 
     INSERT INTO `notes` 
      (date , sub_cat_id , notes) 
     VALUES 
      (:date , :subcat , :notes) 
      '); 
    $stmt->bindValue('subcat', $subcat); 
    $stmt->bindValue('date', date('Y-m-d H:i:s')); 
    $stmt->bindValue('notes', $notes); 
    $stmt->execute();  

echo "This note was added successfully"; 
exit; 

?> 

。 LOAD NOTES.PHP

<table width="100%"> 
    <thead style="text-align:left; "> 
    <tr style="font-size:14px; font-weight:bold;"> 
     <!-- <th><input class="check-all" type="checkbox" /></th>--> 
     <th>Date</th> 
     <th >Contents</th> 
     <th>Preview/Print</th> 
    </tr> 
    </thead> 
    <?php while ($messages_row = mysql_fetch_object($messages_res)):?> 
    <tr> 
    <td><a target="_blank" href="../site_hospital_files/thread.php?question_id=<?php echo $messages_row->question_id;?>"><?php echo substr($messages_row->reply, 0, 20) . '...';?></a></td> 
    <td><?php echo date('Y-m-d', strtotime($messages_row->date_added));?></td> 
    <td><a href="../site_hospital_files/pdf_messages_notes.php?msg_id=<?php echo $messages_row->question_id;?>&amp;var1=<?php echo $subcat;?>">Create PDF</a></td> 
    </tr> 
    <?php endwhile;?> 
    <?php while($notes_row = $notes_res->fetch(PDO::FETCH_ASSOC)):?> 
    <tr> 
    <td><?php echo $notes_row[date]; ?></td> 
    <td><?php echo substr($notes_row[notes], 0, 50).'...';?></td> 
    <td><a href="pdf_messages_notes.php?note_id=<?php echo $notes_row->sub_cat_id; ?>&var1=<?php echo $subcat;?>">View</a></td> 
    </tr> 
    <?php endwhile;?> 
</table> 
+0

在這一點上我不會太在意。總是有改進的方法,但你所做的並不差。很高興看到您使用PDO! –

+2

...但爲什麼隨機'mysql_fetch_object'? – deceze

+1

這個問題更適合於http://codereview.stackexchange.com,而不是在這裏。 – deceze

回答

3

這絕對是。鑑於MySQL和其他關係數據庫的關係性質,定義您的PHP對象和mysql表的代碼表示非常容易。考慮這種過於簡單的類:

<?php 
    class Note { 
     private $id 
     private $text; 
     private $insert_dt; 
     private $update_dt; 
    } 
?> 

這是什麼讓你做的是更好地組織和無需在你的代碼庫中的代碼複製或狩獵重用功能。例如,假設我想要在所有頁面上以特定方式開始輸出每個筆記的插入日期。我將如何做到這一點?我可能必須更改網站上的每個頁面。

如果我們有正確定義的setter和getter,這成爲一項非常簡單的任務。我應該只需要更換格式返回字符串在1(非常明顯)位置:

<?php 
    class Note { 
     // ... 
     public function getFormattedInsertDate() { 
      return date("M, Y", $this->insert_dt); 
     } 
    } 
?> 

誠然,這一切似乎很過分的和費時的小規模。我記得當我有豐富的面向對象方面的經驗時,在大學裏爲自己建立一個私人網站。我當時在學習PHP,爲了速度,我傾向於使用內聯代碼。它運行良好,非常快速和輕量級。我不明白網頁框架的喧囂,因爲他們感覺過度「沉重」。

問題出現在維護期間之後。當您在6個月或數年後返回代碼時,您可以嘗試找出此通話的位置,或者爲什麼必須在8個位置更改以修復錯誤。這些是由於糟糕的耦合 - 你的代碼庫中的內聚引起的感覺。

幸運的是,多年來出現了許多框架,不僅支持,而且鼓勵和強化這種行爲。如果你沒有,我會強烈建議尋找CakePHP或Code Igniter。它們都非常易於精簡框架,這些框架確實很好地指出了這些概念,並提供了出色的入門教程來引導您創建博客網站。

我希望這會有所幫助。如果我錯過了任何內容,請告知我,我會根據需要更新。

+0

感謝您的幫助Ben!那麼在我的例子中,你會把所有東西都移動到一個類中?你會把javascript和所有東西都放到一個類中,然後調用echo $ newnote-> show_notes();在你的主頁上? Geez,我覺得我已經接近了解何時使用類,但由於某種原因不能完全達到目的。 –

+1

真正的目標是讓自己的方式來模型視圖控制器,但再次,爲了簡化,我會說如果你從數據庫拉,該表應該有一個類。將您的客戶語言(html,css,js)保存在自己的文件中。當你需要數據時,如你所建議的,只需引用該類。 –

+0

好的,這有助於很多。謝謝!我希望我會從一個框架開始,但我並沒有預料到我的第一個項目會如此之大。現在我的膝蓋很深,我需要找到向正確方向前進的方法。建議有幫助。 –