Ответы пользователя по тегу PHP
  • Использование __toString плохой тон?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Стоит ли вместо toString использовать публичный метод, допустим display();
    Конечно, стоит - явное лучше неявного.
    Ответ написан
    Комментировать
  • Вы уверены, что хотите изменить сверку и конвертировать данные?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Конечно, дело в том, что у таблицы или всей базы кодировка utf8.
    Не пытайтесь сэкономить, нет ни одной разумной причины не использовать utf в современных программах.
    Ответ написан
    Комментировать
  • Почему все изменения сохраняются в index.php и как сохранить переменную после нажатия кнопки?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    echo sprintf('<option value="%s">%s</option>', $file, $file);

    Сейчас ваш селект не может передать на сервер выбранный файл, потому что в нём нет ни одного атрибута value.
    Ответ написан
    Комментировать
  • Что такое протокол передачи данных?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Протокол - это действительно набор соглашений. Он нужен для того, чтобы две программы могли передавать друг другу данные или команды. Описан протокол может быть только в документации.

    Например, азбука Морзе - это тоже протокол и когда мужик на улице к вам подходит и два пальца к губам подставляет, потому что вы в наушниках и всё-равно про сигарету не услышите - это тоже протокол. Поэтому, "жить" он может только в сознании тех, кто им пользуется.

    Или URL на сайте - это тоже, в общем-то, протокол. Сервер говорит: "Пнёшь по http адрес Что такое протокол передачи данных?, я тебе отдам содержимое страницы" и действительно, когда вы переходите по этому адресу, вот он - ваш вопрос. Вы с сервером так договорились. Галстук на двери в общаге - это тоже протокол (и не советую вам его нарушать).
    А ещё в Википедии есть вот такое определение:
    Дипломатический протокол — совокупность общепринятых правил, традиций и условностей, соблюдаемых правительствами, ведомствами иностранных дел, дипломатическими представительствами, официальными лицами в международном общении.

    И оно тоже очень хорошо подходит к вашему вопросу, на самом деле. Когда послу США в России, например, требуется какая-то информация, он не может просто смску отправить Сергею Лаврову, он должен послать официальный запрос. Чем не протокол передачи данных?

    Ещё протокол можно сравнить с алфавитом или словарём. Протокол "живёт" там же, где и алфавит.
    Ответ написан
    2 комментария
  • Почему не записывает текст в БД?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Что не так делаю?

    У вас скобка в VALUES() не закрыта и $phrases_eng без кавычек.
    А ещё, вы используете устаревшее расширение mysql, а не его современный аналог: PDO или mysqli.
    А ещё, вы вставляете прямо в запрос данные, полученные от клиента. Welcome, SQL Injection!
    А ещё, раз уж вы велосипедите слой работы с БД, имеет смысл перенести собственно подключение к базе в файл database_connect.php и подключать его так: $link = require_once 'database_connect.php';.
    Ответ написан
    7 комментариев
  • Нужно ли абстрагироваться от фреймворка?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    С точки зрения теории - это имеет смысл и некоторые шаблоны проектирования решают именно эту задачу.
    Но на практике эти затраты, скорее всего, не отобьются: дешевле переписать всё заново раз в три года (там и инсайты какие-то появятся и технический долг можно будет уменьшить), чем огораживаться от фреймворка таким образом.
    Ответ написан
  • Где грань между созданием экземпляра объекта (new Class()) и использованием оператора разрешения области видимости (::)?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Статические методы стоит использовать в качестве именованных конструкторов. Для всего остального лучше создавать экземпляры объектов, потому что статические методы к ООП, по большому счёту, никакого отношения не имеют и поэтому размывают парадигму для тех, кто в ней не очень хорошо ориентируется.
    Если в статическом методе нет работы с состоянием и таких методов много, скорее всего, автор кода не очень проникся идеями ООП и код написан в процедурном стиле. А если там есть модификация какого-то состояния, то это работа с глобальными переменными (почему глобальные переменные - это плохо, надеюсь, пояснять не нужно).

    Обязательно ли создавать экземпляр? Или можно обойтись статическими методами

    У вас в коде есть вот это: echo Form::getError();. Откуда статический метод будет получать информацию об ошибке формы? Как он будет отличать ошибки одной формы от другой?

    Единственное что знаю, экземпляр надо создавать тогда, когда он оперирует уникальными данными
    Экземпляр нужен тогда, когда у него есть какое-то собственное состояние (ошибки валидации, например). У двух объектов состояние может совпадать (то есть быть неуникальным), но это не значит, что в следующий момент один из них не изменится.
    Ответ написан
    5 комментариев
  • Как создать и выйти из бесконечного цикла в PHP?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Начните с азов: php.net/manual/ru/language.control-structures.php
    Там и на ваши вопросы есть ответы.
    Ответ написан
    Комментировать
  • Почему ругается php?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Это артефакты конфликта в .git. Кто-то не разрешил конфликт и запушил всё в мастер.
    Это, однозначно, должен исправлять программист.
    Ответ написан
    Комментировать
  • И все-таки PHP 7 быстрее Python 3?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Бенчмарки - это бесполезные писькомерки.

    Инструменты надо сравнивать не по тому, как они себя ведут в вакууме, а по удобству использования в реальной жизни и тому, насколько они способны решить поставленную задачу.

    Что в вашей жизни изменится после того, как в ответах к вопросу один человек напишет, что php быстрее, другой, что быстрее python и ещё десять разведут срач не по теме?

    Но вот есть ли смысл в удобстве, если это удобство не дает нужных результатов?
    Нам надо вас уговорить вернуться на php? Вы благословения испрашиваете? Вы уже столкнулись с реальными проблемами производительности?
    Ответ написан
    6 комментариев
  • Как кешировать Json?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Всё очень-очень плохо.
    • Что происходит в самом начале?
    • Зачем вы насилуете sprintf? Почитайте документацию этой функции.
    • У вас полная чушь в проверке валидности кеша:
      если (файл_с_кешем_существует И кеш_не_протух)
          получить_данные_с_сайта
          записать_данные_в_кеш


    Обратите внимание, что чтения из кеша у вас нигде нет (в начале только какой-то мусор с ним связанный).

    Опишите свою задачу простыми словами по шагам, а потом реализуйте последовательно каждый шаг. Сейчас вы не понимаете, что происходит в коде, поэтому он у вас может заработать только случайно.
    Ответ написан
    Комментировать
  • Как вывести нужное значения из спецефичного JSON массива через PHP?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Вы правы, так действительно лучше не делать.
    Но удобного способа сделать это на php нет.
    Вы можете:
    • Подключить библиотеку для работы с коллекциями (например пакет Collection из Laravel). На средних и крупных проектах я предпочитаю именно такой путь, чтобы не изобретать велосипед.
    • Использовать array_filter в комбинации с reset.
    • Обходить элементы массива циклом и прерывать его, когда найден нужный элемент.
    Ответ написан
    Комментировать
  • Как бы вы организовали выдачу уникального кода?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Вариантов много. Самое простое - использовать UUID, с ними можно предполагать, что дублирования не будет. Можно генерировать код каким-то другим способом и проверять, нет ли его уже в БД (повторять, пока не сгенерируется уникальный код, но тут всё-равно могут быть коллизии).
    Ответ написан
    3 комментария
  • Почему php не загружает расширения под Win?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    The default location PHP searches for extensions is c: \ php5 . To change this setting to reflect your setup of PHP edit your file php.ini.
    You need to change the parameter extension_dir to point to the directory where your extensions or where you placed your files php _ *. Dll . For example: extension_dir = c:\php\extensions

    php.net/manual/fr/install.windows.extensions.php
    Ответ написан
    Комментировать
  • Почему MySQL сам редактирует данные?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Вариантов несколько:
    1. MySQL сам редактирует данные. Ваша БД была выбрана для проведения секретного правительственного эксперимента в области искусственного интеллекта и возможности его применения в качестве оружия массового поражения (не щадит ни одного пользователя, а ведь среди них, наверняка, есть женщины и дети!).
    2. Вашу БД кто-то взломал и балуется.
    3. В вашем коде есть ошибка, из-за которой при изменении значения этого поля для одного или нескольких пользователей используется некорректное условие фильтрации и обновляются все пользователи.

    На всякий случай уточню, что возможные причины перечислены в порядке возрастания вероятности того, что дело обстоит именно так.
    Ответ написан
    5 комментариев
  • Почему не работает авторизация?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Unknown column 'status' in 'where clause'
    Какое из слов в этом предложении вы не можете перевести с английского самостоятельно?
    Ответ написан
    Комментировать
  • Что не так с этим phpQuery?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    libxml_use_internal_errors(true);
    php.net/manual/en/domdocument.loadhtml.php#95463
    Ответ написан
    Комментировать
  • Call tracking (Колл-трекинг, отслеживание звонков). Где ошибка?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Прочитайте документацию setcookie(), посмотрите какие параметры принимает эта функция, посмотрите, что вы ей передаёте. Сразу станет понятно, почему она работает не так, как вы ожидаете (обратите внимание на разницу между "не работает" и "работает не так, как я хочу").

    $phone  = "{$_COOKIE['phone']}"; // Зачем сдесь нужны фигурные скобки?
    Фигурные скобки помогают php правильно обработать переменные внутри строки. В данном случае они не нужны, можно просто написать "$_COOKIE['phone']", но если хорошо подумать, станет понятно, что мы занимаемся какой-то хренью - переводим переменную в строку, чтобы интерполировать и получить её значение. Убираем кавычки вообще: $phone = $_COOKIE['phone'];

    А можно как-то проще написать форматирование?
    Можно использовать другие конструкции: sprintf, preg_replace, но проще код от этого не станет. Ещё можно подключить какую-нибудь библиотеку, в которой эта задача уже решена, но с вашим уровнем программирования пока не стоит. Встроенного Волшебного Форматирователя Номеров Телефонов в php, к сожалению, нет. Вот дождёмся, когда его в джаву встроят и тогда портируем.

    Какие ошибки я допустил?
    Code и format - это должны быть строки, а вы используете константы (без кавычек). Такие константы не определены, поэтому php просто возвращает их название в виде строки и код работает как должен. Но если включить вывод предупреждений, вы увидите, что интерпретатору не очень нравится то, чем вы его кормите.
    Но это не самая большая проблема. Зачем вообще в этой функции аргумент, да ещё с таким ужасным названием? Явно же должно быть две функции: одна получает номер, другая его форматирует. Композиция, все дела.
    Ответ написан
    Комментировать
  • Почему не работает код (Не бойтесь, 20 строк) на php?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    else if ($D=0)
    Используйте сравнение (===), а не присваивание (=).

    $x == $b/(2*$a);
    Используйте присваивание (=), а не сравнение (==).

    abcx($a=2, $b=-4, $c=3);
    При такой записи вы создаётё вне функции переменные $a, $b и $c, а потом передаёте в неё их значения. Переменные при это продолжают болтаться снаружи и никак не связаны с одноименными локальными переменными функции. Это не ошибка, код будет работать, но действие бессмысленное и потенциально вредное. Вызывайте функцию как обычно: abcx(2, -4, 3);

    Судя по количеству ошибок на такой маленькой площади, вам нужно вернуться к учебникам - вы не понимаете, что и зачем происходит в коде, а без этого понимания программировать бесполезно.

    P.S. Что же вы лесенку-то не достроили? :)
    $D = sqrt($D);
    $x == ($b + $D)/2*a;
    $x2 === ($b - $D)/2*a;
    Ответ написан
    3 комментария