【问题标题】:What am I doing wrong [closed]我做错了什么[关闭]
【发布时间】:2013-02-08 15:12:34
【问题描述】:

我已经为此苦苦挣扎了一两个星期,但我似乎无法解决它。这是我的脚本:

<?php
$Domain = $_SERVER['SERVER_NAME'];
$paryDomain = explode(".",$Domain);
$Array = count($paryDomain);
$RootDomain = "";
$G_SYSTEMID = "";

if ($Array == "1")
{
    $RootDomain = $paryDomain[0].'.'.$paryDomain[1];
}    
elseif ($Array == "2")
{
    $RootDomain = $paryDomain[1].'.'.$paryDomain[2];
}

if ($RootDomain == "storeboard.com")
{
    $G_SYSTEMID = 1;
}
elseif ($RootDomain == "dcwn.org")
{
    $G_SYSTEMID = 2;
}

echo $G_SYSTEMID;
echo "------------";

?>

为什么最后 1 或 2.. 都没有结果?

任何帮助将不胜感激。

Neojakey

【问题讨论】:

  • 我会说明显的原因是 $RootDomain 也不是您比较的字符串...也许您可以回显它并查看实际值是什么...?
  • 开始在整个逻辑的不同点回显变量,看看它们从哪里开始不是你所期望的。
  • “我做错了什么”
  • 也许你应该检查为 INTEGER 而不是 STRING...$Array == "1" 是字符串,因为 $Array == 1 是 INTEGER。如果你 count($var); 你会得到 INTEGER 的结果。
  • 使用 var_dump($paryDomain) 查看您的爆炸操作的内容,这可能会有所帮助。其他的,试试用strcmp比较字符串php.net/manual/en/function.strcmp.php

标签: php explode server-variables


【解决方案1】:
if ($Array == 1)
{
    $RootDomain = $paryDomain[0]; 
}    
elseif ($Array == 2)
{
    $RootDomain = $paryDomain[0].'.'.$paryDomain[1];
}    
elseif ($Array == 3)
{
    $RootDomain = $paryDomain[1].'.'.$paryDomain[2];
} else {
    //to debug the possible cause 
    $G_SYSTEMID = 'Array length was equal to '.$Array;
    $RootDomain = false;
}

您的数组计数与您使用的指针不匹配,这应该会有所帮助。您还在检查字符串而不是整数...

【讨论】:

  • 我做了这个更改,但脚本仍然没有输出。还有其他建议吗?
  • @neojakey 查看编辑 :) 您必须使用 count 函数来计算数组长度,并且数组指针编号不正确 :) 数组从 0 开始
  • @neojakey 第三次编辑添加了一个额外的 if 以考虑所有选项
  • +1 Dave 没错,我也详细解释过了
【解决方案2】:
$Array = count($paryDomain);
if ($Array == "1")
{
    $RootDomain = $paryDomain[0].'.'.$paryDomain[1];
} 

如果$Array 包含一个元素,则$paryDomain[1] 不存在,或者数组必须只包含一个元素。

对于谁说 $Array 是整数:

$Array = 1;
var_dump(($Array == "1"));
var_dump(($Array == "2"));

bool(true) 

bool(false)

出了什么问题: 您的服务器名称(如果有)((www.)?example.com):

if ($Array == "1")
{
    $RootDomain = $paryDomain[0].'.'.$paryDomain[1];
}    
elseif ($Array == "2")
{
    $RootDomain = $paryDomain[1].'.'.$paryDomain[2];
}

因为 $paryDomain = explode(".",$Domain); 至少包含两个元素,那么 $Array 永远不会等于一,只有在一种情况下,SERVER_NAME 是一个单词!

解决方案:

if ($Array == "2")
{
    $RootDomain = $paryDomain[0].'.'.$paryDomain[1];
}    
elseif ($Array == "3")
{
    $RootDomain = $paryDomain[1].'.'.$paryDomain[2];
}else{

}

if ($RootDomain == "storeboard.com")
{
    $G_SYSTEMID = 1;
}
elseif ($RootDomain == "dcwn.org")
{
    $G_SYSTEMID = 2;
}else{
//in case when none of above cases true
    $G_SYSTEMID = 100;
} 

【讨论】:

  • 谁投了票如果能解释一下!!!
【解决方案3】:

只是想向您展示一种更简单的方法。它将支持具有无限子域的域,因为它总是抓住最后两部分:

if (strpos($_SERVER['SERVER_NAME'], ".") !== false) {
    preg_match('/(?P<domain>[a-z0-9][a-z0-9\-]{1,63}\.[a-z]+)$/i', $_SERVER['SERVER_NAME'], $item);
    $RootDomain = $item['domain'];
} else {
    $RootDomain = $_SERVER['SERVER_NAME'];
}

switch ($RootDomain)
{
    case 'storeboard.com':
        $G_SYSTEMID = 1;
        break;
    case 'dcwn.org':
        $G_SYSTEMID = 2;
        break;
    default:
        $G_SYSTEMID = '';
        break;
}

echo $G_SYSTEMID;

【讨论】:

  • @Baba 应该把\.[a-z\.]{2,6}) 改成\.[a-z]+) 吗?我认为句号是错字吧?此外,这会将 TLD 限制为 2-6 个字符,但 ICANN 已经开放了 TLD 的 purchase,因此我们将来可以拥有像 mysite.somefancytld 这样的域。
  • ICANN selling custom top-level domains for $185,000 wow ..感谢您提供的信息..您可以更改它
【解决方案4】:

首先回显您的 $Domain

echo $_SERVER['SERVER_NAME'];

然后 print_r 你的 $paryDomain

print_r($paryDomain);

如果这些都是正确的,请回显您的 count()

echo count(explode(".",$_SERVER['SERVER_NAME']));

【讨论】:

    【解决方案5】:
    $G_SYSTEMID = strstr($_SERVER['SERVER_NAME'], 'storeboard.com') ? 1 : 2;
    

    【讨论】:

    • 嗯,还是喜欢我的方式更好:)
    • 是的,如果您不关心检查其他域 dcwn.org...
    • 我只看到两个选项,即使有更多,为每个添加一行并默认为 0 也没什么大不了的。它仍然比使用 switch 或其他方式少写.
    • 顺便说一句,如果您要操纵服务器名称并将其分解为一个数组,您可能应该在尝试拆分它之前确保服务器名称中有一个句点。 IE。本地主机
    • 好,很高兴你同意 ;)
    猜你喜欢
    • 2012-11-07
    • 2014-02-16
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 2012-09-20
    • 1970-01-01
    • 2021-01-05
    相关资源
    最近更新 更多