PHP: aynı json veri nesnesi içine iki ayrı mysql sorguları Katıl

3 Cevap php

Ben tek bir json nesne içine altında mysql sorgu sonuçlarını örgü çalışıyorum, ama düzgün yapmak için nasıl emin değilim.

$id = $_POST['id'];

$sql = "SELECT contracts.po_number, contracts.start_date, contracts.end_date, contracts.description, contracts.taa_required, contracts.account_overdue, jobs.id AS jobs_id, jobs.job_number, companies.id AS companies_id, companies.name AS companies_name
FROM contracts
LEFT JOIN jobs ON contracts.job_id = jobs.id
LEFT JOIN companies ON contracts.company_id = companies.id
WHERE contracts.id = '$id'
ORDER BY contracts.end_date";

$sql2 = "SELECT types_id
FROM contracts_types
WHERE contracts_id = '$id'";

//return data
$sql_result = mysql_query($sql,$connection) or die ("Fail.");
$arr = array();
while($obj = mysql_fetch_object($sql_result)) { $arr[] = $obj; }
echo json_encode($arr); //return json

//plus the selected options
$sql_result2 = mysql_query($sql2,$connection) or die ("Fail.");
$arr2 = array();
while($obj2 = mysql_fetch_object($sql_result2)) { $arr2[] = $obj2; }
echo json_encode($arr2); //return json

İşte şu anki sonuç var:

[{"po_number":"test","start_date":"1261116000","end_date":"1262239200","description":"test","taa_required":"0","account_overdue":"1","jobs_id":null,"job_number":null,"companies_id":"4","companies_name":"Primacore Inc."}][{"types_id":"37"},{"types_id":"4"}]

Kök altında ayrı bir yığın yerleştirilir son bölüm [: {"types_id" "4"} {"37" "types_id"}] nasıl fark. Ben, "türleri" gibi bir isim altında ilk dalı iç içe olmak isteyen kulüpler.

Benim soru Php dizi manipülasyon yapmak için daha fazla olduğunu düşünüyorum, ama ben bu konuda iyi değilim.

Herhangi bir rehberlik için teşekkür ederiz.

3 Cevap

JSON çıktısı önce başka bir yapı içine sonuçlarını birleştirmek. Kullan array_values to convert the type IDs into an array of type IDs. Also, fix that SQL injection açığı. PDO kullanarak, ve hata modu varsayarak set PDO için :: ERRMODE_EXCEPTION:

$id = $_POST['id'];
try {
    $contractQuery = $db->prepare("SELECT contracts.po_number, contracts.start_date, contracts.end_date, contracts.description, contracts.taa_required, contracts.account_overdue, jobs.id AS jobs_id, jobs.job_number, companies.id AS companies_id, companies.name AS companies_name
        FROM contracts
        LEFT JOIN jobs ON contracts.job_id = jobs.id
        LEFT JOIN companies ON contracts.company_id = companies.id
        WHERE contracts.id = ?
        ORDER BY contracts.end_date");

    $typesQuery = $db->prepare("SELECT types_id
        FROM contracts_types
        WHERE contracts_id = ?");

    $contractQuery->execute(array($id));
    $typesQuery->execute(array($id));

    $result = array();
    $result['contracts'] = $contractQuery->fetchAll(PDO::FETCH_ASSOC);
    $result['types'] = array_values($typesQuery->fetchAll(PDO::FETCH_NUM));

    echo json_encode($result); //return json
} catch (PDOException $exc) {
    ...
}

$contractQuery en fazla bir satırda dönerse, için getir satırları değiştirin:

    $result = $contractQuery->fetch(PDO::FETCH_ASSOC);
    $result['types'] = array_values($typesQuery->fetchAll(PDO::FETCH_NUM));

Daha iyi SQL düzeyinde bir JOIN ile iki sorgu konsolide tarafından hizmet olacağını gibi görünüyor. Ancak, iki diziler eşit uzunluğa sahip varsayarak:

for ($x = 0, $c = count($arr); $x < $c; $x++) {
    if (isset($arr2[$x])) {
        $arr[$x] += $arr2[$x];
    }
}

echo json_encode($arr);

Düzenleme: Bu düzgün çalışması için size mysql_fetch_assoc için mysql_fetch_object değiştirmek gerekir.

Neden 2 ayrı diziler kullanıyorsunuz? Ben sadece $arr yerine de 2. sorgunun satır eklemek istiyorum $arr2. Bu şekilde, 2 sorguları tüm satırları içeren tek bir dizi ile sonuna kadar.