Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Помогите с DB wrapper-ом
Покинул форум
Сообщений всего: 7
Дата рег-ции: Июль 2017
Помог: 0 раз(а)
Дело стоит так. Решыл накатать соц.сеть для общение между друзьями и т.к. обожаю работать с MVC, решыл разработать сайт именно на MVC. Для того, чтоб было легче работать с БД, накатал wrapper()оболочку. Вот код:
public function results()
{
return $this -> _results;
}
public function count()
{
return $this -> _count;
}
}
?>
В принципе работает хорошо, но когда в одном файле делаеться несколько запросов, то начинает быть проблематичной. Вот код модели в которой собственно и есть проблемы(жирным я виделил, тот кусок кода, который не может никак начать правильно работать):
<?php
class Model_my_page extends Model
{
public function get_data()
{
Собственно, я делал похожый запрос к БД, в котором все отлично работает(пробывал даже скопировать этот запрос на страницу в которой у меня проблемы, то даже рабочий код, перестает там работать):
<?php
class Model_friends_search extends Model
{
public function get_data()
{
$people = DB::getInstance() -> query('SELECT id, main_status, main_name, main_lastName, sys_avatar FROM us_main') -> results();
$counter = DB::getInstance() -> query('SELECT id FROM us_main') -> count();
Собственно проблема в том, что мне нужно получить несколько Авторов, Дат, Текстов и Лайков, а код, который помечен жырным, вытягивает мне последнюю запись и пихает во все элементы массива.
Помогите, кто может, а то уже неделю колупаю этот код.
andrewkard
Отправлено: 07 Июля, 2017 - 16:46:31
Участник
Покинул форум
Сообщений всего: 1372
Дата рег-ции: Нояб. 2014
Покинул форум
Сообщений всего: 7
Дата рег-ции: Июль 2017
Помог: 0 раз(а)
Увы, но нет. Так даже одной записи не находит. Тупо пусто и все.
berna911
Отправлено: 07 Июля, 2017 - 20:37:06
Новичок
Покинул форум
Сообщений всего: 7
Дата рег-ции: Июль 2017
Помог: 0 раз(а)
Ваще, судя по логике, нужно писать так:
foreach ($user_wall -> results() as $walls)
{
$user_walls[$i]['date'] = $walls[$i] -> date;
$user_walls[$i]['author'] = $walls[$i] -> author;
$user_walls[$i]['text'] = $walls[$i] -> text;
$user_walls[$i]['likes'] = $walls[$i] -> likes;
}
Но опять же в результате, я получаю пустые строки. [$i] убираю, получаю только последнюю запись. Суть вопроса в том, почему я не могу получить все записи, вить по точно такому-же алгоритму, в другом файле я все получил, а тут ни в какую.
Sail
Отправлено: 07 Июля, 2017 - 22:44:29
Участник
Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014
Покинул форум
Сообщений всего: 7
Дата рег-ции: Июль 2017
Помог: 0 раз(а)
Sail, не хочу тебя расстраивать, но тебе не получилось убить во мне прогера))
В результате опять-же пустые строки. Может кто-нить кинет еще совет?
И еще, а что ты иммел ввиду, когда писал:"И внимательнее к именам используемых переменных...". Вроде у меня все переменные правильно названы. И на всякий, чтоб никто не путалься: я уверен, что проблема не стоит в названии переменных, потому-что когда я вставлял на этот участок кода аналогичный, рабочий в другом файле код, то в этом файле он переставал работать. И сразу кину в догоночку, что проблема состоит в том, что у меня в результате никак не удаеться получить несколько записей и думаю я, что эта проблема возникает из-за конфликта при вызове DB::getInstance(), но где и ваще почему, этого я понять ваще никак не могу. У меня прост с этим кодом были похожые проблемы:
Но я решыл засунуть результат работы каждого запроса в отдельный елемент массива, а тут чет уперлось и не хочет ничего возвращать. (Добавление)
Если, кто-нить захочет напечатать так:
Покинул форум
Сообщений всего: 7
Дата рег-ции: Июль 2017
Помог: 0 раз(а)
Короч, ребят, не дай Бог кому-нить столкнуться с проблемой подобного рода, потому-что это рили маразм. Но я это порешал
Короч, когда я создаю новый объект DB::getInstance, алгоритм, дописывает в раньше созданный объект новую информацию, тоесть у меня данные с таблицы us_posts были аж у 6-ом и 7-ом елементе массива. Если короче, то решение этой задачи было таким:
Я удалил, потому-что нет смысла инфу дважды запихать по разным массивам;
2.)Строки: for($i = 0; $i < $counter; $i++)
{
$data['user_wall_author'][$i] = $user_walls[$i]['author'];
$data['user_wall_date'][$i] = $user_walls[$i]['date'];
$data['user_wall_text'][$i] = $user_walls[$i]['text'];
$data['user_wall_likes'][$i] = $user_walls[$i]['likes'];
}
Я заменил на: $counterr = 6;
for($i = 0; $i < $counter; $i++)
{
$data['user_wall_author'][$i] = $user_wall[$counterr] -> author;
$data['user_wall_date'][$i] = $user_wall[$counterr] -> date;
$data['user_wall_text'][$i] = $user_wall[$counterr] -> text;
$data['user_wall_likes'][$i] = $user_wall[$counterr] -> likes; $counterr ++;
}
Тоесть, переменная $counterr сразу-же приравняеться к 6-ти, т.к. записи с таблицы us_posts начинаються с 6-го елемента массива объектов $user_wall.
Короч вот такая вот необычная фигня, с которой я колупалься уже неделю.
P.S. Всем кто пыталься мне помочь большая благодарность. И еще(может кому интерестно каким боком я ваще узнал, что с классом DB твориться такая фигня). Все елементарно, зашел у вьюшку, и в начале файла накатал:
<?php
$DB = new DB();
echo "<pre style='color: #fff;'>", print_r($DB -> getInstance() -> query('SELECT * FROM us_posts WHERE author = 3') -> results()), "</pre>";
?>
Так как вьюшка и модель это одно целое, то естественно мне вывело все, что хранилось в классе DB, с которым я работал в модельке. Результат мне вывелься вот такого вида:
Array
(
[0] => stdClass Object
(
[id] => 3
[sys_email] => b.xack@mail.ru
[sys_telephone] => 380918023071
[sys_link] => csm
[sys_avatar] => header.jpg
[main_status] => Yo bich motherfuckааааааа
[main_name] => max
[main_lastName] => Berna
[main_sex] => M
[main_relationship] => Помолвлен
[main_birthdate] => 2017-06-14
[main_city] => Rado
[main_languages] => Ukr
[main_grandfamily] => Bab
[main_family] => Pap
[main_brSys] => Sys
[main_childs] => Ch
[main_grandchilds] => GChi
[main_birthdayShow] => Показувати тількі місяць та день
[cont_country] => Ukr
[cont_city] => Zhit
[cont_rayon] => Bogun
[cont_metro] => Met
[cont_street] => Kot
[cont_name] => Zt
[cont_telephone] => 380973503137
[cont_secondTelephone] => 380918023071
[cont_skype] => berna9111
[cont_sait] => https://cn[dot]net
[int_deatel] => Programmer
[int_interest] => Programming
[int_music] => Dance
[int_films] => Fightings
[int_teleshow] => No
[int_books] => About programming
[int_games] => Logic
[int_citats] => It's good
[int_about] => Cool guy
[lifePos_politic] => Умеренные
[lifePos_world] => Poh
[lifePos_life] => Карьера и деньги
[lifePos_people] => Власть и богатство
[lifePos_smoke] => Компромиссное
[lifePos_alco] => Негативное
[lifePos_vdoh] => Played
[rel_friends] => 5;4;
)
[12] => stdClass Object
(
[id] => 1
[author] => 3
[date] => 2017-07-02
[text] => Всім привіт - це мій перший пост.
[likes] => 0
)
[13] => stdClass Object
(
[id] => 3
[author] => 3
[date] => 2017-07-07
[text] => Це мій другий пост
[likes] => 0
)
)
И сразу стало понятно, где и что храниться.
Всем удачи, счастливого кодинга и чтоб не попадали в такие тупые ситуации как я!
Мелкий
Отправлено: 08 Июля, 2017 - 15:33:43
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Сначала дёргать fetch_object, затем мужественно от избавляться от stdobject.
Сначала пихать все результаты в один список, затем мужественно думать, почему там стало больше данных.
Что у mysqli, что у pdo результат запроса очень даже не случайно отделён от выполнения запросов.
Читаем внимательно. Если не помогло, то читаем очень внимательно.
Что происходит при выполнении второго запроса? Третьего? Последующих?
Ключевое слово - side effects.
berna911 пишет:
[rel_friends] => 5;4;
Вот отчего я не сомневаюсь, что если строк в табличке случайно станет не 5, а хотя бы смешных 50к придёте с вопросом, а что же у вас like '%%' тормозит.
berna911 пишет:
$counter = DB::getInstance() -> query('SELECT id FROM us_main') -> count();
Подумайте на досуге, ЧТО делает эта строчка. И почему за такое безобразие вам надают на ревью по рукам и будут правы.
berna911 пишет:
$users = DB::getInstance() -> query('SELECT * FROM us_main WHERE id = 3');
foreach ($users -> results() as $user);
Та вы просто издеваетесь, да?
----- PostgreSQL DBA
berna911
Отправлено: 08 Июля, 2017 - 15:57:26
Новичок
Покинул форум
Сообщений всего: 7
Дата рег-ции: Июль 2017
Помог: 0 раз(а)
Мелкий, согласен с тобой, у меня сейчас нифига не чистый код и далеко нельзя его назвать правильным, но я же его и не оставлял-бы в таком виде, оптимизация запросов, и остальные фишки я етественно поделаю, единственная проблема в том, что я не понимал, что у меня весь результат записываеться в один список. Это у меня первый wrapper и этот я нашел по ссылке https://www[dot]youtube[dot]com/watch?v=c_bguDh3JXw . Насчет [quote=Мелкий]Что у mysqli, что у pdo результат запроса очень даже не случайно отделён от выполнения запросов.[/quote]
Можежно подробней пжлст?
[quote=Мелкий] Всё! Одна (!) строка, идентичное поведение.
А не, не идентичное. Что вы вообще в этом куске пытались сделать?![/quote]
Тогда смысл, мне было писать wrapper ваще, вить я его создавал с учетом, что в дальнейшем я буду добавлять в него средства защиты, с таким успехом я мог-бы и тупо юзать mysqli и мучаться с wrapper-ом.
[quote=Мелкий]Вот отчего я не сомневаюсь, что если строк в табличке случайно станет не 5, а хотя бы смешных 50к придёте с вопросом, а что же у вас like '%%' тормозит.[/quote]
И вот тут если можешь, подробней, я просто с оптимизацией запросов не очень знаком(кроме приколов типа JOIN), так-что может ты меня подстрахуешь.
[quote=Мелкий][/quote]
Тут я понимаю, что она делает, я просто мучалься с этим гребанным массивом, поэтому накатал получения количества записей как нибудь. Прости если я тебе напряг глаза этой и подобными строками.
Мелкий пишет:
berna911 пишет:
$users = DB::getInstance() -> query('SELECT * FROM us_main WHERE id = 3');
foreach ($users -> results() as $user);
Та вы просто издеваетесь, да?
Тут тебе очередной спасибос и правда запихать всю эту дрян таким макаром запихать не варик. Исправлюсь.
Мелкий
Отправлено: 08 Июля, 2017 - 16:45:40
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
berna911 пишет:
Мелкий пишет:
Что у mysqli, что у pdo результат запроса очень даже не случайно отделён от выполнения запросов.
Можежно подробней пжлст?
mysqli->query возвращает не самого себя, а упаковывает все сведения о выполненном запросе в отдельный объект класса mysqli_result
Аналогично себя ведёт PDO, для результата запроса отдельный объект. Кстати, выпиленный mysql_* ведёт себя аналогично, с той лишь разницей, что вместо объектов оперирует ресурсами.
И это хорошо. Код класса, выполняющего запросы, становится сильно проще, а объект результата получает иммутабельность - его не изменяют прочие выполняемые запросы.
berna911 пишет:
Тогда смысл, мне было писать wrapper ваще
Вообще не представляю.
Хотя для mysqli есть резон сделать обёртку, чтобы заменить api prepared statements на что-то внятное. Помнится, несколько неудобная по жизни штука.
Ну и синглтон для небольших приложений всё равно удобен. У вас, впрочем, реализован неверно. Синглтон не может иметь публичный конструктор и сам инстанс тоже публичным быть не должен.
berna911 пишет:
средства защиты
Чего от чего?
Драйвер даёт prepared statements. Это всё, что требуется от слоя связи с базой.
Где-то... Ага, вот тут у меня сочиненьице неплохое получилось. Вся остальная валидация - задача прикладного кода, проверить, что данные пришли, данные нас устраивают.
Слой базы должен только гарантировать их корректное сохранение и чтение обратно.
berna911 пишет:
И вот тут если можешь, подробней, я просто с оптимизацией запросов не очень знаком(кроме приколов типа JOIN), так-что может ты меня подстрахуешь.
Нынче я постгресовый дба, но и по mysql фокусы тоже кое-какие помню умею.
В целом - сначала делается нормальная схема базы. Потом денормализуется при необходимости.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.