为什么num_rows不返回任何值?

时间:2016-02-12 02:36:29

标签: php mysql

我有以下PHP代码,我希望根据以前的SQL语句返回行数,但是,$ num似乎没有返回任何内容。

$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')");
}

有什么想法吗?感谢

3 个答案:

答案 0 :(得分:4)

确保您拥有$ iront的ipaddress

$ipaddress = $_SERVER['REMOTE_ADDR'];

由于IP地址是字符串,因此应将其放在单引号中。

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

如果您不确定查询是否正确运行,您还可以在上面的if语句中添加else,并输出任何mysql错误消息。

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

答案 1 :(得分: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'

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

答案 2 :(得分:0)

类似的帖子:

php switching to mysqli: num_rows issue

在PHP v 5.2中,在从查询结果中提取数据行之前未设置mysqli :: num_rows。