PHP: объединение двух отдельных запросов mysql в один и тот же объект данных json - PullRequest
4 голосов
/ 19 апреля 2010

Я пытаюсь объединить приведенные ниже результаты запроса mysql в один объект json, но не совсем уверен, как это сделать правильно.

$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

Вот текущий результат:

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

Обратите внимание, как последний раздел [{"types_id": "37"}, {"types_id": "4"}] помещается в отдельный блок под root.Я хочу, чтобы он был вложен в первую ветку под именем типа «types».

Я думаю, что мой вопрос больше связан с манипуляциями с массивами Php, но я не лучший в этом вопросе.

Спасибо за любые рекомендации.

Ответы [ 3 ]

5 голосов
/ 19 апреля 2010

Объедините результаты в другую структуру перед выводом в формате JSON. Используйте array_values для преобразования идентификаторов типов в массив идентификаторов типов. Также исправьте эту уязвимость SQL инъекция . Используя PDO и предполагая, что режим ошибки равен , установите в PDO :: 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 возвращает не более одной строки, измените строки выборки на:

    $result = $contractQuery->fetch(PDO::FETCH_ASSOC);
    $result['types'] = array_values($typesQuery->fetchAll(PDO::FETCH_NUM));
1 голос
/ 19 апреля 2010

Казалось бы, вам лучше обойтись, объединив два запроса с JOIN на уровне SQL. Однако при условии, что два массива имеют одинаковую длину:

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

echo json_encode($arr);

Редактировать: вам нужно изменить значение с mysql_fetch_object на mysql_fetch_assoc для правильной работы.

0 голосов
/ 19 апреля 2010

Почему вы используете 2 разных массива? Я бы просто добавил строки 2-го запроса в $arr вместо $arr2. Таким образом, вы получите один массив, содержащий все строки из двух запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...