Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como trazer mais de um resultado de linha (mysql) dentro da mesma variável ao executar um json_encode?


Se entendi corretamente, a tabela tPCN pode conter várias linhas associadas a cada número de PCR. E você deseja buscar todas essas linhas e devolvê-las em seu JSON.

Se você quiser conseguir isso, mas também certifique-se de que as outras duas tabelas retornem apenas uma linha, acho que simplesmente você deve remover o JOIN para tPCN em sua primeira consulta e, em seguida, crie uma segunda consulta para buscar o tPCN linhas especificamente.
$output = [];
$stmt = $dbConnected->prepare("SELECT * FROM change_management.tPCR INNER JOIN change_management.tcomplement ON change_management.tPCR.PCRNo = change_management.tcomplement.PCRNo WHERE tPCR.PCRNo = ?");
$stmt->bind_param('s', $_POST['pcr_number']);
$stmt->execute();
$result = $stmt->get_result();

//select a single row from the result and assign it as the output variable
if ($row = $result->fetch_assoc()) {
    $output = $row;
}

$stmt2 = $dbConnected->prepare("SELECT * FROM change_management.tPCN WHERE PCRNo = ?");
$stmt2->bind_param('s', $_POST['pcr_number']);
$stmt2->execute();
$result2 = $stmt2->get_result();
$output["tPCN"] = array(); //create a new property to put the tPCN rows in

//loop through all the tPCN rows and append them to the output
while ($row2 = $result2->fetch_assoc()) {
    $output["tPCN"][] = $row2;
}

echo json_encode($output);

Isso produzirá algum JSON com esse tipo de estrutura:
{
  "PCRNo": "ABC",
  "CreationDate": "2019-08-07",
  "Name": "A N Other",
  //...and all your other properties, until the new one:
  "tPCN": [
    {
      "SomeProperty": "SomeValue",
      "SomeOtherProperty": "SomeOtherValue",
    },
    {
      "SomeProperty": "SomeSecondValue",
      "SomeOtherProperty": "SomeOtherSecondValue",
    }
  ]
}

Você precisará então alterar seu código JavaScript para poder lidar com a nova estrutura. Como não sei exatamente quais campos vêm do tPCN table, não posso dar um exemplo para isso, mas espero que esteja claro que você precisará percorrer o array e produzir o mesmo HTML para cada entrada que encontrar.

N.B. Como você pode ver, eu reescrevi o código de consulta para usar instruções preparadas e consultas parametrizadas, para que você possa ver como escrever seu código de maneira segura no futuro.

P.S. Você tem muito código lá na função "sucesso" apenas para definir os valores de campos individuais. Você pode querer considerar o uso de um mecanismo de modelagem JS simples para tornar isso menos detalhado e complicado e gerar o HTML necessário com os valores adicionados automaticamente no lugar certo. Mas isso é um problema separado, apenas para a manutenção do seu código