• Как мыслить объектами?

    Парадокс: ООП родилось, чтобы приблизить мир кода к реальному миру. И вот человек из реального мира спрашивает, как мыслить ООП.
    Ответ написан
    6 комментариев
  • Почему код не вносит запись в бд?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Если немного отойти в сторону от насущных потребностей горе-кодеров исправить опечатку и бежать скорее такжекодить дальше, то вопрос довольно интересный.

    В частности, возникает закономерный вопрос - почему $result содержит true, а не false, как должно быть в случае ошибки? Ведь у запроса явно неверный синтаксис? И что означают загадочные слова автора (который не в ладах не только с РНР, но и с русским языком), "Два поля в ней редактируются и я пытаюсь их сохранить, не то, что хочу"?

    Ответ, для тех кто хочет научиться программировать на уровне чуть сложнее, чем складывание программ из десятка с трудом заученных операторов, довольно интересный.

    Начнем с запроса. Ошибка в нем действительно есть, но не синтаксическая. Дело в том, что оператор AND может использоваться не только в операторе WHERE. Это совершенно самостоятельный логический оператор: SELECT 1 AND 1; это совершенно легитимный запрос, который вернет единицу - результат операции 1 AND 1;.

    Точно так же результат этой операции можно присвоить и полю при запросе UPDATE:
    UPDATE Users SET logist=1 AND 1 WHERE id=100;
    А теперь посмотрим внимательно на исходный запрос. Для удобства я поставил скобки, чтобы показать, в каком порядке выполнятся операторы в запросе:
    UPDATE Users SET logist=('$log' AND (sum='$sum')) WHERE id='$form_id'

    Что здесь важно понимать?
    • - что в выражении sum='$sum' знак "равно" меняет свое значение и из оператора присваивания превращается в оператор сравнения.
    • - что существует такое явление, как приоритет выполнения операторов. И у оператора AND приоритет выше, чем у = как оператора присваивания, но ниже, чем у = как оператора сравнения!
    • - что существует такое явление, как приведение типов, и mysql по мере сил пытается привести операнды выражения AND ктакому типу, с которым оно может работать (числовому)

    таким образом мы
    1. сначала приводим выражение '$log' к числовому/булеву типу (и получаем скорее всего 0)
    2. потом получаем результат выражения sum='$sum' (1 или 0 в зависимости от того, равно ли содержимое поля sum значению переменной $sum или нет),
    3. затем выполняем операцию 0 AND 0
    4. и в итоге мы присваиваем этот 0 полю log

    Каковой ноль и объясняет загадочные слова автора "я пытаюсь сохранить не то, что хочу."

    Напоследок хочется рассказать о важности информирования программиста об ошибках.

    На самом деле ошибка в этом запросе все-таки есть. И звучит она как Truncated incorrect DOUBLE value: 'log'
    Просто в зависимости от настроек mysql она является либо фатальной, либо просто нотисом. В случае автора это был нотис, который в пхп без специальных средств заметить невозможно.
    Но если бы база данных была настроена в strict mode (и у автора вопроса было настроено правильное отображение ошибок mysqli),то ошибка бы стала фатальной, а поведение кода - более предсказуемым: значение поля не обновилось бы на непонятный нуль, а запрос бы выдал ошибку.
    Ответ написан
    3 комментария
  • Как получить html код страницы?

    romanko_vn
    @romanko_vn
    Если просто отобразить код, то так можно
    $str = file_get_contents('https://www.rbc.ru');
    $html = htmlspecialchars($str);
    echo $html;
    Ответ написан
    2 комментария
  • Какая связь между следующими терминами: Машинное обучение, Deep learning, Искусственный интеллект?

    Therapyx
    @Therapyx
    Data Science
    А ты точно читал определение этих терминов? Или просто решил время сэкономить задав рандомный вопрос? )

    Машинное обучение это область AI. Deep Learning это область машинного обучения. Big Data - большие данные(???), которые нужны для всех терминов, которые тебя интерисуют. Наука о данных = все вышеперечисленное + еще больше.
    Я не вижу смысла писать тут огромные тексты того, что и так в избытке есть в интернете. Если ты хочешь что-то конкретное, то спрашивай конкретно. Сейчас же я просто вижу лень открыть туже википедию.
    Ответ написан
    2 комментария
  • Можно ли делать редиректы из моделей?

    webinar
    @webinar Куратор тега PHP
    Учим yii: https://youtu.be/-WRMlGHLgRg
    лучше из модели получить статус выполнения, а уже в контроллере перенаправлять

    да
    Ответ написан
    Комментировать
  • Можно ли делать редиректы из моделей?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Нельзя.

    Модель ничего не знает о вызывающем интерфейсе.
    Есть очень простая эмпирическая проверка, относится ли какой-либо код к модели или к контроллеру: реализовать тот же самый функционал через утилиту командной строки.

    В данном случае тут же станет ясно, что редирект в командной строке - а следовательно и в модели - является бессмыслицей. А любые манипуляции с НТТР протоколом должны совершаться в том единственном компоненте, который отвечает за работу c HTTP - контроллере.
    Ответ написан
    Комментировать
  • Как лучше делать модели, на статических методах или на объектах?

    flapflapjack
    @flapflapjack
    на треть я прав
    А как вы в статическом методе обратитесь к базе данных например? Прямо при вызове метода что ли передавать собрались? Не легче создать объект юзера, а потом получить в обычном методе this->id?
    Ответ написан
    7 комментариев
  • Как лучше делать модели, на статических методах или на объектах?

    SilenceOfWinter
    @SilenceOfWinter Куратор тега PHP
    та еще зажигалка...
    Статика допустима в классах=хэлперах вроде коллекции методов для работы с массивами или файлами или фабриках\билдерах.
    Ответ написан
    Комментировать
  • Речь пойдет о MVC?

    flapflapjack
    @flapflapjack
    на треть я прав
    class NewsModel {//модель
    public function getNews()
    {
    $news=;//подключаемся к бд, получаем новости, и т.д.
    //при этом модель понятия не имеет, что там творится с контроллером и view - модель просто отдаёт из БД новости
    return $news;
    }
    }
    
    class View {
    public function render($data)
    {
    include "view.phtml";//здесь в файле- данные расставляются в теги, крутятся в foreach и т.д. На входе - только данные из контроллера. Сам view ничего делать не умеет, кроме как отображать данные
    }
    }
    class NewsController { //контроллер
    public function action_getNews()
    {
    $news=new NewsModel();
    $view=new View();
    $view->render($news->getNews());
    /*контроллер понятия не имеет, как модель получила новости. Контроллер всего лишь получил запрос экшена - action_getNews, взял из модели данные, и отдал в view. Контроллер - контролировал эти действия, но не изменял ни БД, ничего другого*/ 
    }
    }


    1)В дальнейшем вы можете менять модель, способ подключения к БД, модернизировать функционал.
    2) Менять view как хотите - данные на вход поступают из контроллера, и контроллер трогать не нужно.
    3) При изменении контроллера вы меняете логику приложения, увеличивая его функционал.

    мне очень не понравился : он был вот таким : в контроллер был подключена модель- что бы использовать ее методы


    Это позволяет применять DRY - Don't Repeat Yourself. Вы в процедурном программировании так же функции делаете, а потом их используете. Чем тогда хуже подключить отдельный класс (модель), и использовать его в любом контроллере?

    Вы модель News можете использовать как в контроллере чтения, для показа новостей, так и в контроллере админа, чтобы редактировать новости. Вы же не будете для админа опять писать функции для получения новостей, если класс для работы с новостями уже есть, и выдает то что надо.
    Ответ написан
    5 комментариев
  • Как лучше делать модели, на статических методах или на объектах?

    usdglander
    @usdglander Куратор тега PHP
    Yipee-ki-yay
    Вы вроде как используете классы, но всё равно пытаетесь писать в процедурном стиле. Не стоит использовать ООП, если вы его не понимаете, просто потому что это стильномодномолодёжно.
    Ответ написан
    Комментировать