Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何重新编写此SQL语句以接受数组变量?_Php_Mysql_Sql - Fatal编程技术网

Php 如何重新编写此SQL语句以接受数组变量?

Php 如何重新编写此SQL语句以接受数组变量?,php,mysql,sql,Php,Mysql,Sql,我正在进行一个API调用,以从我的数据库中检索用户名 我的第一步是调用以检索所有玩家id。它们存储在$communityPlayersIds中,当前输出如下: [“2”、“31”、“31”、“32”] 现在我想对数据库进行第二次调用,以获取匹配id的用户名 $communityPlayerNames = array(); $communityPlayerNames = $dao->getPlayerNames($communityPlayersIds); 我已经调查过了,发现我应该使用一

我正在进行一个API调用,以从我的数据库中检索
用户名

我的第一步是调用以检索所有
玩家id
。它们存储在
$communityPlayersIds
中,当前输出如下:

[“2”、“31”、“31”、“32”]

现在我想对数据库进行第二次调用,以获取匹配id的
用户名

$communityPlayerNames = array();
$communityPlayerNames = $dao->getPlayerNames($communityPlayersIds);
我已经调查过了,发现我应该使用一个类似这样的命令:

public function getPlayerNames($player_ids)
{
$returnValue = array();

$sql = "SELECT user_name\n"
. "FROM users\n"
. "WHERE id IN ( '".$player_ids."')";

  $result = $this->conn->query($sql);
    if($result != null && (mysqli_num_rows($result) >= 1)){
while($row = $result -> fetch_array(MYSQLI_ASSOC)){
   if(!empty($row)){
      $returnValue[] = $row;
   }
   }
 }
    return $returnValue;
}

}
$returnValue = array();

$in_statement = "(";
foreach($player_ids as $player_id)
{
    $in_statement = $in_statement.$player_id->player_id.",";
}
rtrim($in_statement, ",");
$in_statement = $in_statement.")";

$sql = "SELECT community_players.player_id\n"
. "from community_players\n"
. "where community_players.community_id in ".$in_statement."";
但是,这不起作用,并返回以下内容:

[{“用户名”:null}]

如果我回显($sql),我会得到以下结果:

从id位于('2,31,31,32'中的用户中选择用户名

哪个看起来正确,不是吗


我哪里出错了?

您基本上希望最终查询如下所示

Select user_name from users where id in (2,31,31,32)  -- dupe 31 does no harm

确保您的ID系列位于($player\u id)中的括号
内,而不仅仅是“$player\u id”中的单个引号

您基本上希望最终查询如下所示

Select user_name from users where id in (2,31,31,32)  -- dupe 31 does no harm

确保您的ID系列位于($player\u id)
中的括号
内,而不仅仅是“$player\u id”中的单个引号
您可以尝试在SQL的以下部分中构建:

public function getPlayerNames($player_ids)
{
$returnValue = array();

$sql = "SELECT user_name\n"
. "FROM users\n"
. "WHERE id IN ( '".$player_ids."')";

  $result = $this->conn->query($sql);
    if($result != null && (mysqli_num_rows($result) >= 1)){
while($row = $result -> fetch_array(MYSQLI_ASSOC)){
   if(!empty($row)){
      $returnValue[] = $row;
   }
   }
 }
    return $returnValue;
}

}
$returnValue = array();

$in_statement = "(";
foreach($player_ids as $player_id)
{
    $in_statement = $in_statement.$player_id->player_id.",";
}
rtrim($in_statement, ",");
$in_statement = $in_statement.")";

$sql = "SELECT community_players.player_id\n"
. "from community_players\n"
. "where community_players.community_id in ".$in_statement."";

所以中间部分是新的,$in_语句就是在这里生成的。在SQL中,必须将“=”改为“in”。您可以在较短的时间内生成部分,但通过这种方式,您可以更容易地看到它是如何完成的,因此您可以根据自己的需要对其进行调整。

您可以尝试像这样在SQL中构建部分:

