Хранить результаты stmt в массиве внутри массива

#php #mysqli

#php #mysqli

Вопрос:

Итак, я пытаюсь создать несколько «результирующих» массивов и заполнить их результатами моего оператора внутри «основного» массива.

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

Мой код:

 function retrieve_clients() {
    $coach_id = $_SESSION['user_details']['id'];

    $connection = connection();
    $statement = select($connection, '*', 'relations', 'coach_id', '=');
    $statement->bind_param('i', $coach_id);

    if ($statement->execute()) {
        $statement->bind_result($id, $coach_id, $client_id, $relation_date);

        while ($statement->fetch()) {
            $_SESSION['clients'] = array(
                array($id, $coach_id, $client_id, $relation_date)
            );
       }
    }
$statement->close();
}
  

Я больше не могу в этом разобраться. Пожалуйста, избавьте меня, потому что я все еще новичок в программировании.

Комментарии:

1. Какую библиотеку базы данных вы использовали для «select ()»

2. Вот ссылка на руководство по PHP, в котором описывается, как добавлять элементы в массивы.

Ответ №1:

Вам нужно добавить еще одно измерение для ваших клиентов, добавив [] в конец переменной.

 $_SESSION['clients'][] = array(
            array($id, $coach_id, $client_id, $relation_date)
        );
  

Ответ №2:

Я думаю, что другие ответы находятся на правильном пути, однако они добавляют ненужное и, вероятно, нежелательное измерение. Попробуйте добавить динамическое измерение с [] помощью, но удалите одно из array измерений, которое перезаписывает:

 $_SESSION['clients'][] = array($id, $coach_id, $client_id, $relation_date);
  

Комментарии:

1. Упс, я это пропустил. Хороший улов!

Ответ №3:

Это потому, что вы заменяете значение clients в следующей строке,

 $_SESSION['clients'] = array(
                array($id, $coach_id, $client_id, $relation_date)
            );
  

Что вам нужно сделать, это сначала создать массив клиентов перед циклом, а затем добавить каждый массив в основной массив.

Вот так,

 $_SESSION['clients']=array();
while ($statement->fetch()) {
            $_SESSION['clients'][] = array(
                array($id, $coach_id, $client_id, $relation_date)
            );
  

Комментарии:

1. $_SESSION сам по себе массив. Нет необходимости объявлять его.

2. 1 для инициализации $_SESSION['clients'] . Я думаю, что это хорошая идея, даже если это не является абсолютно необходимым. Таким образом, если запрос ничего не возвращает $_SESSION['clients'] , вместо неопределенного индекса будет пустой массив.

3. Да, именно поэтому я инициализировал его как массив.

Ответ №4:

Сделайте себе одолжение, прекратите использовать mysqli (а также эту самодельную функцию «select»).

С PDO у вас будет нормальный код:

 function retrieve_clients() {
    $sql = "SELECT * FROM relation WHERE coach_id = ?";
    $statement = connection()->prepare($sql); // here goes your SQL
    $statement->execute([$_SESSION['user_details']['id']]); // here goes a parameter
    $_SESSION['clients'] = $statement->fetchAll(); // and here you have your array
}
  

Комментарии:

1. Подготовленные инструкции намного проще с PDO.