2014-01-24 65 views
0

声明所以,我有这样的:如果如果没有返回值

$user = $db->prepare("SELECT * FROM `users` WHERE LL_IP='" . $_SERVER['REMOTE_ADDR'] . "'"); 
$user->execute(); 
while($userDATA = $user->fetch(PDO::FETCH_ASSOC)) { 
    if(userDATA['LL_IP'] == $_SERVER['REMOTE_ADDR']) { 
    echo "Logged in"; 
    } 
    else { 
    echo "Register/Login"; 
    } 
} 

我想要得到它,如果没有$userDATA['LL_IP']发现。然后它做else声明,但由于某种原因,它不起作用。

我也试过:

elseif($userDATA['LL_IP'] == false) { 
     echo "Register/Login"; 
} 

但是,这并不工作。

+0

尝试'print_r'上'$ userDATA',它告诉你,如果你实际上得到匹配。 –

+0

如果你的LL_IP是uniq,那么删除'while'。 – sectus

+2

您最好使用会话进行登录检查/系统,远程地址不是非常可靠。并且您需要对每个请求执行数据库查询... – jeroen

回答

2

如果你只是想检查,如果连续被发现,你可以用if语句代替循环:

if($userDATA = $user->fetch(PDO::FETCH_ASSOC)) 
{ 
    echo "Logged in"; 
} 
else 
{ 
    echo "Register/Login"; 
} 
+1

谢谢。有用。 – user3186208

1

你的逻辑是错误的。您仅查询LL_IP等于$_SERVER['REMOTE_ADDR']的情况。为什么会希望EVER gat结果转向你的条件不匹配。

在我看来,所有你需要在这种情况下,做的是检查,看看如果返回记录的数量在结果集大于1

顺便说一句,你应该至少在查询中使用它之前逃避$_SERVER['REMOTE_ADDR'],或者更好,因为您已经在使用预准备语句,所以可以使用参数化值。

你的逻辑应该是这样的:

// specify maybe a primary key field in query. No need for SELECT *  
$query = "SELECT COUNT(user_id) FROM `users` WHERE LL_IP = :ip_address LIMIT 1"; 
$user->prepare($query); 
$user->bindParam(':ip_address', $_SERvER['REMOTE_ADDR'], PDO::PARAM_STR]); 
$user->execute(); 
if('1' === $user->fetchColumn(0)) { 
    // logged in 
} else { 
    // not logged in 
} 

我也有评论表示赞同上面,你真的不应该依赖于一个IP地址来确定任何形式的登录状态@jeroen。 IP地址可能无法预料地发生变化(特别是对于移动用户)。

+0

'rowCount'不能准确反映SELECT语句影响的行数。请参阅手册条目的示例#2 –

+0

@CrayonViolent在PDO支持的所有数据库中,rowCount()不可靠,但在OP上标记的MySQL支持。如果你确实需要一个数据库不可知的实现,那么你应该使用'SELECT COUNT(*)'。 –

+0

你确定吗?用户提交'rowCount'的注释似乎暗示了另外 –

0
$user = $db->prepare("SELECT * FROM `users` WHERE LL_IP='" . $_SERVER['REMOTE_ADDR'] . "'"); 
$user->execute(); 
if ($user->fetchColumn() > 0) { 
    // logged in 
} else { 
    // not logged in 
} 

The manual(见例2#)说,使用fetchColumn