1

所以,我在 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;

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

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

输出

字符串(15)“123.123.123.123”字符串(167)“184.6.216.163”

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

4

5 回答 5

4

你的问题潜伏在这里:

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

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

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

于 2013-06-28T05:06:18.203 回答
2

代码

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

应该

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

还要确认变量名称是 $old 和 $new$old_ip 和 $new_ip

于 2013-06-28T05:02:14.010 回答
1
  • 赋值( =):将右边的值赋给左边的变量
  • Equality ( ==): 检查左右值是否相等
  • Identical ( ===):检查左右值是否相等且相同(相同的变量类型)

    例子:

    $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. 如果不起作用,则将其转换为其他数据类型并进行比较。(仅用于调试目的。:))
于 2013-06-28T05:07:13.253 回答
0

老的 :

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

新更正:

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

您正在使用 (=) 赋值操作代替比较操作。

于 2013-06-28T05:13:35.670 回答
0

据我所知,这种行为是正常的,因为您正在使用$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 未设置。您在这里所做的是分配$old的值,$new因为$new未设置$old = $new将始终为假。

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

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

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

您需要做的是使用正确的变量并修剪它们。

// 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:请注意,如果返回带有空格的 IP,此代码只会按预期工作file_get_contents(),输出可能会有所不同(错误输出,无法正确检测 ip,...等)

于 2013-06-28T07:26:07.017 回答