Organizing a PHP page with a bunch of $_POST's


Organizing a PHP page with a bunch of $_POST's

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

所有相关内容都在网站内的一个PHP页面上,其中包括来自网站其他部分的"includes",如购物车、积分审核、产品等,但在整个页面中,用户会单击表单提交按钮,通过$_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值?

谢谢!:)

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

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

按照mvc设想,您有一个控制器Product,它处理所有的产品操作。骨架可能是这样的(假设函数action_x将在请求yoursite.com/product/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函数。

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

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

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

喜欢view.php接口文件和logic.php是您的逻辑文件,然后是

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

所有的逻辑都在这个文件中

简单MVC

好吧,我似乎必须解释一下。

  1. POST处理程序中有多少IF语句绝对无关紧要。你目前的设计是可以的,没有理由要求或改变它。

  2. 您可能只想在设计中添加一个前控制器,它将同时执行实体(cart)和操作("add"),并调用$cart类的add()方法。这些方法可以将一个存储在类源中的另一个之下
    尽管这是一个相当大的改进,需要对整个网站的架构进行重新思考。所以,你可以坚持你现在的。

  3. 至于其他问题,如何显示错误,这里有一个答案:php重定向不起作用