Php 如何缩短此脚本的长度?

Php 如何缩短此脚本的长度?,php,mysqli,Php,Mysqli,首先,我知道这看起来很糟糕,我必须准备语句和验证数据,等等。无论如何,我想先建立一个基本的内容,我想把这个方法缩短,现在我知道如何制作一个包含多个相同步骤的简短脚本,但在这里我不知道从哪里开始,以及做什么。请帮助我获得一些想法和示例。在您的情况下,无需使用switch或foreach循环,它很简单 $time = date("G"); $location = unserialize(file_get_contents('http://www.geoplugin.net/php.gp?ip='.

首先,我知道这看起来很糟糕,我必须准备语句和验证数据,等等。无论如何,我想先建立一个基本的内容,我想把这个方法缩短,现在我知道如何制作一个包含多个相同步骤的简短脚本,但在这里我不知道从哪里开始,以及做什么。请帮助我获得一些想法和示例。

在您的情况下,无需使用switch或foreach循环,它很简单

$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;
    }
我直接用数据库字段本身替换相关变量

它会起作用的

编辑

正如在的文档中所述,该预定义函数用于使字符串小写


类似的功能是

而不是
开关
您可以验证
$time
$countrycode
的值,然后使用它生成正确的查询

下面是一个例子,说明它可能是什么样子。当然,我没有运行它,所以它可能不工作,只是通过复制和粘贴它

$time = date("G");
$location = unserialize(file_get_contents('http://www.geoplugin.net/php.gp?ip=' . $_SERVER['REMOTE_ADDR']));
$countrycode = $location['geoplugin_countryCode'];
$time = sprintf("%02d", $time);
$conn->query("UPDATE link SET visits_at_$time = visits_at_$time + 1 WHERE id = '$id'");
$conn->query("UPDATE link SET visits_from_".strtolower($countrycode)." = visits_from_".strtolower($countrycode)." + 1 WHERE id = '$id'");

假设您不打算对代码做太多更改,也不打算重新组织数据库,也不打算使用或处理可能的错误,那么您可以使用变量来构造查询

注:
使用获取前导零的小时数
在双引号字符串中的变量周围使用({})
用于将字符串从大写转换为小写
使用1
UPDATE
sql语句设置数据库中的值

$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'");
}

你应该重新考虑你的数据库结构/规范化你的数据库。正如你所看到的,我在这方面做得非常糟糕,所以我不知道该怎么做
“更新链接集访问\u在\u 0”+$time+“=访问\u在\u 0”+$time+“+1其中id=“$id”
?@TGrif:你确定+是php中的串联吗?我会在修复上述代码的同时重新审视你的数据库结构,这将很快成为维护的噩梦。。。此外,上面关于连接字符串以使查询可能打开SQL注入的建议。没错,要优化,您还可以将两个更新组合在一个查询中。我还添加了带有单个
UPDATE
query的优化示例。您在字段[]处忘记了一美元和一个semilokon,但我很高兴看到有人,他们不仅投了反对票,而且提供了帮助,因为我了解所有基本部分,但到目前为止还不能将它们结合起来形成一个概念,还有像你这样的人,我可以学习专业人士是如何做到这一点并获得想法的:)非常感谢你也$availableCountryCodes在数组中是错误的,但它工作得非常完美@I.Dynin,只是一个问题,为什么您的表没有这样的结构:链接(
id
访问
来自
位于
);使用主键=(
id
from
at
)您需要更新此部分
在0$time访问
,因为所有数字(如010、011)都添加了前导零。使用
sprintf(“%02d”,$time)
获得一位数的前导零。这也很好,你能解释一下strtolower是做什么的吗?哦,现在我明白了,不需要解释这需要一些验证,因为你永远不应该信任来自外部来源的数据。我同意你的看法,但它不是外部数据/表单发布数据/获取请求数据。这和我们在哪里可以应用一些验证完全不同,你不同意吗?我会重新组织我的数据库,但首先给我一些想法,改变什么,为所有这些数据创建一个自己的表?@I.Dynin你应该问一个关于表结构的单独问题,并询问如何优化它。。。基本上,您已经在代码中识别出重复的东西是不好的,数据库也是如此
$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'");
}
$hour = date("H");

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

$countrycode = strtolower($location['geoplugin_countryCode']);

$visitsAtColumn = 'visits_at_' . $hour;
$visitsFromColumn = 'visits_from_' . $countrycode;
$sql = "UPDATE link SET {$visitsAtColumn} = {$visitsAtColumn} + 1, {$visitsFromColumn} = {$visitsFromColumn} + 1 WHERE id = '{$id}'";
$conn->query($sql);