dongyin2643 2017-09-01 08:28
浏览 7
已采纳

如何让这个脚本缩短?

$time = date("G");

$location = unserialize(file_get_contents('http://www.geoplugin.net/php.gp?ip='.$_SERVER['REMOTE_ADDR']));

$countrycode = $location['geoplugin_countryCode'];

    switch($time){
    case 0:
    $conn->query("UPDATE link SET visits_at_00 = visits_at_00 + 1 WHERE id = '$id'");
    break;
    case 1:
    $conn->query("UPDATE link SET visits_at_01 = visits_at_01 + 1 WHERE id = '$id'");
    break;
    case 2:
    $conn->query("UPDATE link SET visits_at_02 = visits_at_02 + 1 WHERE id = '$id'");
    break;
    case 3:
    $conn->query("UPDATE link SET visits_at_03 = visits_at_03 + 1 WHERE id = '$id'");
    break;
    case 4:
    $conn->query("UPDATE link SET visits_at_04 = visits_at_04 + 1 WHERE id = '$id'");
    break;
    case 5:
    $conn->query("UPDATE link SET visits_at_05 = visits_at_05 + 1 WHERE id = '$id'");
    break;
    case 6:
    $conn->query("UPDATE link SET visits_at_06 = visits_at_06 + 1 WHERE id = '$id'");
    break;
    case 7:
    $conn->query("UPDATE link SET visits_at_07 = visits_at_07 + 1 WHERE id = '$id'");
    break;
    case 8:
    $conn->query("UPDATE link SET visits_at_08 = visits_at_08 + 1 WHERE id = '$id'");
    break;
    case 9:
    $conn->query("UPDATE link SET visits_at_09 = visits_at_09 + 1 WHERE id = '$id'");
    break;
    case 10:
    $conn->query("UPDATE link SET visits_at_10 = visits_at_10 + 1 WHERE id = '$id'");
    break;
    case 11:
    $conn->query("UPDATE link SET visits_at_11 = visits_at_11 + 1 WHERE id = '$id'");
    break;
    case 12:
    $conn->query("UPDATE link SET visits_at_12 = visits_at_12 + 1 WHERE id = '$id'");
    break;
    case 13:
    $conn->query("UPDATE link SET visits_at_13 = visits_at_13 + 1 WHERE id = '$id'");
    break;
    case 14:
    $conn->query("UPDATE link SET visits_at_14 = visits_at_14 + 1 WHERE id = '$id'");
    break;
    case 15:
    $conn->query("UPDATE link SET visits_at_15 = visits_at_15 + 1 WHERE id = '$id'");
    break;
    case 16:
    $conn->query("UPDATE link SET visits_at_16 = visits_at_16 + 1 WHERE id = '$id'");
    break;
    case 17:
    $conn->query("UPDATE link SET visits_at_17 = visits_at_17 + 1 WHERE id = '$id'");
    break;
    case 18:
    $conn->query("UPDATE link SET visits_at_18 = visits_at_18 + 1 WHERE id = '$id'");
    break;
    case 19:
    $conn->query("UPDATE link SET visits_at_19 = visits_at_19 + 1 WHERE id = '$id'");
    break;
    case 20:
    $conn->query("UPDATE link SET visits_at_20 = visits_at_20 + 1 WHERE id = '$id'");
    break;
    case 21:
    $conn->query("UPDATE link SET visits_at_21 = visits_at_21 + 1 WHERE id = '$id'");
    break;
    case 22:
    $conn->query("UPDATE link SET visits_at_22 = visits_at_22 + 1 WHERE id = '$id'");
    break;
    case 23:
    $conn->query("UPDATE link SET visits_at_23 = visits_at_23 + 1 WHERE id = '$id'");
    break;
    }

    switch($countrycode){
    case "US":
    $conn->query("UPDATE link SET visits_from_us = visits_from_us + 1 WHERE id = '$id'");
    break;
    case "DE":
    $conn->query("UPDATE link SET visits_from_de = visits_from_de + 1 WHERE id = '$id'");
    break;
    case "FR":
    $conn->query("UPDATE link SET visits_from_fr = visits_from_fr + 1 WHERE id = '$id'");
    break;
    case "MX":
    $conn->query("UPDATE link SET visits_from_mx = visits_from_mx + 1 WHERE id = '$id'");
    break;
    case "TR":
    $conn->query("UPDATE link SET visits_from_tr = visits_from_tr + 1 WHERE id = '$id'");
    break;
    case "IT":
    $conn->query("UPDATE link SET visits_from_it = visits_from_it + 1 WHERE id = '$id'");
    break;
    case "RU":
    $conn->query("UPDATE link SET visits_from_ru = visits_from_ru + 1 WHERE id = '$id'");
    break;
    case "ES":
    $conn->query("UPDATE link SET visits_from_es = visits_from_es + 1 WHERE id = '$id'");
    break;
    case "CN":
    $conn->query("UPDATE link SET visits_from_cn = visits_from_cn+ 1 WHERE id = '$id'");
    break;
    case "AU":
    $conn->query("UPDATE link SET visits_from_au = visits_from_au + 1 WHERE id = '$id'");
    break;
    case "IN":
    $conn->query("UPDATE link SET visits_from_in = visits_from_in + 1 WHERE id = '$id'");
    break;
    case "EN":
    $conn->query("UPDATE link SET visits_from_en = visits_from_en + 1 WHERE id = '$id'");
    break;
    case "CA":
    $conn->query("UPDATE link SET visits_from_ca = visits_from_ca + 1 WHERE id = '$id'");
    break;
    case "SA":
    $conn->query("UPDATE link SETvisits_from_sa = visits_from_sa + 1 WHERE id = '$id'");
    break;
    }

