#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 ;
}
Пожалуйста, попробуйте этот код