php 一個動作在兩個以上的地方用到,怎麼提出?

給個假設

$do->query(
        "INSERT INTO `abc` (
          `public_order_id`,
          `add_time`,
          `status`
        )
        VALUES (
          '{$public_order_id}',
          '{$add_time}',
          '已取消'
        ) "
      );

$do->query(
        "INSERT INTO `abc` (
          `public_order_id`,
          `add_time`,
          `status`
        )
        VALUES (
          '{$public_order_id}',
          '{$add_time}',
          '已完成'
        ) "
      );

假設我這個動作會用到的地方兩個以上
但是唯一會變得就是 status
A是「已取消」
B會變成「已完成」
到其他地方又會有另外的狀態
其他都一樣,
那這樣的 mysql query 怎麼提出?
原本想說放在 function 但是不行~


想到一個問題

假設如果要讓function 可以用外面的值
我可以用 global 來讓外面的值進來 function
但是如果他不是長這樣 $abc 而是這樣 $_SESSION['id'] 和 $oder['id'] 呢?

$abc = 1;
function XXX() {
global $abc;
echo $abc; // 可顯示
}

阅读 475
评论 更新于 2019-01-06
    1 个回答
    零玖
    • 7.7k

    如果你这全部都是手写 SQL 那就封装成对象,依赖一下 $do 就行了,即传参的时候把 $do 也传过去

    function changeOrderStatus($do,$status,$public_order_id,$add_time){
       return $do->query(
            "INSERT INTO `abc` (
              `public_order_id`,
              `add_time`,
              `status`
            )
            VALUES (
              '{$public_order_id}',
              '{$add_time}',
              '已完成'
            ) "
          );
    }

    一般来说 上面这样就够了 ,但是从良好的实践出发,原则上一个方法的参数不超过两个,两个以上就应该当成对象处理,所以这里简单处理一下。

    假定你的 add_time 就是取得当前时间,$status有默认值。

    function changeOrderStatus($db,$params){
        // 这里的 $db 最好做好 类型判断 判断
        if(!$db instanceof \PDO){
            throw new \Exception('$db not a PDO object instance.');
        }
        $params = array_merge([
            'status'=>'已完成',//status 默认值
            'public_order_id'=>null,
            'add_time'=>date('Y-m-d H:i:s'),
        ],$params);
        if(empty($params['public_order_id'])){
            throw new \Exception('public_order_id is must.');
        }
        return $db->query(
            vprintf('INSERT INTO `abc` (`public_order_id`,`add_time`,`status`) 
                VALUES ("%s","%s","%s");',
                    $params['public_order_id']
                    ,$params['add_time']
                    ,$params['status']
            )
        );
    }
    // Call
    changeOrderStatus($do,[
        'status'=>'已取消',
        'public_order_id'=>1,
    ]);

    以上代码未测试。

    评论 赞赏 2019-01-06
      撰写回答

      登录后参与交流、获取后续更新提醒