Задать вопрос
Ответы пользователя по тегу PHP
  • Как прочитать данные из двух таблиц одновременно?

    ValeriuCutebov
    @ValeriuCutebov
    Для того чтобы получить данные из двух таблиц, вам необходимо сделать JOIN запрос к базе данных, объединяя таблицу материалов с таблицей категорий. Пример такого запроса может выглядеть так:

    SELECT f.*, c.category_name 
    FROM freeroll f 
    JOIN category c ON f.category_id = c.id 
    ORDER BY f.id

    В этом запросе мы объединяем таблицы freeroll и category, используя условие ON f.category_id = c.id, и выбираем все столбцы из таблицы freeroll (*) и столбец category_name из таблицы category. Этот запрос вернет результат, который содержит данные из обеих таблиц, а также связанные данные из таблицы category для каждого материала.

    Чтобы реализовать этот запрос в методе read() вашей модели Freeroll, вам необходимо изменить запрос в методе read() на:
    $query = "SELECT f.*, c.category_name 
              FROM " . $this->table_name . " f 
              JOIN category c ON f.category_id = c.id 
              ORDER BY f.id";

    Затем, в цикле while, вы можете добавить значение category_name к массиву $freeroll_item:
    $freeroll_item = array(
        "id" => $id,
        "name_turnament" => $name_turnament,
        "prize" => $prize,
        "password" => $password,
        "data" => $data,
        "time" => $time,
        "category_id" => $category_id,
        "category_name" => $category_name,
        "buyin" => $buyin,
        "buyin_symbol" => html_entity_decode($buyin_symbol),
        "prize_symbol" => html_entity_decode($prize_symbol)
    );

    Здесь мы добавляем значение category_name к массиву $freeroll_item, которое мы получили из таблицы category с помощью JOIN запроса.

    Далее, в методе read.php вы можете вызвать метод read() вашей модели Category, чтобы получить все записи из таблицы категорий, и сохранить результаты в массив $category_arr. Это можно сделать следующим образом:
    $category = new Category($db);
    $category_stmt = $category->read();
    $category_num = $category_stmt->rowCount();
    
    $category_arr = array();
    while ($category_row = $category_stmt->fetch(PDO::FETCH_ASSOC)) {
        extract($category_row);
        $category_item = array(
            "id" => $id,
            "category_name" => $category_name
        );
        array_push($category_arr, $category_item);
    }

    Затем, внутри цикла while для каждого материала в $freeroll_arr, вы можете перебрать массив $category_arr, чтобы найти категорию с нужным id, и добавить ее значение к массиву $freeroll_item:
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        extract($row);
    
        $freeroll_item = array(
            "id" => $id,
            "name_turnament" => $name_turnament,
            "prize" => $prize,
            "password" => $password,
            "data" => $data,
            "time" => $time,
            "category_id" => $category_id,
            "buyin" => $buyin,
            "buyin_symbol" => html_entity_decode($buyin_symbol),
            "prize_symbol" => html_entity_decode($prize_symbol)
    );
    
    // Поиск категории с нужным id в массиве $category_arr
    foreach ($category_arr as $category_item) {
        if ($category_item['id'] == $category_id) {
            $freeroll_item['category_name'] = $category_item['category_name'];
            break;
        }
    }
    
    array_push($freeroll_arr["freeroll"], $freeroll_item);
    }

    Здесь мы ищем категорию с нужным id в массиве $category_arr, и если находим, добавляем значение category_name к массиву $freeroll_item.

    Теперь ваш метод read() будет возвращать все записи из таблицы freeroll, включая название категории для каждого материала.
    Ответ написан
    1 комментарий
  • Как получить одно из значений ответа на запрос?

    ValeriuCutebov
    @ValeriuCutebov
    Чтобы получить значение transaction_status из ответа на запрос, вам нужно сначала декодировать JSON-строку в массив PHP. Это можно сделать с помощью функции json_decode:

    $response = '{"status":"success","1":{"transaction":"8025400","email":"Не указана","amount":"21.38","currency":"RUB","currency_amount":"20.00","comission_percent":"6.90","comission_fixed":"0.00","amount_profit":"20.00","method":"Не выбран","payment_id":"1618399991","description":"Покупка доступа на 2 дня","date":"2023-03-13 19:40:46","pay_date":"2023-03-13 19:40:46","transaction_status":"0","custom_fields":"null","webhook_status":"0","webhook_amount":"0"}}';
    $data = json_decode($response, true);
    $transaction_status = $data["1"]["transaction_status"];

    Затем вы можете использовать переменную $transaction_status в своих условиях if / else:

    if ($transaction_status == 0) {
      echo 'Статус транзакции = 0';
      exit(0);
    } else {
      echo 'Статус транзакции не равен 0';
    }

    Надеюсь, это поможет!
    Ответ написан
    5 комментариев
  • Как начинать массив с 1, а не с 0 в php?

    ValeriuCutebov
    @ValeriuCutebov
    В PHP массивы всегда начинаются с нуля, но вы можете создать массив, который начинается с 1, путем использования функции array_combine(), которая создает новый массив, используя один массив в качестве ключей, а другой - в качестве значений.

    В вашем случае, вы можете создать массив со значениями ключей, начиная с 1, используя цикл foreach для перебора пользователей и добавления их в новый массив с помощью функции array_combine(). Затем вы можете использовать новый массив вместо исходного для поиска пользователей и определения их индексов.

    protected function getServiceAccountId()
    {
      $serviceAccounts = $this->finder('XF:User')
        ->where('is_service_account', true)
        ->order('user_id')
        ->fetch()->toArray();
    
      $keyValues = range(1, count($serviceAccounts));
      $keyedAccounts = array_combine($keyValues, $serviceAccounts);
    
      foreach ($keyedAccounts as $key => $serviceAccount)
      {
        if ($serviceAccount->user_id == $this->user_id)
        {
          return $key;
        }
      }
    
      return $keyedAccounts;
    }

    В этом примере мы используем функцию range() для создания массива с числами от 1 до количества пользователей в $serviceAccounts. Затем мы используем array_combine(), чтобы создать новый массив $keyedAccounts, используя этот массив чисел в качестве ключей и $serviceAccounts в качестве значений.

    Далее мы используем новый массив $keyedAccounts вместо $serviceAccounts в цикле foreach для поиска пользователей и определения их индексов.

    Надеюсь, это поможет вам решить вашу проблему!
    Ответ написан
    Комментировать
  • Почему сервер падает через AJAX запросы?

    ValeriuCutebov
    @ValeriuCutebov
    Скорее всего, причина падения сервера связана с тем, что каждый AJAX запрос создает новое соединение с базой данных, и эти соединения не закрываются после обработки запроса. Когда количество открытых соединений достигает определенного предела, сервер может перегрузиться и перестать отвечать на запросы.

    Для решения этой проблемы необходимо закрывать соединения с базой данных после обработки каждого запроса. Для этого можно использовать функцию mysqli_close() после выполнения запроса:

    $sql = "SELECT * FROM articles DESC LIMIT ".$startFrom.", 4";
    $res = mysqli_query($conn, $sql);
    $articles = array();
    while ($row = mysqli_fetch_assoc($res)){
    $articles[] = $row;
    }
    mysqli_close($conn);
    echo json_encode($articles);

    Также стоит проверить настройки сервера и базы данных, чтобы убедиться, что максимальное количество одновременных соединений не превышает допустимых значений. Если это не помогает, то может быть необходимо использовать более мощный сервер или оптимизировать запросы к базе данных для уменьшения нагрузки на сервер.
    Ответ написан