Если хочешь в эту профессию, то развивай логику. Без логики можешь диплом на следующий день смывать в унитаз, извини за грубость. Ты никогда без логики собеседование не пройдёшь. Я, к примеру, перестал заниматься серьёзным программированием, потому что понял, что серьёзную логику я не тяну. Но в веб-программировании зачастую логика уровня "вытащить из базы сообщения пользователя" - это же игрушки. Конечно, перед сотрудниками компаний типа Google или Яндекс стоят задачи сложнее, и я в такие компании и не сунусь - я знаю свой потолок, но то что мы в этой теме обсуждаем - это же просто элементарные вещи. Читай больше книг, раз проблемы, про базы данных, про алгоритмы. Кнута вряд ли потянешь, но "Алгоритмы + структуры данных=программы" Вирта - это must read для каждого. Вообще, всё, что по алгоритмизации найдёшь, старайся читать. Кнута я не потянул в своё время, может и зря себя не пересилил, скорее всего, был бы сейчас лучшим программистом, чем есть. Даже когда чужой код берёшь, надо сначала разобраться глубоко, что и как. Вот я сегодня изучал код JS из битрикс24, поскольку передо мной похожую задачу поставили. Так я теперь точно знаю, что и зачем они в нём написали, и почему именно так, а не по-другому. Извини за резкость, но просто ты жуткую чушь в коде приводишь... А задачи даже у нас не всегда стандартные, иногда приходится и своё решение придумывать, и надо быть способным, если ты уж занимаешься программированием.
@mkramer да че нормальная критика, скажу честно мне книги не помогают, когда я читаю я вообще не понимаю о чем речь идет. Я хорошо понимаю когда объясняют да и еще правильно вообще супер. Спасибо за наставление! Кстати я прочитал мануал что означает многие ко многим, и тут я понял, обычно это 3 таблицы и обе имеют первичный ключ который будет применяться ну или соединятся с таблицей общей для двух таблиц. Вот и получается у нас таблица dialog_user это под таблица которая содержит в себе первичные ключи 2-х таблиц (users и dialogs) и она является общей для них. Ну и перейдем теперь к запросам))) и к логике))) По сути это элементарно, но для человека который только начал не много понимать запросы буквально в этом месяце, ошибки допустимы, так как опыта в запросах тяжелых еще маловато.
Я читаю постоянно, когда работаю. На русском, на английском, свой код, чужой код. Так что учись понимать написанное Не, это всё понятно. Но когда ты пишешь в запросе, что у тебя id диалога должно быть равно id строчки в таблице, то просто невозможно понять, какая мысль двигала тобой при написании такого запроса --- Добавлено --- Или вот это предположение. Ну какая мысль двигала тобой, когда ты решил сравнивать id пользователя с id диалога? За каждой строкой кода, за каждым запросом стоит какая-то мысль. Вот я сегодня разбирал код от битрикса, на javascript-е, не сказать, чтоб сильно сложный, но я такого ещё не программировал, не попадалось в заказаз. Мне нужно написать мини-апи такое, чтоб чел вставлял на свой сайт кусок js, и у него там появлялась форма, которую он создал на нашем сайте. Вот я стал смотреть, как такая же штука реализована в битрикс24. И задача была именно понять, почему они написали каждую строчку, какая причина у них была для каждого действия, с какой мыслью программист писал этот код. Вот это и есть логическое мышление. --- Добавлено --- Вирта почитай всё-таки, если ещё не читал, там он очень просто всё объясняет, в отличие от Кнута. И книжечка маленькая совсем.
@igordata @mkramer Всем доброе утро, не много потренировался в той штуке, делал запросы которые только в голову шли но мыслей мало, вот ссылка: http://sqlfiddle.com/#!9/e39ae/48 и хочу у вас попросить дайте мне задания какое то чтобы я мог по сложнее запросы сделать + проверьте те запросы которые я написал, спасибо.
@mkramer Можно задам не серьезный вопрос? когда я пишу пользователю и диалог еще не был создан, какая должна быть запись при создании диалога? Вот мое решение правильно ли оно, когда создаешь диалог то надо сделать так типа и юзеру1 и юзеру2 присвоить id диалога созданной записи в таблице dialogs, в запросах у меня выглядит так: PHP: //Здесь я проверяю существует ли диалог между 2 пользователями //Проверка на наличии созданного диалога между 2 пользователями //Правильно ли я делаю проверку диалога??? $check_dialogs = $pdo->prepare(' SELECT ds.* FROM `dialogs` ds JOIN `dialog_user` du ON (ds.`id` = du.`dialog_id`) WHERE du.`user_id` = "'.$user_id.'" AND du.`user_id` = "'.$to.'"'); $check_dialogs->execute(); $result_check = $check_dialogs->fetch(); $dialog_id = $result_check['dialog_id'];//Создаем переменную для определения id диалога $date = date('Y.m.d H:i:s');//создаем переменную для работы с датой if($dialog_id){//если диалог между 2-мя пользователями существует то просто обновляем его echo 'Просто обновляем диалог'; //здесь запросы на обновления диалога }else{//иначе создаем новый диалог echo 'вставка нового диалога между пользователями'; //создаю новую запись в dialogs $dialogs = $pdo->prepare('INSERT INTO `dialogs` SET `pm_read` = :pm_read, `idate` = :idate, `msg_num` = 0, all_msg_num = 0'); $dialogs->execute(['pm_read' => 'no', 'idate' => $date]); $dialog_new_result = $dialogs->fetch(); //вставка диалога юзеру который пишет и присваиваем id диалог из таблицы dialogs $dialog_user_insert = $pdo->prepare('INSERT INTO `dialog_user` SET `dialog_id` = :dialog_id, `user_id` = :user_id'); $dialog_user_insert->execute(['dialog_id' => $dialog_id_users, 'user_id' => $user_id]); $dialog_user_new_result = $dialog_user_insert->fetch(); //вставка диалога юзеру которому пишем и присваиваем id диалог из таблицы dialogs $dialog_user_insert = $pdo->prepare('INSERT INTO `dialog_user` SET `dialog_id` = :dialog_id, `user_id` = :user_id'); $dialog_user_insert->execute(['dialog_id' => $dialog_id_users, 'user_id' => $to]); $dialog_user_new_result = $dialog_user_insert->fetch(); } Правильная у меня логика сейчас? По новым созданным таблицам создаю скрипт отправки сообщения и создания диалога между пользователями.
Это не логика, это её отсутствие... Как может быть в одной записи user_id быть равно двум числам? --- Добавлено --- Хотя этот запрос действительно не самый простой. Тут приём такой: join сам на себя Код (Text): select dialog.* from dialog join dialog_user du1 du1.dialog_id=dialog.id join dialog_user du2 (du1.dialog_id=du2.dialog_id) where du1.user_id=1 and du2.user_id=3 Что-то в этом роде
@mkramer Как как это же id писавшего а второй это id принимавшего. Объясни мне какая должна быть запись в диалоге? Когда пишешь одно сообщение от юзера1 кому юзеру2. Должно быть 2 запроса?
Я тебе показал запрос. У нас связь многие-ко-многим, про которую я тебе давал ссылку. У одной строки таблицы не может быть два разных значения одного поля - что в этом не понятного? Ты таблицу видел вообще, представляешь себе?
@mkramer Ты показал мне при создании таблицы ты вставляешь запись так в табл. dialogs_user Insert (1,1), (1,2) Что ты этим добился ты считай такой вставкой вставил 2 записи в таблицу, ведь так ли?
Ой, у меня там опечатки в запросе. Поправил бы, чего только после целого дня возни с javascript-ом не напишешь. Я on везде пропустил. Не специально. Но ты должен такие вещи замечать, а ты копипастишь, не разбираясь.
@mkramer Почему ты думаешь что я не заметил что не хватает ON в JOIN конечно заметил честное слово, и сразу исправил. К статье ты задание мне дашь на запросы по моей таблице!
Ну заметил, значит хорошо. Вообще, запрос должен работать, но тут не всегда попадаешь с первого раза. Фидл что-то не пашет, а так бы я проверил. Выглядит он для меня логично.
@mkramer Я проверил ошибок запрос не выдает, но почему-то всегда получается вставка новой строки при проверки на существование диалога.
Да и ещё кроме пропущенного ON ты пропустил дописать здесь from dialog (dialog) так как ты в начале запроса указал выбрать все поля SELECT dialig.* это я намикаю на то что я теперь стараюсь не компипастить. Ну это же не суть. Теперь к вопросу: я не пойму в моем условии такое... Если диалог существует то обновляем его иначе создаём его. if($dialogs){ Обновляем диалог }else{ Создаём диалог } Я к чему веду, обновлять диалог какой таблицы dialogs или же dialog_user? И как он правильно выглядел бы если в dialogs по сути одно поле id записи и что при update подставлять в SET а что в WHERE ну и так же в принципе в dialog_user что обновлять я не пойму, да условие я написал и теперь борюсь с ним)
У меня одного фидл не открывается? --- Добавлено --- диалоги - в dialogs, связи - dialog_users. Когда в таблице один автоинкремент, делаешь "insert into dialogs id=null", и mysql сам поймёт, что вместо null надо следующее значение автоинкремента поставить --- Добавлено --- Поскольку фидл у меня не открывается, проверил запрос в Heidi SQL. Если не считать синтаксические ошибки, я написал тебе всё правильно:
@mkramer К стати ты перед проверкой делаешь запрос на вывод всех полей из табл dialog_user это обязательно делать перед проверкой?
@mkramer К стати ты перед проверкой выводиш все поля из табл dialogs это обязательно делать перед проверкой @mkramer Спасибо но я уже исправил скрипт проверка срабатывает, и все гуд вроде. В итоге я с нуля почти сам написал скрипт отправки сообщения) В принципе это у меня в первые такое что сам пишу скрипт, чтобы я без вас делал, а то все время компипастил и методом исключения все делал, по немногу осваиваю php и mysql. Спасибо вам ребята. Сегодня допишу скрипт и скину сюда типа на проверку а вы по критикуйте его если время у вас будет свободное, может что увидите что я делаю не так)
Это я просто показал тебе, что у меня в таблице лежит О, получилось превартить копипастера в программиста. Крутяк
@mkramer Все скрипт дописал, протестировал может где чего не увидел, может ты увидишь поправь меня, спасибо. Надеюсь будет время посмотришь на скрипт у меня там где то на 64-67 строке вопрос, есть.
@igordata зачем, я не пойму, этот скрипт только отправка сообщения я еще буду допиливать его, полностью вывести диалоги вывести сообщения вывести последнее сообщения удаления сообщения удаления диалога и так дальше. Не знаю с чего начать сейчас подкинь совет.