First, I know that this looks crappy, and I have to prepare statements and validate the data, and all that. Anyway I want first to build a basic content, and I want to make this way shorter, now I know how to make a short script with multiple that contains the same steps, but here I don't know where to start, and what to do. Please help me to get some ideas and examples.

  • 写回答

3条回答 默认 最新

  • dongmen1925 2017-09-01 08:40
    关注

    Instead of switch you can validate the value of $time and $countrycode and then use it to generate proper query.

    Here's an example of how it could look like. Of course I didn't run it, so it may not work just by copy&pasting it.

    $time = date("G");
    
    $location = unserialize(file_get_contents('http://www.geoplugin.net/php.gp?ip='.$_SERVER['REMOTE_ADDR']));
    
    $countrycode = $location['geoplugin_countryCode'];
    
    //validation 0<=time<=23
    if(0<=$time && $time <= 23) {
        //modify $time to format with leading zero for digits.
        $index = str_pad($time, 2, '0', STR_PAD_LEFT);
        // use it for the query.
        $conn->query("UPDATE link SET visits_at_$index = visits_at_$index + 1 WHERE id = '$id'");
    }
    
    // array of all country codes. 
    // I've added only three, and you should add here the rest of valid codes
    $availableCountryCodes = array('US', 'DE', 'FR'); 
    //validate if the country code is in the array, which means it's valid
    if(in_array($countrycode, $availableCountryCodes)) {   
        // make it lower case as it's the required format for the query 
        $lowerCountryCode = strtolower($countrycode);
        // use it for the query
        $conn->query("UPDATE link SET visits_from_$lowerCountryCode = visits_from_$lowerCountryCode + 1 WHERE id = '$id'");
    }
    

    EDIT:

    As @okante noted in the comment it can be optimized to make it one UPDATE query as you're updating the same row twice.

    $time = date("G");
    
    $location = unserialize(file_get_contents('http://www.geoplugin.net/php.gp?ip='.$_SERVER['REMOTE_ADDR']));
    
    $countrycode = $location['geoplugin_countryCode'];
    
    $fields = array();
    
    //validation 0<=time<=23
    if(0<=$time && $time <= 23) {
        //modify $time to format with leading zero for digits.
        $index = str_pad($time, 2, '0', STR_PAD_LEFT);
        // add to $fields array for later use
        $fields[] = "visits_at_$index = visits_at_$index + 1";
    }
    
    // array of all country codes. 
    // I've added only three, and you should add here the rest of valid codes
    $availableCountryCodes = array('US', 'DE', 'FR'); 
    //validate if the country code is in the array, which means it's valid
    if(in_array($countrycode, $availableCountryCodes)) {   
        // make it lower case as it's the required format for the query 
        $lowerCountryCode = strtolower($countrycode);
        // add to $fields array for later use
        $fields[] = "visits_from_$lowerCountryCode = visits_from_$lowerCountryCode + 1";
    }
    
    // if there's somehting to update
    if($fields) {
        // concat the update parts with a comma
        $concatedFields = implode(', ', $fields);
        // and the final query
        $conn->query("UPDATE link SET $concatedFields WHERE id = '$id'");
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等
  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
  • ¥15 神经网络怎么把隐含层变量融合到损失函数中?
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行
  • ¥20 测距传感器数据手册i2c