【问题标题】:How to select ip address with prepared statement如何使用准备好的语句选择 IP 地址
【发布时间】:2019-08-03 11:05:37
【问题描述】:

我正在尝试使用准备好的 php 语句选择 IP 地址,如果 IP 已经存在,则一切正常,但如果不存在,它永远不会进入 if($stmt -> num_rows === 0),它总是进入 elselike if查询错误。该字段设置为int unsigned
那么这个prepared statement?有什么问题,当select不匹配任何东西时,如何让它进入if($stmt -> num_rows === 0)

$ip_long= ip2long($ip);
$stmt = $mysqli -> prepare('SELECT INET_NTOA(ip), registry_date FROM users WHERE ip = ?');
    if (
        $stmt &&
        $stmt -> bind_param('i', $ip_long) &&
        $stmt -> execute() && 
        $stmt -> store_result() &&
        $stmt -> bind_result($ip, $registry_date_checker) && 
        $stmt -> fetch()
    ) {
       if($stmt -> num_rows === 0) {
          //It does never enter here.
       }
       if($stmt -> num_rows === 1) {
          //If exist enter here.
       }
   }
   else{
       //If select not found anything it always enter here.
       echo "Error mysqli: ".$mysqli-> error; //Returns empty error
       echo "Error stmt : ".$stmt -> error; //Returns empty error
       echo "Numrows: ".$stmt -> num_rows; //Returns 0
       exit;
   }

【问题讨论】:

  • 也许你应该检查实际的错误信息,然后你就不会出错了。
  • 我更新了我的问题。 stmt 和 mysqli 的错误是空的,所以我想它们没有错。

标签: php sql mysqli prepared-statement


【解决方案1】:

如果结果集中不存在任何行,mysqli_stmt::fetch 方法将返回 null。在布尔上下文中,null 被解释为false

这意味着如果您的查询没有返回任何记录,那么您的第一个 if 将直接进入 else 分支。

我会将$stmt -> fetch() 替换为

($stmt -> fetch() ?: true)

在你的第一个如果。这会将null 值转换为true

【讨论】:

    【解决方案2】:

    你的代码写错了

    这里是

       if($stmt->num_rows() === 0) {
          //It does never enter here.
       }
       elseif($stmt->num_rows() === 1) {
          //If exist enter here.
       }
    

    新版本的 mysqli 使用 num_rows 作为函数而非键对象。

    【讨论】:

      猜你喜欢
      • 2017-05-23
      • 2015-02-26
      • 1970-01-01
      • 1970-01-01
      • 2016-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多