如果声明没有返回值

时间:2014-01-24 01:57:53

标签: php mysql pdo

所以,我有这个:

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

但这也不起作用。

3 个答案:

答案 0 :(得分:2)

如果您只想检查是否找到了行,可以使用if语句替换该循环:

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

答案 1 :(得分:1)

你的逻辑是错误的。您已经仅查询LL_IP等于$_SERVER['REMOTE_ADDR']的情况。为什么期望在你的if条件不匹配的情况下转换结果。

在我看来,在这种情况下您需要做的就是检查结果集中返回的记录数是否大于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
}

我同意@jeroen上面的评论,你真的不应该依赖IP地址来确定任何类型的登录状态。 IP地址可能会无法预测地发生变化(特别是对于移动用户而言)。

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