使用一堆$ _POST组织一个PHP页面

时间:2012-02-21 11:27:30

标签: php code-organization

我正在用PHP制作相当大的在线积分/购买系统,并且只是有一个基本问题。

所有相关内容都在网站的单个PHP页面上,包含来自网站其他部分的“包含”,例如购物车,积分评论,产品等......但是整个页面中都有用户单击表单提交按钮以通过$ _POST传递值。

由于所有这些内容都有一个主页,我在页面顶部有一个部分,它接受所有POST值并根据它们做出决定,如下所示:

if($_POST['add']) {
    $product_id = $_POST['add'];
}

if($_POST['remove']) {
       $rid = $_POST['id'];
       $cart->del_item($rid);                   
}
if($_POST['empty']){    
   $cart->empty_cart();
} 
if($_POST['purchase']) {
   foreach($cart->get_contents() as $item) {
     $sql="INSERT INTO wp_scloyalty_orders VALUES (".$user_id.", ".$item['id'].")";
     $result=mysql_query($sql);
   }

   $cart->empty_cart();
   unset($_SESSION['cart']);            
}       
if($_POST['add']) {
   query_posts('post_type=prizes&showposts=-1&p='.$product_id.''); 

    while (have_posts()) : the_post(); 
   $my_meta = get_post_meta($post->ID,'_my_meta',TRUE);


   if($calctotalnew > $my_meta['pointsvalue']){
      $cart->add_item(get_the_id(), 1, $my_meta['pointsvalue'], get_the_title());
   } else {
      echo 'You do not have sufficient points to redeem this product...';
   }

endwhile; 
wp_reset_query();  
}

所以我的问题是......这真的是一种组织系统的好方法,让表单操作转到表单所在的同一页面,并有大量的IF语句来决定如何处理POST值?

谢谢! :)

3 个答案:

答案 0 :(得分:3)

通常最好在单独的操作中捕获单独的POST调用(按类型分组)。我通常如下:

第1页有一个表格,将提交给例如。 product.php?行动=添加。在product.php中,您可以将“添加”操作路由到函数add_product()(或其他)。然后,当添加产品时,只需将用户标题回主页(或您想要的任何页面)。这立即解决了刷新帖子的问题(用户刷新了将再次发送相同数据的页面)。

在mvc之后想象你有一个控制器Product来处理所有的产品动作​​。骨架可能看起来像这样(假设在请求yoursite.com/product/x时将执行函数action_x):

class Product_Controller {
    function action_show() {
    }

    function action_update() {
    }

    function action_delete() {
    }
}

如果您的框架支持某种默认操作,您可以路由您的操作:

function action_default() {
    if(method_exists(array($this, 'action_'. $_POST['action']))) {
        return call_user_method('action_'. $_POST['action'], $this);
    }
}
如果没有控制器类,可以实现同样的目的;

if(function_exists('action_'. $_POST['action'])) {
    call_user_func('action_'. $_POST['action']);
}

function action_show() { }
...

并说明评论中的讨论;

function action_update() {
    // do some update logic, query an UPDATE to mysql etc.
    if($result) {
        // optionally save a success message
        Message::add('Your record has been updated');
        header('Location: main_page.php'); // or another intelligent redirect function
    } else {
        Message::add('Sorry, something went wrong');
        header('Location: error_page.php'); // or also main_page
    }
}

这也将使您的代码更清晰,因为更新/添加/删除内容与显示内容完全不同,这将阻止您混淆内容。如果你想跳过重定向,你甚至可以在更新功能中调用show函数。

但最终这是一个选择问题,由实用主义或你的框架引导;)

我希望这能解释一切,不要犹豫要求澄清

答案 1 :(得分:2)

如果您想将逻辑与接口分开,那么您可以简单地创建新文件并将所有与逻辑和数据库相关的代码放在该文件中,并在视图文件中包含OR要求该文件

像 view.php接口文件和 logic.php是你的逻辑文件

view.php中的第一行是 require_once(logic.php');

并且所有逻辑都在此文件中

简单的MVC

答案 2 :(得分:1)

好吧,我似乎要解释一下。

  1. POST处理程序中有多少IF语句无关紧要。您当前的设计没问题,也没有理由要求或改变它。

  2. 您可能希望在设计中添加的唯一内容是前端控制器,它将同时采用实体(购物车)和操作(“添加”)并调用add() $ cart类的方法。这些方法可以在类源中存储一个 虽然这是一个非常巨大的改进,但需要对整个站点架构进行重新思考。所以,你可能会坚持使用现有的。

  3. 至于您的其他问题,如何显示错误,以下是答案:php redirection not working