Intellect Board Pro
Расширяемый движок форума с разделами разных типов
Объявление
Вышла версия 3.05 с фотогалереей и поддержкой PostgreSQL и SQLite.
Перейти к скачиванию
Привет, гость!

Добавление дополнительной базы данных к профилям форума

Настройки отображения темы Показывать по сообщений с сортировкой .
Выводить , отправленные .
Страницы:
  • 1
  • 2
Распечатать
damisejker
Новичок
Всего сообщений: 21
Зарегистрирован: 24 июл. 2020 г., 19:04
Откуда: Варшава
Рейтинг пользователя: 0

0
#1
Добрый день,

Хотел бы в профили пользователей на форуме, вывести дополнительную информацию из соседней таблицы ориентируясь на ЛОГИН. 
Есть отдельная от форума таблица в базе данных, где существуют пользователи основного сайта с идентичными логинами.

Таким образом в конце файла прописываю подключение ко второй базе и вывод данных: 
modules/user.php

// Данные БД $servername = "localhost"; $username = "[данные скрыты]"; $password = "[данные скрыты]"; $db = "[данные скрыты]"; // Подключаемся к серверу $conn = new mysqli($servername, $username, $password, $db); // Check connection if ($conn->connect_error) {   die("Ошибка подключения к базам данных: " . $conn->connect_error); } function get_inventar() {       $sql = "SELECT `picture` FROM `depositarium` WHERE `login`='".$this->out->userdata['basic']['display_name']."' and `category`!='ingredients' and `used`!=1 and `shop`!='lumnicshop' and `shop`!='ejkers' and `shop`!='pets'";     $conn->out->inventar = $conn->db->select_all($sql);     $conn->out->picture = 0;     for ($i=0, $count=count($conn->out->inventar); $i<$count; $i++) {       $conn->out->picture+=$conn->out->inventar[$i]['picture'];     } }

и в user/view_user.tpl
<h3>Инвентарь</h3> {% for item in inventar %} <img src='{{ item.picture }}' height='38'> {% endfor %}


Писал коды ориентируясь на примеры в самом файле, но они не работают (естественно).

Хотел бы спросить совета, как можно провести дополнительную базу и вытягивать доп. информацию пользователей ориентируясь на логин?

4X_Pro
Основатель проекта
Всего сообщений: 401
Зарегистрирован: 22 сент. 2014 г., 18:56
Откуда: Москва, Перово
Рейтинг пользователя: 15

0
#2
У вас ошибка в том, что данные для вывода нужно заносить в свойство out приложения (которое внутри actions доступно как $this->out), а вы пытаетесь сделать свойство out в SQL-соединении.
Второй момент: если таблица в той же базе, что и таблицы форума, то дополнительное подключение не нужно.
Нужно отредактировать файл modules/user.php, в нём найти функцию action_view_user и в конце добавить что-то вроде:
$sql = "SELECT * FROM depositarium WHERE login='".$this->db->slashes($udata['login']).'"'; $this->out->inventar = $this->db->select_all($sql);
$this->db->slashes — это экранирование для защиты от SQL injection.

Критикуя — предлагай, предлагая — обосновывай!
4xpro.ru — мой личный сайт-мультиблог на Intellect Board.

damisejker
Новичок
Всего сообщений: 21
Зарегистрирован: 24 июл. 2020 г., 19:04
Откуда: Варшава
Рейтинг пользователя: 0

0
#3
4X_Pro, я неверно сформулировал, база основного сайта отделена от форума, поэтому я пробую подключить вторую базу из которой бы хотел извлекать нужную информацию..

Правда, я сейчас не совсем теперь понимаю как это реализовать. $this - это переменная, которая подключается к базе форума, нет так ли? Потому я и вписал $conn->out, полагая что тут будет конект к базе второй. миль пардон, если несу бред. Я только учусь.

4X_Pro
Основатель проекта
Всего сообщений: 401
Зарегистрирован: 22 сент. 2014 г., 18:56
Откуда: Москва, Перово
Рейтинг пользователя: 15

0
#4
Нет, $this — это, в общем случае, указатель на экземпляр текущего класса, в методе которого мы находимся. В IntB внутри функций, имена которых начинаются на action, он указывает на экземпляр класса модуля, а модули наследуются от класса Application, описанного в app/app.php. $this->db — это вложенный в Application класс для работы с базой данных.
Тогда реально нужно использовать отдельное соединение. А из action_view_user вызывать вашу функцию (которую нужно поместить внутри класса Application_user). Но результат её выполнения класть всё равно в $this->out.

Критикуя — предлагай, предлагая — обосновывай!
4xpro.ru — мой личный сайт-мультиблог на Intellect Board.

damisejker
Новичок
Всего сообщений: 21
Зарегистрирован: 24 июл. 2020 г., 19:04
Откуда: Варшава
Рейтинг пользователя: 0

0
. Редактировалось 2 раза, последний — #5
Поместил в action_view_user следующий код:

$servername = "localhost";
$username = "";
$password = "";
$db = "";

// Подключаемся к серверу
$conn = new mysqli($servername, $username, $password, $db) or die("Connect failed: %s\n". $conn -> error);

return $conn;

(если поместить функцию вне action_view_user, то выскакивает ошибка что вызываю неизвестную функцию)

После этого:
$dbc = sqlinit(); // функция подключения ко второй базе

  $sql = "SELECT `picture` FROM `depositarium` WHERE `login`='".$this->db->slashes($udata['login'])."'";
    $this->out->inventar = $this->$dbc->select_all($sql);
    $this->out->picture = 0;
    for ($i=0, $count=count($this->out->inventar); $i<$count; $i++) {
      $this->out->picture+=$this->out->inventar[$i]['picture'];
    }


