简体   繁体   中英

Collect values from JSON file for use in MySQL `IN` clause

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;

this echoes out the carmodel numbers like this= 19115 instead of 19 1 15

when i try to match these with my database to echo out the name of cars the numbers respond to with:

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

it posts nothing, because no cars is associated with 19115 but 3 different cars is associated with 19, 1 and 15

is there a way to foreach each array in singles, so i can match them with my database and echo out as carnames instead of numbers?

  1. Map the values you're after to a new array
  2. Build a prepared statement with the appropriate number of ?parameters in your IN clause
  3. Bind the array of values to your statement
  4. Execute and fetch
$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);

Using your code...

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;

Then with your following statement when querying the database, you can use the implded value ( but this is bound to sql injection attacks ). You should use parameterised query instead. However, I am not going to change too much of your code so you can see what is going on.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM