php условие для фильтрации результатов по данным json - PullRequest
0 голосов
/ 03 июня 2019

Я пытаюсь получить результат grand_total из базы данных, где payment_status = paid, посмотрите структуру моей базы данных и код, который не возвращает платные статусы, результаты оплаты возвращают все результаты

Вот структура базы данных и данные

   ref_id |            payment_status          |    grand_total 
     19   |     [{"admin":"","status":"due"}]  |        100
     19   |     [{"admin":"","status":"paid"}] |        50
     19   |     [{"admin":"","status":"paid"}] |        500

Вот моя функция до сих пор

function total_referral_purchase($referral_id)
{
    $return = 0;
    $sales  = $this->db->get('sale')->result_array();
    foreach ($sales as $row) {
         $payment_status = json_decode($row['payment_status'],true);
         $status = $payment_status['status'];

        if ($row['ref_id'] == $referral_id && $status == 'paid' ) {
            $return += $row['grand_total'];
        }
    }
    return $this->cart->format_number($return);
}

Результат, который я получаю = 0

Ожидаемый результат = 550

Редактировать:

var_dump array(1) { 
    [0]=> array(20) { 
        ["sale_id"]=> string(3) "202" 
        ["sale_code"]=> string(9) "201906202" 
        ["buyer"]=> string(1) "1" 
        ["guest_id"]=> NULL 
        ["ref_id"]=> string(2) "19" 
        ["commission"]=> string(4) "8.83" 
        ["grand_total"]=> string(5) "83.63"
        ["payment_status"]=> string(30) "[{"admin":"","status":"paid"}]" 
        ["payment_details"]=> string(4) "none" 
        ["payment_timestamp"]=> NULL 
        ["sale_datetime"]=> string(10) "1559492618" 
        ["delivary_datetime"]=> string(0) "" 
        ["delivery_status"]=> string(65) "[{"admin":"","status":"pending","comment":"","delivery_time":""}]" 
        ["viewed"]=> string(2) "ok" 
    }
}

Ответы [ 2 ]

3 голосов
/ 03 июня 2019

Функция json_decode возвращает массив, основанный на вашем формате json. Итак, результат вашего текущего кода

json_decode($row['payment_status'],true);

возвращает массив с этим форматом

array(1) {
[0]=>
  array(2) {
    ["admin"]=>
    string(0) ""
    ["status"]=>
    string(4) "paid"
  }
}

из-за '[]' вокруг json, что означает, что у него будет несколько записей, и он анализирует его как массив. Таким образом, $status всегда равен нулю и его следует либо заменить на

$status = $payment_status[0]['status'];

Или измените формат из базы данных, например '{"admin":"","status":"paid"}', чтобы он работал в вашем текущем режиме.

2 голосов
/ 03 июня 2019

JSON, который вы используете, является массивом, как указано в квадратных скобках.

Есть два способа исправить это:

  1. Вы измените JSON с [{"admin":"","status":"due"}] на {"admin":"","status":"due"} в своей базе данных. Это делает его одним объектом JSON вместо массива.
  2. Вместо $status = $payment_status['status']; использовать $status = $payment_status[0]['status']; Выбирает значение 'status' из первого объекта в массиве.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...