查询返回boolean而不是mysqli_query

时间:2017-12-02 20:20:40

标签: php

需要帮助

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);

1 个答案:

答案 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打开的最后一个连接。