【问题标题】:Collect values from JSON file for use in MySQL `IN` clause从 JSON 文件中收集值以用于 MySQL `IN` 子句
【发布时间】:2020-10-01 17:25:22
【问题描述】:
include "includes/dbh.inc.php";
$data = file_get_contents("dumps/datadump-hung1.json");
$post = json_decode($data, true);

foreach($post['sessionResult']['leaderBoardLines'] as $userArr){

$carname .=$userArr['car']['carModel'];

} echo $carname;

这与车型编号类似 = 19115 而不是 19 1 15

当我尝试将这些与我的数据库匹配以回显汽车的名称时,这些数字会响应:

$carGETdb = "SELECT carName FROM cars WHERE carID IN ($carname)";
$result = mysqli_query($conn, $carGETdb);
$row = mysqli_fetch_array($result)["carName"];
echo $row;

它没有发布任何内容,因为没有汽车与 19115 相关联,但 3 辆不同的汽车与 19、1 和 15 相关联

有没有办法在单曲中对每个数组进行 foreach,这样我就可以将它们与我的数据库匹配,并以汽车名称而不是数字的形式回显?

【问题讨论】:

  • $carnames = array_map(function($c) {return $c['car']['carModel'];}, $post['sessionResult']['leaderBoardLines']);,现在您可以根据需要使用implode(",",$carnames)
  • @NiettheDarkAbsol,如果我这样做,它会给我的$row = mysqli_fetch_array($result)["carName"];` 一个布尔值,所以它不会与数据库匹配
  • 好吧,它给了你一个数组,然后你需要对那个数组做一些事情。

标签: php mysql multidimensional-array mysqli


【解决方案1】:
  1. 将您所追求的值映射到新数组
  2. IN 子句中使用适当数量的? 参数构建一个准备好的语句
  3. 将值数组绑定到您的语句
  4. 执行和获取
$carIds = array_map(function($userArr) {
  return $userArr['car']['carModel'];
}, $post['sessionResult']['leaderBoardLines']);
// [ 19, 1, 15 ]

$placeholders = implode(', ', array_fill(0, count($carIds), '?'));
// "?, ?, ?"

$bindTypes = str_repeat('i', count($carIds));
// "iii"

$stmt = $conn->prepare(
    "SELECT `carID`, `carName` FROM `cars` WHERE `carID` IN ($placeholders)");
$stmt->bind_param($bindTypes, ...$carIds);
$stmt->execute();
$stmt->bind_result($carId, $carName);

$carNames = [];
while ($stmt->fetch()) {
  $carNames[$carId] = $carName;
}

var_dump($carNames);

【讨论】:

    【解决方案2】:

    使用您的代码...

    include "includes/dbh.inc.php";
    $data = file_get_contents("dumps/datadump-hung1.json");
    $post = json_decode($data, true);
    $carname = [];
    foreach($post['sessionResult']['leaderBoardLines'] as $userArr){    
        $carname[] = $userArr['car']['carModel'];    
    }
    
    $carnames = implode(',', $carname);
    echo $carnames;
    

    然后在查询数据库时使用以下语句,您可以使用 implded 值(但这必然会引发 sql 注入攻击)。您应该改用参数化查询。但是,我不会对您的代码进行太多更改,以便您了解发生了什么。

    $carGETdb = "SELECT carName FROM cars WHERE carID IN ($carnames)";
    $result = mysqli_query($conn, $carGETdb);
    $row = mysqli_fetch_array($result)["carName"];
    echo $row;
    

    【讨论】:

      猜你喜欢
      • 2023-01-26
      • 2015-04-19
      • 1970-01-01
      • 1970-01-01
      • 2016-07-19
      • 2017-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多