PHP if else逻辑和变量有问题


Trouble with PHP if else logic and variables

因此,我在PHP中有几个变量,它们是从不同的地方生成的$new_ip来自以下命令:

$new_ip = file_get_contents('http://www.ipaddresscheck.comlu.com/ip.php');

$old_ip来自:

$sql = mysql_query('SELECT * FROM ip ORDER BY  id DESC LIMIT 1');
$row = mysql_fetch_array( $sql );
$old_ip = $row['current_ip'];

我的问题是,我从得到了不正确的结果

if ($old = $new)
{
$different = '1';    
}
else {
$different = '2';  
}
echo $different;

无论IP是否相同,我总是得到2;如果我用"=="作为比较,我总是得到1。

当我运行以下代码时,我会得到以下输出:var_dump($old_ip);var_dump($new_ip);

输出

string(15)"123.123.123.123"string(167)"184.6.216.163"

变量的类型不同吗?如果是,我能让它们相同吗?这样我只比较IP而不是类型?如果IP相同,我应该得到"1",如果它们不同,我应该获得"2",对吧?

您的问题潜伏在这里:

string(15) "123.123.123.123" string(167) "184.6.216.163 "
                                    ^^^

从您的数据库中检索到的地址包含154个不需要的字符。trim()两个字符串,然后进行比较。

哦,你真的应该缩短存储IP地址的字段。15个字符就可以了。

代码

if ($old = $new) // you are using assignment operator here
{
   $different = '1';    
}

应该是

if ($old == $new) //Equal to operator
{
   $different = '1';    
}

此外,确认变量名称为$old和$new$0old_ip和$new_ip

  • 赋值(=):将右边的值赋值给左边的变量
  • 相等(==):检查左值和右值是否相等
  • 相同(===):检查左值和右值是否相等且相同(相同变量类型)

    示例:

    $a = 1; // Sets the value of $a as the integer 1
    $b = TRUE; // Sets the value of $b to the boolean TRUE
    if ($a == $b){
    echo 'a is equal to b.';
    }
    if ($a === $b){ // compare VALUE and data type: if $a(integer) === $b(boolean)
    echo 'a is identical and equal to b.';
    }
    if ($a = $b){ 
    echo '$b value to variable $a';
    }
    

在你的代码中,我注意到一个问题。第二个IP地址中有一个空格。所以

string(15) "123.123.123.123" string(167) "184.6.216.163 "
                                                       ^
  1. 修剪两个IP地址
  2. 如果不起作用,则将其转换为其他数据类型并进行比较。(仅用于调试。:))

OLD:

if ($old = $new){
   $different = '1';    
}

新更正:

if ($old == $new){
   $different = '1';    
}

您正在使用(=)赋值运算来代替比较运算。

据我所见,行为是正常的,因为您使用的$old$new都未设置。

$new_ip = file_get_contents('http://www.ipaddresscheck.comlu.com/ip.php');
$sql = mysql_query('SELECT * FROM ip ORDER BY  id DESC LIMIT 1');
$row = mysql_fetch_array( $sql );
$old_ip = $row['current_ip'];

下一个代码总是给出2,因为$new未设置。您在这里所做的是将$new的值分配给$old,并且由于$new未设置,因此$old = $new将始终为false。

if ($old = $new)
{
    $different = '1';    
} else {
    $different = '2';  
}
echo $different;

在下一个示例中,您实际上正在比较$old$new。由于两者都未设置,因此表达式$old == $new将始终为真。

if ($old == $new)
{
    $different = '1';    
} else {
    $different = '2';  
}
echo $different;

你需要做的是使用正确的vars并修剪它们。

// get new ip and trim white spaces
$new_ip = trim(file_get_contents('http://www.ipaddresscheck.comlu.com/ip.php'));
// get the old ip
$sql = mysql_query('SELECT * FROM ip ORDER BY  id DESC LIMIT 1');
$row = mysql_fetch_array( $sql );
$old_ip = $row['current_ip'];
if ($old_ip == $new_ip)
{
    $different = '1';    
} else {
    $different = '2';  
}
echo $different;

我不修剪$old_ip上的空白,因为我猜您将使用$new_ip来更新数据库,并且由于$new_ip已经被修剪,我们可以确保$old_ip没有空白。

编码时应始终启用php警告!它会给你一个警告,因为你使用了未设置的变量。

PS:请注意,只有当file_get_contents()返回带有空格的IP时,此代码才会按预期工作,输出可能不同(错误输出、无法正确检测IP等)