public function getPlayerNames($player_ids)
{
$returnValue = array();

$sql = "SELECT user_name\n"
. "FROM users\n"
. "WHERE id IN ( '".$player_ids."')";

  $result = $this->conn->query($sql);
    if($result != null && (mysqli_num_rows($result) >= 1)){
while($row = $result -> fetch_array(MYSQLI_ASSOC)){
   if(!empty($row)){
      $returnValue[] = $row;
   }
   }
 }
    return $returnValue;
}

}
$returnValue = array();

$in_statement = "(";
foreach($player_ids as $player_id)
{
    $in_statement = $in_statement.$player_id->player_id.",";
}
rtrim($in_statement, ",");
$in_statement = $in_statement.")";

$sql = "SELECT community_players.player_id\n"
. "from community_players\n"
. "where community_players.community_id in ".$in_statement."";

所以中间部分是新的,$in_语句就是在这里生成的。在SQL中,必须将“=”改为“in”。您可以在较短的时间内生成部分,但通过这种方式,您可以更容易地看到它是如何完成的,因此您可以根据自己的需要对其进行调整。

在您的代码中,您将
放在
中的
之后,这会显示语法错误。
你可以试试

假设你
$communityPlayersIds
具有以下数组值:

[“2”、“31”、“31”、“32”]

如果不是数组,则使用
json\u decode()
然后尝试下面的查询

$sql = "SELECT community_players.player_id\n"
. "from community_players\n"
. "where community_players.community_id IN (".join(",",$communityPlayersIds).")";

在代码中,您在
中的
之后添加了
,显示语法错误。 你可以试试

假设你
$communityPlayersIds
具有以下数组值:

[“2”、“31”、“31”、“32”]

如果不是数组,则使用
json\u decode()
然后尝试下面的查询

$sql = "SELECT community_players.player_id\n"
. "from community_players\n"
. "where community_players.community_id IN (".join(",",$communityPlayersIds).")";

您应该查看表值参数……在访问bobby tables之前,您应该研究如何在php中使用参数化查询。它说您的语法不正确,所以为什么不至少转储SQL语句字符串以查看其外观。另外,还不清楚如何从给定的JSON构建
$player\u id
,因此这可能是一个提示。因此,我需要转储
$communityPlayersIds
数组的“player\u id”部分,并用剩余的id号重新构建它。我已经用我的新函数和我取得的进展更新了这个问题。我去掉了“玩家id”,现在有了一个只有数字的数组。认为函数没有返回任何值吗?您应该查看表值参数……在访问bobby tables之前,您应该研究如何在php中使用参数化查询。它说您的语法不正确,所以为什么不至少转储SQL语句字符串以查看它的外观。另外,还不清楚如何从给定的JSON构建
$player\u id
,因此这可能是一个提示。因此,我需要转储
$communityPlayersIds
数组的“player\u id”部分,并用剩余的id号重新构建它。我已经用我的新函数和我取得的进展更新了这个问题。我去掉了“玩家id”,现在有了一个只有数字的数组。认为函数没有返回任何值吗?该查询已经在给定的代码中,但没有显示的是如何在给定的JSON@JeffPuckettII除非我读错了,否则他的语法是“.$player_id.”“;…不()。我已经用我的新函数和我所取得的进展更新了这个问题。我去掉了“player_id”,现在有了一个只包含数字的数组。认为该函数没有返回任何值吗?@RDowns在Chrome控制台中尝试一下myArray=[12150,32];myArray.toString()该查询已经存在于给定的代码中,但没有显示的是如何在给定的代码中获取这些数字JSON@JeffPuckettII除非我读错了,否则他的语法是“.$player_id.”“。。。没有()。我已经用我的新函数和我取得的进展更新了这个问题。我去掉了“玩家id”,现在有了一个只有数字的数组。是否认为函数没有返回任何值?@RDowns在Chrome控制台myArray=[12150,32]中尝试此操作;myArray.toString()此行:$in_语句[]=$player_id->player_id;出现以下错误:注意:尝试获取非对象的属性。如果我把“echo json_encode($player_id);”在循环中,我得到{“player_id”:“2”}{“player_id”:“31”}{“player_id”:“32”}这一行:$in_statement[]=$player_id->player_id;出现以下错误:注意:尝试获取非对象的属性。如果我把“echo json_encode($player_id);”在循环中我得到{“player_id”:“2”}{“player_id”:“31”}{“player_id”:“32”}