我有以下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')");
}
有什么想法吗?感谢
答案 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)