$ var =='string1'|| 'string2'始终返回TRUE

时间:2011-10-04 14:08:08

标签: php

我想基于问题参数回显$ q2和$ q3,但不管参数的值如何,它都会给我相同的值。我做错了什么?

$q1 = $_GET['question'];
if ($q1 == "domaina.com"||".domaina.com"||"domaina.co")
{
    $q2 = 'domaina';
    $q3 = 'DomainA';
}
elseif ($q1 == "domainb.com"||".domainb.com"||"domainb.co")
{
    $q2 = 'domainb';
    $q3 = 'DomainB';
}
elseif ($q1 == "domainc.com"||".domainc.com"||"domainc.co")
{
    $q2 = 'domainc';
    $q3 = 'DomainC';
}
else {
    $q2 = 'noquestions';
    $q3 = 'NoQuestions';
} 

8 个答案:

答案 0 :(得分:4)

任何非空字符串的计算结果为true,因此您的第一个'或'语句始终计算为true。

要做的是:

if ($q1 == "domaina.com"||$q1 == ".domaina.com"||$q1 == "domaina.co")

而不是

if ($q1 == "domaina.com"||".domaina.com"||"domaina.co")

答案 1 :(得分:4)

太重复了。

$q1 = $_GET['question'];
$q2 = 'noquestions';
$q3 = 'NoQuestions';
if (preg_match('~^.?domain([a-c])\.com?$~',$q1,$m)) {
  $q2 = 'domain'.$m[1];
  $q3 = 'Domain'.strtoupper($m[1]);
}

顺便说一下,为了让你知道,你编写代码的方式,没有缩进或空格,是非常糟糕的。

答案 2 :(得分:0)

你需要像这样格式化它:

if ($q1 == "domaina.com" || $q1 == ".domaina.com" || $q1 == "domaina.co")

您正在做的事情被解释为:

if ($q1 == ("domaina.com" || ".domaina.com" || "domaina.co"))
// interpreted as: 
if ($q1 == (((bool)"domaina.com" || (bool)".domaina.com" || (bool)"domaina.co"))
// interpreted as: 
if ($q1 == ((true || true || true))
// interpreted as: 
if ($q1 == true)
// interpreted as: 
if ((bool)$q1 == true))

另请注意,如果您使用===运算符,那么您的最后一个条件将是始终评估为true而不是第一个条件的条件,因为您要将字符串与布尔值的结果进行比较操作

答案 3 :(得分:0)

您的==声明中有错误。

应该是这样的:

$q1 = $_GET['question'];
if ($q1 == "domaina.com"|| $q1 ==  ".domaina.com"|| $q1 == "domaina.co")
{
    $q2 = 'domaina';
    $q3 = 'DomainA';
}
elseif ($q1 == "domainb.com"|| $q1 == ".domainb.com"||$q1 == "domainb.co")
{
    $q2 = 'domainb';
    $q3 = 'DomainB';
}
elseif ($q1 == "domainc.com"||$q1 == ".domainc.com"||$q1 == "domainc.co")
{$q2 = 'domainc';
$q3 = 'DomainC';
}
    else {$q2 = 'noquestions';
    $q3 = 'NoQuestions';
} 

您也可以使用in_array

$q1 = $_GET['question'];
if(in_array("$q1", array("domaina.com",".domaina.com",""domaina.co"")))
{
    $q2 = 'domaina';
    $q3 = 'DomainA';
}
    //...

答案 4 :(得分:0)

以下内容总是评估为真。

if ($q1 == "domaina.com"||".domaina.com"||"domaina.co")

你可能意味着:

if ($q1 == "domaina.com"||$q1 == ".domaina.com"||$q1 == "domaina.co")

答案 5 :(得分:0)

ifs中的条件错误。先尝试修复它们。

if ($q1 == "domaina.com"||$q1 == ".domaina.com"||$q1 == "domaina.co")
{
    ...
}

答案 6 :(得分:0)

您可以使用strpos函数简化if语句,如下所示:

$q1 = $_GET['question'];
if (strpos($q1, "domaina") === true) {
    $q2 = "domaina";
    $q3 = "DomainA";
} elseif (strpos($q1, "domainb") === true) {
    $q2 = "domainb";
    $q3 = "DomainB";
} elseif (strpos($q1, "domainc") === true) {
    $q2 = "domainc";
    $q3 = "DomainC";
} else {
    $q2 = "noquestions";
    $q3 = "NoQuestion";
}

答案 7 :(得分:0)

我认为您可以稍微简化一下代码:

<?php

$q1 = $_GET['question'];
$q2 = getDomain($q1);
$q3 = ucfirst(substr($q2, 0, -1)) + strtoupper(substr($q2, -1));

function getDomain($url){
   $arrA = array('domaina.com', '.domaina.com', 'domaina.co');
   $arrB = array('domaina.com', '.domaina.com', 'domaina.co');
   $arrC = array('domaina.com', '.domaina.com', 'domaina.co');

   $q1 = strtolower($url);
   if(in_array($q1, $arrA))
      return "domaina";
   if(in_array($q1, $arrB))
      return "domainb";
   if(in_array($q1, $arrC))
      return "domainc";

   return '';
}
?>