Добавление дополнительной базы данных к профилям форума
Страницы:
Распечатать
- 1
- 2
Добрый день,
Хотел бы в профили пользователей на форуме, вывести дополнительную информацию из соседней таблицы ориентируясь на ЛОГИН.
Есть отдельная от форума таблица в базе данных, где существуют пользователи основного сайта с идентичными логинами.
Таким образом в конце файла прописываю подключение ко второй базе и вывод данных:
modules/user.php
и в user/view_user.tpl
Писал коды ориентируясь на примеры в самом файле, но они не работают (естественно).
Хотел бы спросить совета, как можно провести дополнительную базу и вытягивать доп. информацию пользователей ориентируясь на логин?
Хотел бы в профили пользователей на форуме, вывести дополнительную информацию из соседней таблицы ориентируясь на ЛОГИН.
Есть отдельная от форума таблица в базе данных, где существуют пользователи основного сайта с идентичными логинами.
Таким образом в конце файла прописываю подключение ко второй базе и вывод данных:
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 %}
Писал коды ориентируясь на примеры в самом файле, но они не работают (естественно).
Хотел бы спросить совета, как можно провести дополнительную базу и вытягивать доп. информацию пользователей ориентируясь на логин?
У вас ошибка в том, что данные для вывода нужно заносить в свойство out приложения (которое внутри actions доступно как $this->out), а вы пытаетесь сделать свойство out в SQL-соединении.
Второй момент: если таблица в той же базе, что и таблицы форума, то дополнительное подключение не нужно.
Нужно отредактировать файл modules/user.php, в нём найти функцию action_view_user и в конце добавить что-то вроде:
$this->db->slashes — это экранирование для защиты от SQL injection.
Второй момент: если таблица в той же базе, что и таблицы форума, то дополнительное подключение не нужно.
Нужно отредактировать файл 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.
4X_Pro, я неверно сформулировал, база основного сайта отделена от форума, поэтому я пробую подключить вторую базу из которой бы хотел извлекать нужную информацию..
Правда, я сейчас не совсем теперь понимаю как это реализовать. $this - это переменная, которая подключается к базе форума, нет так ли? Потому я и вписал $conn->out, полагая что тут будет конект к базе второй. миль пардон, если несу бред. Я только учусь.
Правда, я сейчас не совсем теперь понимаю как это реализовать. $this - это переменная, которая подключается к базе форума, нет так ли? Потому я и вписал $conn->out, полагая что тут будет конект к базе второй. миль пардон, если несу бред. Я только учусь.
Нет, $this — это, в общем случае, указатель на экземпляр текущего класса, в методе которого мы находимся. В IntB внутри функций, имена которых начинаются на action, он указывает на экземпляр класса модуля, а модули наследуются от класса Application, описанного в app/app.php. $this->db — это вложенный в Application класс для работы с базой данных.
Тогда реально нужно использовать отдельное соединение. А из action_view_user вызывать вашу функцию (которую нужно поместить внутри класса Application_user). Но результат её выполнения класть всё равно в $this->out.
Тогда реально нужно использовать отдельное соединение. А из action_view_user вызывать вашу функцию (которую нужно поместить внутри класса Application_user). Но результат её выполнения класть всё равно в $this->out.
Критикуя — предлагай, предлагая — обосновывай!
4xpro.ru — мой личный сайт-мультиблог на Intellect Board.
. Редактировалось 2 раза, последний — #5
Поместил в action_view_user следующий код:
(если поместить функцию вне 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
Что я делаю не так?
. Редактировалось 1 раз, последний — #6
Тут вот в чём дело: select_all — это надстройка над драйвером базы, добавленная в самом IntB (если интересно, загляните в файл db/database.php, чтобы посмотреть, как она сделана). И можно пойти двумя путями. Первый — это установить второе соединение с помощью этой же надстройки:
Если соединение устанавливается без неё, обычным mysqli (как вы сейчас делаете), то нужно работать с обычным циклом извлечения результатов через mysqli_fetch_assoc или mysqli_fetch_row;
$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.
. Редактировалось 2 раза, последний — #7
4X_Pro,
Этот метод мне импонирует даже больше, чем прописывание кодов обычным mysqli. Только теперь этот код выдаёт кучу ошибок в файле mysqli.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);
//дописал
$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>
. Редактировалось 2 раза, последний — #9
Нет, увы, это не решило проблемы, такие ошибки дальше высвечиваются...
Я тут попробовал покомбинировать всё ещё методом mysqli:
Вы знаете сработало! Но... возвращает всего один результат. А в базе их 8. Уже битый час сижу гуглю и ничего путного найти не могу.. Я бы мог и while'ом всё вывести, но я не понимаю как в Twig прописать while.
Я тут попробовал покомбинировать всё ещё методом 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.
Ну правильно, mysqli_fetch_assoc получает всего одну строку. Чтобы получить все, нужно циклом пройтись:
А что должен делать цикл for?
$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
У вас нет прав для отправки сообщений в эту тему.