Как мне получить результаты моей базы данных в виде массива?

#php #arrays #oop

#php #массивы #ооп

Вопрос:

Я хочу создать этот массив с данными из моей базы данных..

 | Day | Comment | OtherComment |
|-----|---------|--------------|
|  1  |  hallo  | hallohallo   |
|-----|---------|--------------|
|  2  |  hey    | heyhey       |
|-----|---------|--------------|
|  3  |  hello  | hellohello   |
|_____|_________|______________|
  

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

 $sql = "select DiaryOpmerkingen, DiaryDoctorcomment from tblDiary 
                WHERE fk_UserId = ".$p_iUserid."
                AND DiaryDay = '".$this->Day."';";
        $rResult = mysqli_query($link, $sql);
        return $rResult;

        $dim = array();

        while ( $row = mysql_fetch_assoc($result) )
        $dim[$row['DiaryOpmerkingen']][$row['DiaryDoctorcomment']] = $row;
  

Ответ №1:

Использование MySQLi

Хорошо, поскольку мы планируем сделать это с помощью MySQLi, я хотел бы познакомить вас с объектно-ориентированным способом использования mysqli, поэтому вам не нужно постоянно передавать ссылку на базу данных в ваших вызовах. Нам нужно внести изменения в способ подключения:

 $mysqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db');

if ($mysqli->connect_error) {
    // So the user an error instead of exiting like this
    // in your production code!
    echo "Connect Error ({$mysqli->connect_errno}) {$mysqli->connect_error}";
    exit;
}
  

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

 $sql = "SELECT DiaryOpmerkingen, DiaryDoctorcomment FROM tblDiary 
                WHERE fk_UserId = ?
                AND DiaryDay = ?";

$stmt = $mysqli->prepare($sql);
if(!$stmt) {
  // Let the user know the query failed!
}
  

Это немного непривычный поиск для тех из нас, кто привык к вашим стандартным запросам со встроенными переменными:

 $sql = "SELECT DiaryOpmerkingen, DiaryDoctorcomment FROM tblDiary 
                WHERE fk_UserId = ?
                AND DiaryDay = ?";
  

В основном вопросительные знаки действуют как заполнители, которые мы будем заполнять фактическими значениями, которые мы хотим. Пожалуйста, обратите внимание, что для строковых значений вам не нужно заключать значение в кавычки:

 $sql = "SELECT DiaryOpmerkingen, DiaryDoctorcomment FROM tblDiary 
                WHERE fk_UserId = ?
                AND DiaryDay = '?'"; <-- This is wrong!!
  

Далее следует ядро подготовленных инструкций:

 $stmt->bind_param('is', $p_iUserid, $this->Day);
  

Здесь мы сообщаем MySQLi, чем мы хотим заменить заполнители вопросительных знаков. Первый аргумент в bind_param указывает тип данных, которые мы заменяем. Это позволяет MySQLi выполнять проверки работоспособности.

В этом случае i представляет собой целочисленное значение, а s представляет собой строковое значение. Затем мы перечисляем наши значения в том порядке, в котором они отображаются в запросе. $p_iUserid заменяет первое ? и $this->Day заменяет второе ? . Теперь мы выполним эту инструкцию, чтобы получить фактические данные:

 $stmt->execute();
  

Следующая часть представляет собой очень интересную функцию:

 $stmt->bind_result($diaryOpmerkingen, $diaryDoctorcomment);
  

На первый взгляд это кажется сложным, но на самом деле это очень упрощает работу с запросом. Что делает эта функция, так это создает переменные $diaryOpmerkingen и $diaryDoctorcommen заполняет их фактическими данными столбца, когда мы перебираем наши результаты:

 $dim = array();
while ($stmt->fetch()) {
  $dim[$diaryOpmerkingen][$diaryDoctorcomment] = array($diaryOpmerkingen, $diaryDoctorcomment);
}
  

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

 $stmt->close();
  

Наконец, мы закрываем наше основное соединение с базой данных:

 $mysqli->close();
  

Вот полный список кода для справки:

 $mysqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db');

if ($mysqli->connect_error) {
    // So the user an error instead of exiting like this
    // in your production code!
    echo "Connect Error ({$mysqli->connect_errno}) {$mysqli->connect_error}";
    exit;
}

$sql = "SELECT DiaryOpmerkingen, DiaryDoctorcomment FROM tblDiary 
                WHERE fk_UserId = ?
                AND DiaryDay = ?";

$stmt = $mysqli->prepare($sql);
if(!$stmt) {
  // Let the user know the query failed!
}

