2016-02-12 49 views
0

我有以下的PHP代码,我想根据以前的SQL语句返回行数,但是,$ num似乎没有返回任何东西。为什么不是num_rows返回任何值?

$ipAddress = $_SERVER['REMOTE_ADDR']; 

if ($result = $mysqli->query("SELECT * FROM whovisit WHERE ipAddress = ".$ipAddress."")) { 
    $num = $result->num_rows; 
} 
echo $num; // <-- not showing up on my page 

if ($num > 0) { 
    $sqlupdate = $mysqli->query("UPDATE whovisit SET visitCount = visitCount + 1 WHERE ipAddress = ".$ipaddress.""); 
} 
else { 
    $sqlupdate = $mysqli->query("INSERT INTO whovisit values ('".$_SERVER['REMOTE_ADDR']."', '1')"); 
} 

任何想法?由于

+0

获取IP地址,使用'$ ipaddress'并在您的查询中使用带有大写字母A的'$ ipAddress'。关于查询中IP地址周围需要引号的答案中的要点也是正确的。 – BurningLights

+0

@BurningLights我没有看到它,它现在似乎已经消失 - 可能是一个错误的复制/粘贴? –

+1

@BurningLights抱歉,我在网站上键入了该变量,并忘记将其大写。它的大写在我的代码中。它的报价似乎是问题所在。 – l00kitsjake

回答

4

确保您有ip地址

$ipaddress = $_SERVER['REMOTE_ADDR']; 

由于IP地址的$盈是一个字符串,它应该放在单引号。

if ($result = $mysqli->query("SELECT * FROM whovisit WHERE ipAddress = '".$ipAddress."';")) { 
    $num = $result->num_rows; 
} 

如果您如果查询正确运行,你也可以在别的添加到上面,如果statment和输出任何MySQL错误信息不确定。

}else{ 
    echo "QueryError: ".$mysqli->error 
} 
0

如果您在页面上什么都没有,这意味着$num一定不能被设置。给定你的代码,这将意味着if块没有被执行 - 即$result是一个错误的值。这意味着您的查询失败。

不幸的是,如果您检查生成的查询,这一个很容易。按照所发生的一步一步,我们看到您正在将服务器变量REMOTE_ADDR的内容注入查询字符串,该服务器变量大概是点分十进制格式的IPv4地址。所以你有这样一个SQL语句,从而未能在第二.解析:

SELECT * FROM whovisit WHERE ipAddress = 127.0.0.94 

哎呀。


由于IP地址是一个字符串,你需要把它们放在单引号:

"SELECT * FROM whovisit WHERE ipAddress = '".$ipAddress."'" 

这将导致以下形式的查询:

SELECT * FROM whovisit WHERE ipAddress = '127.0.0.94' 

或者更好的是,使用参数化查询,您不必担心引用和转义。 $_SERVER['REMOTE_ADDR']就SQL注入攻击而言可能是相对安全的,但1)使用参数比连接字符串更容易,并且2)您从未真正可以信任您自己没有生成的值。