我想获得PHP中的select查询返回的行数。我有以下代码: -
$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()
,但我的结果始终为null(实际上没有结果)。
答案 0 :(得分:8)
有几种方法可以获取返回的行数,最常见的方法是在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()
是一个很好的开始。
您似乎也在以纯文本或使用不良方法(例如md5
或sha1
)存储密码。 PHP提供了一个内置函数password_hash()
/ password_verify()
,您应该使用它。如果你低于PHP 5.5版,那么这些函数不是原生的,但是可以使用的是compability包。
作为最后一点,混合面向对象和程序代码在技术上将起作用(因为程序实际上称为面向对象的代码),但它被认为是不好的做法。如果连接对象,请继续使用面向对象的代码。
答案 1 :(得分:5)
$command = "SELECT count(*) as numberofrecord, player_id FROM Player WHERE player_login = '" . $login."' AND player_password= '".$password."' ";
答案 2 :(得分:3)
非常简单的解决方案: -
以下方式使用$result->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
(如果您使用普通密码)。