$stmt->bind_param('is', $p_iUserid, $this->Day);
$stmt->execute();
$stmt->bind_result($diaryOpmerkingen, $diaryDoctorcomment);

$dim = array();
while ($stmt->fetch()) {
  $dim[$diaryOpmerkingen][$diaryDoctorcomment] = array($diaryOpmerkingen, $diaryDoctorcomment);
}

$stmt->close();

$mysqli->close();
  

Использование стандартного MySQL

 $sql = "select DiaryOpmerkingen, DiaryDoctorcomment from tblDiary 
                WHERE fk_UserId = ".$p_iUserid."
                AND DiaryDay = '".$this->Day."';";
  

Выбираем только нужные вам столбцы. Очень хорошо. Однако, поскольку мы уже используем двойные кавычки, нам не нужен оператор конкатенации. Также неплохо последовательно выделять ключевые слова SQL из столбца и значений:

 $sql = "SELECT DiaryOpmerkingen, DiaryDoctorcomment FROM tblDiary 
                WHERE fk_UserId = $p_iUserid
                AND DiaryDay = '{$this->Day}'";
  

Далее:

 $rResult = mysqli_query($link, $sql);
  

Вы смешиваете $link и $sql параметры, а также смешиваете mysqli и mysql серии функций. Кроме того, если у вас нет другого подключения где-то еще, вы можете просто использовать $sql в качестве единственного параметра:

 $rResult = mysql_query($sql);
  

Теперь вы возвращаете результат:

     return $rResult;
  

но при выполнении следующих фрагментов кода они не вызываются, поэтому мы можем избавиться от этого. Наконец, мы перебираем результаты:

     $dim = array();

    while ( $row = mysql_fetch_assoc($rResult) )
    {
      $dim[$row['DiaryOpmerkingen']][$row['DiaryDoctorcomment']] = $row;
    }
  

Вот окончательный код:

 // Make sure $this->Day is sanitized if it's user input data
$day = mysql_real_escape_string($this->Day);
$sql = "SELECT DiaryOpmerkingen, DiaryDoctorcomment FROM tblDiary 
                WHERE fk_UserId = $p_iUserid
                AND DiaryDay = '$day'";

$rResult = mysql_query($sql);
if(!$rResult) {
  //Do something with the error
}

$dim = array();
while ( $row = mysql_fetch_assoc($rResult) )
{
  $dim[$row['DiaryOpmerkingen']][$row['DiaryDoctorcomment']] = $row;
}    
  

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

1. @onteria Я получаю это предупреждение: Предупреждение: mysqli_real_escape_string() ожидает ровно 2 параметра, 1 из которых указан в /Users/Kim/Sites/snooze/classes/User.class.php в строке 396 Предупреждение: mysqli_query () ожидает как минимум 2 параметра, 1 из которых указан в /Users/Kim/Sites/snooze/classes/User.class.php в строке 402 Предупреждение: mysqli_fetch_assoc() ожидает, что параметром 1 будет mysqli_result, значение null указано в /Users/Kim/Sites/snooze/classes/User.class.php в строке 410 Мой sql записан правильно: ВЫБЕРИТЕ DiaryOpmerkingen, DiaryDoctorcomment ИЗ tblDiary, ГДЕ fk_UserId = 1 И DiaryDay = 1, Не знаю, как проверить, правильно ли это

2. @KimWouters Вы пытаетесь использовать mysqli серию функций. В вашем исходном сообщении смешаны mysql и mysqli функции. Что вы планируете использовать?

3. @onteria_ Если это возможно mysqli .. Спасибо за вашу помощь!

4. @KimWouters Я обновил свой ответ, чтобы предоставить способ MySQLi для этого. Обратите внимание, что я использую объектно-ориентированный способ, который я настоятельно рекомендую использовать, чтобы не передавать вашу ссылку на базу данных другим пользователям.

5. @onteria_ вау! Большое спасибо! Действительно. Я сразу же это внедрю. 🙂

Ответ №2:

Ознакомьтесь с некоторыми функциями sql на этой странице 5 полезных функций PHP для извлечения данных MySQL

Ответ №3:

Попробуйте:
while ( $r = mysql_fetch_assoc($result) )

$dim[$r[‘day’]] = [«DiaryOpmerkingen» => $ r [‘DiaryOpmerkingen’]], ‘DiaryDoctorcomment’ => [$r [‘DiaryDoctorcomment’]];

Ответ №4:

 $i=0;
 while ( $row = mysql_fetch_assoc($result) )
  {
   extract($row);
$arr[$i]=$DiaryOpmerkingen;
$i  ;

$arr[$i]=$DiaryDoctorcomment;

$i  ;

}
  

Пожалуйста, попробуйте этот код