需要帮助
Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given
我正在尝试使用steamOpenID登录按钮,但是当我的mysqli_query出现错误时,它会返回一个布尔值。这是我的数据库或代码中的问题吗?
$url = "http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?
key=$_STEAMAPI&steamids=$matches[1]";
$json_object= file_get_contents($url);
$json_decoded = json_decode($json_object);
foreach ($json_decoded->response->players as $player)
{
$sql_fetch_id = "SELECT * FROM `SteamOpenID` WHERE `steamid`=$player->steamid";
$query_id = mysqli_query($db, $sql_fetch_id);
// This line triggers the warning
if(mysqli_num_rows($query_id) == 0){
$sql_steam = "INSERT INTO SteamOpenID (name, steamid, avatar) VALUES ('$player->personaname','$player->steamid','$player->avatar')";
mysqli_query($db,$sql_steam);
答案 0 :(得分:0)
首先,mysql_query是一个非常古老的函数,已被弃用,正如the documentation中明确指出的那样。
其次,您无需检查file_get_contents是否确实有效。失败时返回FALSE。您应该使用严格相等比较运算符 === (3个等号)检查结果,如下所示:
$json_object= file_get_contents($url);
if ($json_object === FALSE) {
die("could not fetch the remote url");
}
第三,你也不用费心去检查json_decode。文档说如果无法解码JSON,它将返回 NULL 。
if (is_null($json_decoded)) {
die("JSON decoded as NULL");
}
您还应该对$ json_decoded进行一些完整性检查。但是,假设你得到了你想要的数组,并假设每个玩家都有一个steamid属性,它可能会起作用。
我可能会将您的SQL定义更改为:
$sql_fetch_id = "SELECT * FROM `SteamOpenID` WHERE `steamid`=" . mysql_real_escape_string($player->steamid);
您应该始终验证和/或转义输入,然后再将其放入查询中,否则您将面临SQL injection的风险。
最后,我们解决了手头的问题,即在您开始使用其他功能之前,您无需检查mysql_query的结果。正如文档所说:
对于返回结果集的SELECT,SHOW,DESCRIBE,EXPLAIN和其他语句,mysql_query()在成功时返回资源,如果出错则返回FALSE。您应该先检查它之前返回的内容,以确保在开始运行其他函数之前它没有返回false。
$query_id = mysql_query($sql_fetch_id);
if (!$query_id) {
die('Invalid query: ' . mysql_error());
}
你可能会发现你的SQL有错误。
编辑:我也注意到你向mysql_query提供了两个参数。您提供给该函数的第一个参数应该是您的SQL查询字符串。您提供的代码也没有告诉我们您在哪里定义$ db。您应该反转这两个参数。阅读the docs,您将看到第一个参数是查询字符串,第二个参数是您调用mysql_connect时获得的链接标识符。这是一个可选参数。如果您不提供,该函数将使用使用mysql_connect打开的最后一个连接。