【问题标题】:How to get number of rows returned by an SQL select query?如何获取 SQL 选择查询返回的行数?
【发布时间】:2017-02-09 10:40:02
【问题描述】:

我想获取 PHP 中选择查询返回的行数。我有以下代码:

$connection = new mysqli($server_name, $server_login, $server_password, $dbName);

if (!$connection) {
    echo "error";
    die("Connection failed. ".mysqli_connect_error())
}

//...

$command = "SELECT player_id FROM Player WHERE player_login = '" . $login."' AND player_password= '".$password."' ";

$result = mysqli_query($connection, $command);
echo num_rows($result);

我也尝试了mysqli_stmt_num_rows()mysqli_num_rows(),但我的结果始终为空(实际上没有结果)。

你知道为什么吗?

【问题讨论】:

  • 尝试 count() 函数来获得否。行数
  • 我认为@RahulPawar的意思是mysql函数COUNT
  • @bub!是的!我想你可能是对的!
  • 顺便说一句:如果这返回 >1 行,我认为您可能在此站点上遇到了一些安全问题。登录名/密码表单是 SQL 注入的主要目标。查看准备好的查询以确保安全!

标签: php mysql mysqli


【解决方案1】:

有几种方法可以获取返回的行数,最常见的方法是在 MySQL 中运行 COUNT(*),但也有 mysqli_num_rows($result)(不是您使用的 num_rows(),除非您自己创建了该函数)。 mysqli_stmt_num_rows() 仅在您使用 prepare() 而不是 query() 时有效。

为了使用COUNT(*),您必须先运行并获取查询,而mysqli_num_rows() 是 MySQLiResult 对象返回的常量,如果查询没有失败,您可以使用它。

我修改了你必须检查查询是否真的成功的那段代码,如果查询失败,mysqli_num_rows() 将不起作用。

$command = "SELECT player_id FROM Player WHERE player_login = '" . $login."' AND player_password= '".$password."' ";

if ($result = mysqli_query($connection, $command)) {
    echo mysqli_num_rows($result);
} else {
    /* Query failed */
    echo "There was an error with the query: $command";
    echo "<br />".mysqli_error($connect);
}

或者您可以使用COUNT(*),但您必须先获取结果。

$command = "SELECT player_id, COUNT(*) as cnt FROM Player WHERE player_login = '" . $login."' AND player_password= '".$password."' ";

if ($result = mysqli_query($connection, $command)) {
    $row = mysqli_fetch_assoc($result);
    echo $row['cnt'];
} else {
    /* Query failed */
    echo "There was an error with the query: $command";
    echo "<br />".mysqli_error($connect);
}

您还应该注意,此查询容易受到 SQL 注入的影响,您应该学习如何使用带有占位符的预准备语句来保护自己免受这种情况的影响。 manual on prepare() 是一个很好的起点。


您似乎还以纯文本或使用不良方法(例如md5sha1)存储密码。 PHP 提供了一个内置函数password_hash()/password_verify(),您应该使用它。如果您的 PHP 版本低于 5.5,这些函数不是原生的,但可以使用兼容包。

最后一点,混合面向对象和过程代码在技术上是可行的(实际上过程代码称为面向对象代码),但它被认为是不好的做法。如果与对象连接,请继续使用面向对象的代码。

参考文献

【讨论】:

  • 也很想知道 dv 的原因
  • 给我点赞!回答问题并给 OP 很多有用的信息!
  • @HarshBarach 是你曾经批评过他们的回答的人吗?我曾经是那个受害者。
【解决方案2】:
$command = "SELECT count(*) as numberofrecord, player_id FROM Player WHERE player_login = '" . $login."' AND player_password= '".$password."' ";

【讨论】:

    【解决方案3】:

    非常简单的解决方案:-

    以下列方式使用$result-&gt;num_rows:-

    if ($result = $mysqli->query("SELECT player_id FROM Player WHERE player_login = '" . $login."' AND player_password= '".$password."'")) {
      printf("Select returned %d rows.\n", $result->num_rows);
    }
    

    参考:-http://php.net/manual/en/mysqli.query.php

    注意:-

    同时读取prepared statement 并使用它们来防止您的代码来自SQL Injection

    在存储密码时也始终使用password hashing mechanism(如果您使用纯密码)。

    【讨论】:

      猜你喜欢
      • 2016-04-18
      • 1970-01-01
      • 2019-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-08
      相关资源
      最近更新 更多