2012-05-14 6 views
0

Я пытаюсь отчаянно двигаться в направлении ООП, но просто не могу окутать голову, когда его использовать. Я получаю механики, но когда их использовать, просто не щелкайте. Мне интересно, если мой нынешний сценарий созрел для подхода ООП.PHP OOP vs Inline

У меня есть 3 страницы. Details.php показывает две бок о бок divs. Один, где пользователь может добавить заметку и другую, где они могут видеть предыдущие заметки, хранящиеся в MySQL. Они могут добавлять заметки и извлекать заметки с помощью функции AJAX в Details.php. Функция javascript вызывает add_notes.php для добавления заметок в базу данных, и она вызывает load_notes.php для загрузки заметок на странице через Jquery .load(), а также при отправке новой заметки для обновления div.

Я новичок, но я чувствую, что в костях есть лучший способ организовать этот код. Я бы посмотрел в рамки, но я глубоко в этом проекте, так что я ищу идеи ООП о том, как разбить это лучше или проверить, что я делаю это как можно более оптимизированным образом. Все комментарии полезны!

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> 

ADD ПРИМЕЧАНИЯ 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; 

?> 

. НАГРУЗКИ 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; 
    } 
?> 

Что это позволяет сделать лучше организовать и использовать функциональные возможности без необходимости дублирования кода или охоты вокруг вашего кодовую. Например, скажем, я хочу начать печатать дату вставки для каждой заметки определенным образом на всех страницах. Как мне это сделать? Я могу потенциально изменить каждую страницу на сайте.

Если мы правильно определили сеттеры и геттеры, это станет чрезвычайно простой задачей. Я должен заменить только форматированный возвращаемой строки в 1 (очень очевидно) расположение:

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

Правда, все это кажется очень чрезмерным и отнимает много времени на малых масштабах. Я помню, как я создал персональный сайт для себя в колледже, когда у меня был обширный опыт ОО. В то время я изучал PHP, и для сайта я обычно использовал встроенный код просто для скорости. Он работал отлично, был очень быстрым и легким. Я не понимал hullabaloo над веб-каркасами, поскольку они чувствовали себя слишком «тяжелыми».

Проблемы возникают после факта во время технического обслуживания. Когда вы вернетесь к коду через 6 месяцев или лет, вы попытаетесь выяснить, где был этот звонок, или почему вы должны изменить его в 8 местах, чтобы исправить ошибку. Это чувства, вызванные плохой связью - сплоченность в вашей кодовой базе.

К счастью, многие структуры возникли на протяжении многих лет, чтобы не только поддерживать, но и поощрять и обеспечивать соблюдение такого поведения. Если вы этого не сделали, я настоятельно рекомендую изучить CakePHP или Code Igniter. Они оба довольно легкие для более компактных фреймворков, которые действительно пригоняют эти концепции хорошо, а также предоставляют отличные вводные учебники, которые помогут вам создать блог-сайт.

Надеюсь, это поможет. Дайте мне знать, если я пропустил что-нибудь, и я обновлю это по мере необходимости.

+0

Спасибо за помощь Бен! Итак, в моем примере вы переместили все в один класс? Совергли бы вы javascript и все в один класс, а затем называете echo $ newnote-> show_notes(); на главной странице? Geez, я чувствую, что я близок к пониманию, когда использовать классы, но просто не могу добраться туда по какой-то причине. –

+1

Настоящая цель - пробиться к Model-View-Controller, но опять же, чтобы упростить, я бы сказал, если вы вытаскиваете из базы данных, эта таблица должна иметь класс. Храните ваши клиентские языки (html, css, js) в своих файлах. Когда вам нужны данные, как вы предложили, просто обратитесь к классу. –

+0

Хорошо, что помогает много. Благодаря! Хотелось бы, чтобы я начал с рамки, но я не ожидал, что мой первый проект будет таким большим. Теперь, когда я на колене, мне нужно найти способы двигаться в правильном направлении. Совет помогает. –