sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo traer el resultado de más de una fila (mysql) dentro de la misma variable cuando se ejecuta un json_encode?

Si te entendí bien, la tabla tPCN puede contener varias filas asociadas con cada número de PCR. Y desea obtener todas estas filas y devolverlas en su JSON.

Si desea lograr eso, pero también asegúrese de que las otras dos tablas solo devuelvan una fila, entonces creo que simplemente debe eliminar JOIN a tPCN en su primera consulta y luego cree una segunda consulta para obtener el tPCN filas específicamente.

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

Esto producirá algunos JSON con este tipo de estructura:

{
  "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",
    }
  ]
}

Luego deberá modificar su código JavaScript para poder manejar la nueva estructura. Como no sé exactamente qué campos provienen del tPCN table, no puedo darle un ejemplo para eso, pero espero que esté claro que necesitará recorrer la matriz y generar el mismo HTML para cada entrada que encuentre.

nótese bien Como puede ver, reescribí el código de consulta para usar declaraciones preparadas y consultas parametrizadas, para que pueda ver cómo escribir su código de forma segura en el futuro.

PD Tiene mucho código allí en la función "éxito" solo para establecer los valores de campos individuales. Es posible que desee considerar el uso de un motor de plantillas JS simple para que sea menos detallado y engorroso, y genere el HTML que necesita con los valores agregados automáticamente en el lugar correcto. Pero ese es un problema aparte, solo por la mantenibilidad de su código