【问题标题】:PHP Function not returning TRUE - But it isPHP函数不返回TRUE - 但它是
【发布时间】:2014-06-04 08:07:22
【问题描述】:

第一次来。我正在努力让这个 PHP 函数工作,5 小时后它让我发疯了。

我有这个功能:

// DOES THE USER HAVE ACCESS?
function access_la_page($id) {

include('DB_db.php');

/// GENERATE SQL 
$sql = "SELECT parent FROM la_pages WHERE id = $id";

// PREPARE THE STATEMENT
$result = mysqli_query($conn, $sql);

if($result === false) {
  trigger_error('Wrong SQL: ' . $sql . ' Error: ' . $conn->error, E_USER_ERROR);
  echo "FAIL" . $conn->error; exit();
}

$row = mysqli_fetch_array($result);

// CHECK PERMISSIONS DATABASE TO SEE IF USER HAS ACCSS HIGHER UP THE CHAIN  
$sql2 = "SELECT * FROM la_pages_permissions WHERE la_page_id = $id AND user_id = " . $_SESSION['user_id'];

$result2 = mysqli_query($conn, $sql2);

if($result2 === false) {
  trigger_error('Wrong SQL: ' . $sql2 . ' Error: ' . $conn->error, E_USER_ERROR);
  echo "FAIL" . $conn->error; exit();
}

if(mysqli_num_rows($result2) > 0){

    $value = TRUE;

    return $value;

}elseif($row['parent']!==$id&&$row['parent']&&!isset($value)) { 
    access_la_page($row['parent']); // CHECK DB RECURSIVELY TO SEE IF USE HAS PERMISSION HIGHER UP THE CHAIN    
}


}

然后我调用这个函数:

if(access_la_page($_SESSION['la_page_id'])==TRUE){
    echo "Success";
}else{
    echo "Fail";
}

现在...如果函数在第一个实例中命中 TRUE,它实际上会向我的页面返回 TRUE,成功!但如果它循环,它不会返回 TRUE。它什么也不返回。

但是,当我从语句中回显时,我可以看到函数正在按应有的方式执行,而当我回显 $value 时,它​​显示 TRUE 并且函数停止 - 这是应该发生的。但该函数不返回 TRUE。

这有意义吗,这不是因为我在循环函数而不起作用吗?

编辑 - 原谅我的无知。我有 TRUE 引号,我现在已经修改了,但它仍然不起作用

【问题讨论】:

  • "TRUE" !== TRUE: 一个是字符串,一个是布尔值
  • @MarkBaker 虽然这是正确的,但我不确定它是否会有所作为,当他没有使用严格相等时,非空字符串将等于 true:echo TRUE == 'TRUE' ? 'OK' : 'FAIL'; // OK
  • @Flosculus - 它可以带来很大的不同echo FALSE == 'TRUE' ? 'OK' : 'FAIL';
  • @MarkBaker 诚然,我已经更新了我的答案,以解决函数返回逻辑中可能出现的问题。

标签: php mysql


【解决方案1】:

如果通过,您的最终If 语句将返回'TRUE',但如果不通过则不会返回任何内容。

您能否确认这一点,因为目前该函数正在返回'TRUE'null。 这可能是原因。

尝试在最后一个子句上返回,如果递归检查是为了帮助决定,那么它应该返回一些东西:

if(mysqli_num_rows($result2) > 0){

    $value = "TRUE";

    return $value;

}elseif($row['parent']!==$id&&$row['parent']&&!isset($value)) {
    return access_la_page($row['parent']); // CHECK DB RECURSIVELY TO SEE IF USE HAS PERMISSION HIGHER UP THE CHAIN    
}

【讨论】:

  • 这个。这行得通。在函数调用中添加一个简单的 return 可以解决所有问题。谢谢你:)
  • 您可能希望使用纯 true 而不是使用包含该单词的字符串,因为您不能像 MarkBaker 指出的那样使用严格相等。
  • 我确实这样做了,事实上我是先这样做的。但我正在尝试各种尝试找出问题所在。
  • 请问为什么在access_la_page函数调用中添加return可以解决这个问题?
  • 因为该函数是递归的。即使一个函数可以立即返回一个值,如果它能够调用自己,那么它就是递归的。因此,您将返回由第一个、第二个或第三个...等运行的调用的值。递归函数通常返回一个值或调用自身返回的值。这很难解释,但如果你查看递归目录迭代(手动实现,而不是 PHP 版本),那么你可以看到它的实际效果。
【解决方案2】:

改变

$value = "TRUE";

$value = TRUE;

【讨论】:

    【解决方案3】:

    Andy Gee 的回答是正确的, 另外,您可以将 if 语句条件缩短为

    if(!($result)){
          code here 
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-14
      • 1970-01-01
      • 2013-06-16
      • 2016-12-15
      • 1970-01-01
      • 1970-01-01
      • 2012-06-29
      • 1970-01-01
      相关资源
      最近更新 更多