Выходит такая ошибка:



Fatal error: Uncaught Error: Call to a member function select_all() on null in /home//modules/user.php:526 Stack trace: #0 /home//app/app.php(428): user->action_view_user() #1 /home//app/app.php(85): Application->process() #2 /home//www/user.php(8): Application->main() #3 {main} thrown in /home//modules/user.php on line 526




Что я делаю не так?



4X_Pro
Основатель проекта
Всего сообщений: 401
Зарегистрирован: 22 сент. 2014 г., 18:56
Откуда: Москва, Перово
Рейтинг пользователя: 15

0
. Редактировалось 1 раз, последний — #6
Тут вот в чём дело: select_all — это надстройка над драйвером базы, добавленная в самом IntB (если интересно, загляните в файл db/database.php, чтобы посмотреть, как она сделана). И можно пойти двумя путями. Первый — это установить второе соединение с помощью этой же надстройки:
$conn2 = new Database_mysqli(array('DB_host'=>'localhost','DB_user'=>'*','DB_password'=>'*','DB_name'=>'*')); $sql = "SELECT `picture` FROM `depositarium` WHERE `login`='".$this->db->slashes($udata['login'])."'"; $this->out->inventar = $conn2->select_all($sql);
Если соединение устанавливается без неё, обычным mysqli (как вы сейчас делаете), то нужно работать с обычным циклом извлечения результатов через mysqli_fetch_assoc или mysqli_fetch_row;

Критикуя — предлагай, предлагая — обосновывай!
4xpro.ru — мой личный сайт-мультиблог на Intellect Board.

damisejker
Новичок
Всего сообщений: 21
Зарегистрирован: 24 июл. 2020 г., 19:04
Откуда: Варшава
Рейтинг пользователя: 0

0
. Редактировалось 2 раза, последний — #7
4X_Pro,
$conn2 = new Database_mysqli(array('DB_host'=>'localhost','DB_user'=>'*','DB_password'=>'*','DB_name'=>'*'));
$sql = "SELECT `picture` FROM `depositarium` WHERE `login`='".$this->db->slashes($udata['login'])."'";
$this->out->inventar = $conn2->select_all($sql);
//дописал
$this->out->picture = 0;
for ($i=0, $count=count($this->out->inventar); $i<$count; $i++) {
$this->out->picture+=$this->out->inventar[$i]['picture'];
}


Этот метод мне импонирует даже больше, чем прописывание кодов обычным mysqli. Только теперь этот код выдаёт кучу ошибок в файле mysqli.php

0: mysqli_query() expects parameter 1 to be mysqli, null given (строка 62, /home//db/mysqli.php, ошибка: 2)<ul style="font-size: 0.9em; color: #600"></ul> 0: mysqli_num_rows() expects parameter 1 to be mysqli_result, null given (строка 157, /home//db/mysqli.php, ошибка: 2)<ul style="font-size: 0.9em; color: #600"></ul> 0: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, null given (строка 103, //db/mysqli.php, ошибка: 2)<ul style="font-size: 0.9em; color: #600"></ul> 0: mysqli_free_result() expects parameter 1 to be mysqli_result, null given (строка 118, /home//db/mysqli.php, ошибка: 2)<ul style="font-size: 0.9em; color: #600"></ul>

4X_Pro
Основатель проекта
Всего сообщений: 401
Зарегистрирован: 22 сент. 2014 г., 18:56
Откуда: Москва, Перово
Рейтинг пользователя: 15

0
. Редактировалось 1 раз, последний — #8
Ошибся: имя пользователя должно быть не в DB_user, а DB_username. Из-за этого соединение не устанавливается и появляются такие ошибки.

Критикуя — предлагай, предлагая — обосновывай!
4xpro.ru — мой личный сайт-мультиблог на Intellect Board.

damisejker
Новичок
Всего сообщений: 21
Зарегистрирован: 24 июл. 2020 г., 19:04
Откуда: Варшава
Рейтинг пользователя: 0

0
. Редактировалось 2 раза, последний — #9
Нет, увы, это не решило проблемы, такие ошибки дальше высвечиваются...

Я тут попробовал покомбинировать всё ещё методом mysqli:
$result = mysqli_query($mysqli, "SELECT `picture` FROM `depositarium` WHERE `login`=N'$login'"); $this->out->inventar = array(mysqli_fetch_assoc($result)); $this->out->picture = 0; for ($i=0, $count=count($this->out->inventar); $i<$count; $i++) { }

Вы знаете сработало! Но... возвращает всего один результат. А в базе их 8. Уже битый час сижу гуглю и ничего путного найти не могу.. Я бы мог и while'ом всё вывести, но я не понимаю как в Twig прописать while.

4X_Pro
Основатель проекта
Всего сообщений: 401
Зарегистрирован: 22 сент. 2014 г., 18:56
Откуда: Москва, Перово
Рейтинг пользователя: 15

0
#10
Ну правильно, mysqli_fetch_assoc получает всего одну строку. Чтобы получить все, нужно циклом пройтись:
$result = mysqli_query($mysqli, "SELECT `picture` FROM `depositarium` WHERE `login`=N'$login'"); $this->out->inverntar=array(); while ($data=mysqli_fetch_assoc($result)) $this->out->inverntar[]=$data;
А что должен делать цикл for?

Критикуя — предлагай, предлагая — обосновывай!
4xpro.ru — мой личный сайт-мультиблог на Intellect Board.

Следующие сообщения >>>
Страницы:
  • 1
  • 2
Распечатать

У вас нет прав для отправки сообщений в эту тему.