【问题标题】:Prepared statement fails in a function - PHP准备好的语句在函数中失败 - PHP
【发布时间】:2018-02-21 08:43:49
【问题描述】:

我不知道为什么,但是当我尝试在其中使用准备好的语句时,此函数返回 false,但是,当我使用非准备好的语句时,它返回 true。谁能解释一下?

代码:

function evalLoggedUser($conx,$id,$u,$p){
    $sql = "SELECT ip FROM users WHERE id=? AND username=? AND password=? AND activated=? LIMIT 1";
    $stmt = $conx->prepare($sql);
    $var = 1;
    $stmt->bind_param("issi",$id,$u,$p,$var);
    $stmt->execute();
    $numrows = $stmt->num_rows;
    if($numrows > 0){
        return true;
    }
    $stmt->close();
}

$user_ok = evalLoggedUser($conn,$log_id,$log_username,$log_password);

这返回错误

function evalLoggedUser($conx,$id,$u,$p){
$sql = "SELECT ip FROM users WHERE id='$id' AND username='$u' AND password='$p' AND activated='1' LIMIT 1";
    $query = mysqli_query($conx, $sql);
    $numrows = mysqli_num_rows($query);
    if($numrows > 0){
        return true;
    }
}
$user_ok = evalLoggedUser($conn,$log_id,$log_username,$log_password);

返回真

【问题讨论】:

  • 您检查过网络服务器的错误日志吗?
  • 没有错误。
  • evalLoggedUser($conx,$id,$u,$p)evalLoggedUser($conn,$log_id,$log_username,$log_password)bind_param("issi",$id,$u,$p,$var) 这里没有加起来,这就是问题所在。错误报告会告诉你。
  • Pus,在将数据存储到内存之前使用num_rows可能会产生意想不到的结果。
  • 我很好奇第一个示例应该如何返回 false,而唯一的可能性是 true 并且什么都没有,也就是 null。此外,所有这些 mysqli 函数调用都有您不需要检查的返回值。我敢打赌那里有一些有用的信息。

标签: php mysqli return prepared-statement


【解决方案1】:

问题是一个简单的印刷错误:您传递了 4 个准备好的参数,但预期是 5 个。

看到这个:$stmt->bind_param(/*"issi",*/$id,$u,$p,$var);

【讨论】:

  • 谢谢你这个作品,但我已经找到了解决方案。我忘了提到 activatedenum 类型,我试图将枚举作为 integer 传递,但如果我将它传递为 string 它也很好用。
  • 为什么这个被推荐并被选为正确答案? TBH 我没看到(答案中所说的......)我疯了吗?
  • 为什么需要 5 个参数?有 4 个占位符(?)、四个字母(issi)和四个变量($id$u$p$var)...
猜你喜欢
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-29
  • 1970-01-01
  • 1970-01-01
  • 2014-03-16
相关资源
最近更新 更多