Задать вопрос
Ответы пользователя по тегу PHP
  • Как обновить блок после удаления и добавления и получить данные для редактирования?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Первое что надо сделать - нормальные запросы с подготовленными выражениями, а не дырявые инъекции...

    Второе - возвращать нормальные данные с понятным (машине) результатом операции, а не текстовый поток сознания. Для этого существует json, который обычно в подобных ситуациях содержит: Код ошибки, текст ошибки, и сообщение для вывода, где первое поле содержит цифру (обычно просто 1 в случае ошибки или 0 в случае успеха), второе поле является необязательным, но сильно облегчает дебаг, и третье - как раз может содержать ваше словесное описание.

    Далее, по результату выполнения операции на бэкенде, исходя из данных полученных обратно аяксом уже решаем что делать, если ошибка - ничего не трогаем, если ошибки нет - добавляем/удаляем строки в таблице. Удаление - банально что-то типа del_button.closest('tr').delete() (емнип). С добавлением сложнее, но в целом ничего особенного, можно засовывать в конец списка, так как не вижу там у вас никакой сортировки при выборке. Строку формируете либо в колбэке, либо можно возвращать готовую в дополнительном поле возвращаемого жсона, и уже оттуда только добавить готовую новую ноду внутрь таблицы.

    Так же, учитывая что новые элементы не будут работать при добавлении, так как на них не навешены слушатели, либо каждый раз перезапускать навешивание листенеров, либо нормально сделать делегирование для кнопки удаления.
    Ответ написан
    Комментировать
  • Еще один вопрос про абстрактные классы на примере Laravel?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Как мы все знаем, абстрактный класс в php - это абстракция, инкапсуляция.... и должен иметь хотя бы один абстракный метод.
    Не должен. В определении написано совсем наоборот, "класс должен быть помечен как абстрактный, если в нем есть абстрактный метод", обратное не обязательно.
    Ответ написан
    1 комментарий
  • Регулярка для замены эмодзи символов в стороке?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    preg_replace('~⚡~ui', 'X', $str);
    preg_replace('~[\x{26A1}]~ui', 'X', $str);
    https://regex101.com/r/u7pEie/1
    Ответ написан
  • Не получается сделать чтобы форма регистрации передавала данные в БД, как правильно это сделать и что заменить?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    1) Код с какого-то древнего ресурса, который надо закрыть за порнографию...
    2) Совать в базу непроверенные строки (логин, например) крайне не желательно, так же, неплохо бы проверить что поле емэйла содержит что-то напоминающее емэйл.
    3) Неплохой практикой считается проверить пришло ли что-нибудь вообще в запросе, например через var_dump($_POST);
    4) Про подготовленные выражения уже пальцы устали писать каждый раз, используйте их!
    5) $password = md5('kakdj834'); хэшировать черте-что после добавления в бд пароля в открытом виде - особый вид искусства...
    6) нужно видеть ошибки, соответственно при подключении вызвать
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    , исполнение оборачивать в трай-кетч, если уж ловите руками...

    Короче, все плохо, сжечь...
    Ответ написан
    Комментировать
  • Не работает feedback форма РНР?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    0) Смотрите логи. Или включите вывод ошибок и варнингов директивой
    ini_set('error_reporting',E_ALL);
    ini_set('display_errors', 1);

    1) За использование mail в 21 веке в нормальном обществе с человеком перестают общаться, возможно бьют. Используйте современные мэйл библиотеки, PHPMailer, SwiftMailer, у них внятная документация, удобный и простой функционал, а главное - хороший дебаг и простая отладка.
    2) $send = mail (...) вам НИЧЕГО не скажет об отправке письма, и вернет тру в случае удачной передачи его в пул отправки (что вообще не гарантирует его дальнейшую отправку)
    3) if ($send == 'true') естественно будет всегда возвращать бред, так как вы сравниваете булево значение со строкой. Правда, конкретно в этом коде, у вас, по стечению обстоятельств, будет даже работать правильно...
    Ответ написан
    Комментировать
  • Как правильно составить GET запрос для сокращения ссылки?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Так как сервер не открывает для вас страницу по указанному урл, а делает редирект на нужную ссылку, соответственно и в курл надо добавить директиву фоллоу редирект, емнип "-L"
    Ответ написан
  • Где допущены ошибки и как можно улучшить код?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Штош...

    1) Элементарные ошибки на уровне запросов с инжекциями.
    2) Класс документ зачем-то получает объект юзера, нигде его не использует, тем не менее даже при использовании нарушает принцип инкапсуляции, объекты не должны по логике знать о других объектах.
    3) Класс юзер так же нарушает принципы инкапсуляции и единой ответственности, в частности зачем-то работает с документом, а не занимается обслуживанием сущности юзера, опять же, класс не должен знать о других сущностях, он должен реализовывать только логику собственной сущности.
    4) методы getTitle() и getContent(), кроме того что не указывают явно на необходимые поля, надеясь на неизменность сущности в бд, еще и накладывают множественную нагрузку, по сути на каждый чих выполняя один и тот же запрос, вместо 1 запроса инициализации данных и далее обращения к уже существующим атрибутам.
    5) Отсутствие неймспейсов и изоляция кода по классам так же отсутствует, соответственно про нормальный автолоад можно забыть.

    Вывод: говнокод в чистом виде.
    Ответ написан
    3 комментария
  • Какой библиотекой редактировать, заполнять шаблон pdf на php?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Для начала, pdf не самый удобный для редактирования формат.

    Если у вас задача получать разные пдф, заполнять их и отдавать заполненные, то скорее всего подойдет mPDF, Zend_Pdf или связка fpdf + fpdi. В любом варианте код простым не будет, а чтение доков займет прилично времени.

    Если же задача заполнить определенный шаблон и отдать его в виде пдф, то проще создать нормальный хтмл шаблон, сверстанный под печать, а затем выводить его в пдф через хеадлесс хром, дающий максимальную повторяемость с хтмл шаблоном. Ну или другой пдф построитель, если нужно.
    Ответ написан
    3 комментария
  • Почему переменная пустая?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Так а в чем вопрос? У вас же переменная переписывается внутри цикла, во втором ифе? Учитесь дебажить:
    $selected_cat = 1111; // если тут прописать переменную, то выводит её значение которое тут
    $deb = [];
    $i = 0;
        foreach ($aTabs as $aTab) { 
            foreach ($aTab['OPTIONS'] as $key => $arOption) {
            $deb[$i]['key'] = $key;
                if ($request['apply']) {
                    $deb[$i]['apply'] = 1;
                    $optionValue = $request->getPost($arOption[0]);
                    $deb[$i]['optionValue']  = $optionValue;
                    if ($arOption[0] == 'select_cat') {
                            $deb[$i]['arOption'] = $arOption[0];
                            $deb[$i]['selected_cat_1'] = $selected_cat;
                            $selected_cat = $optionValue; //тут у вас на какой-то итерации пусто, и переменная дохнет
                            $deb[$i]['selected_cat_2'] = $selected_cat;
                            Option::set($module_id, 'qqqqq', $key );/// выводит 1
                    }
                    Option::set($module_id, 'sssss', $selected_cat );// выводит переменную
                    if ($arOption[0] == 'start_load_product') {
                        echo  $key; // выводит 2
                        Option::set($module_id, 'qqqqq', $key );// выводит 2
                        Option::set($module_id, 'sssss', $selected_cat );// переменная пустая
                    }
    
                }
            }
            $i++;
        }
    echo '<pre>' . print_r($deb,1).'</pre>'; exit;
    Ответ написан
    4 комментария
  • Как правильно сформировать логическое условие в php?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Во первых - вы сравниваете строки, что уже хреново.
    Во вторых - в правилах выставления времени уже должны быть ограничения, например что время закрытия больше времени открытия, так же с обедом, и еще надо проверить что обед попадает между закрытием и открытием.
    Ну и когда вы приведете все условия в нормальный вид можно думать о логике, которая по факту проще пареной репы... ну и $work_time по уму должно быть $work_start_time, то же самое с $dinner_time.
    Если все еще не ясна логика:
    $work_time = [
      'work_start_time'=>'09:30',
      'work_end_time'=>'18:20',
      'dinner_start_time'=>'13:30',
      'dinner_end_time'=>'14:00',
    ];
    $answer = 'Closed';
    $date = str_replace(':','',$work_time);
    $now = date('Hi');
    if( $date['work_start_time'] <= $now && $now <= $date['work_end_time'] ) $answer = 'Now we open';
    if( $date['dinner_start_time'] <= $now && $now <= $date['dinner_end_time'] ) $answer = 'Now we on break';
    echo $answer;
    Ответ написан
    3 комментария
  • Как запускать код для всех страниц статического сайта?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Есть код который надо запустить, перед тем как отдать страницу. Сервер Апач...
    Возможно можно в htaccess правило прописать или например через index.php отдавать страницы, но они уже созданы...
    В хтаксесе прописываете переадресацию всех запросов на индекс.пхп (т.н. единая точка входа, нужен модуль апача mod_rewrite), далее в индексе обрабатываете $_SERVER["REQUEST_URI"], достаете путь до хтмл файла и делаете readfile или include... Profit.
    Ответ написан
    1 комментарий
  • Как распознать что сайт пытаются взломать?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Так это классическая работа для fail2ban. Настраиваете на повторяющиеся 404 и спите спокойно...
    Ответ написан
    Комментировать
  • Не работает php код?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Логи смотри, ну или включи вывод ошибок.
    echo('Это имя пользователя уже занято.');
    header('Location: register.php'); // Возврат на форму регистрации
    Здесь стопудоф будет лажа, так как хеадер так не отправляется. Почему - учим матчасть. Собсно в логах это будет отражено.
    Ответ написан
  • Как лучше хранить данные при пошаговой регистрации?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Всем привет. Хочу сделать пошаговую регистрацию на сайте. Как бы это сделать правильнее?
    Нет рецепта для общего случая. Всегда есть нюансы, если вы делаете что-то чуть в сторону от классики.

    1. После каждого шага сохранять в БД? Много запросов бессмысленных
    Ого, много это сколько? И почему бессмысленных? Вы же осмысленные данные туда пишете?

    У кого, какое мнение? Где какие подводные камни/нюансы?
    Мнение: С таким описанием нихрена не посоветуешь. По конкретным шагам можно что-то обсуждать.
    В целом же: Если первый шаг позволяет ввести все данные необходимые для входа в аккаунт, то писать надо в бд, ну и соответственно выслать письмо с подтверждением. В бд можно писать так же стадию прохождения. Если остальные пункты не являются критическими для функционала, можно предлагать при следующем логине дозаполнить данные, основываясь на записанном номере стадии. Ну или просот сразу перекидывать на нужную фазу, если она является необходимой.
    Ответ написан
    Комментировать
  • Почему не добавляется в базу данных информация с формы?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    $q = "INSERT INTO post(author, date_p, text_p) VALUES ('$author', '$datep', '$text_content')"; 
    //  ";" в одиночных запросах не ставится, а текстовые значения обрамляются кавычками
    var_dump($q); //смотрим глазками, проверяем в консоли
    $q = "INSERT INTO post(author, date_p, text_p) VALUES (?, ?, ?)"; 
    //никогда не лезем в бд без подготовленных выражений!
    $st = $pdo->prepare($q);
    $sth->execute([$author, $datep, $text_content]);
    Ответ написан
    1 комментарий
  • Не работает return PHP. Ничего не выводит на экран, что делать?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Мне нужно что-бы функция вернула корни уравнения в виде массива.
    Она возвращает

    Однако я получаю пустоту.
    Однако не получаете

    Почему?
    Скорее всего вы подразумевали не "получение" а "вывод". Но никакого вывода на экран вы не используете.

    Не работает return PHP. Ничего не выводит на экран, что делать?
    Формально ответ - по тому что "получение"/"возвращение" и "вывод" абсолютно разные вещи.
    Ответ написан
    Комментировать
  • Какие вещи нужно изучить чтобы подготовить себя к работе с Highload проектами?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Хайлоад это не какой-то особенный тип проекта, это все обычные проекты, но с объемом "туда-сюдирования" данных выше, чем тянул "прошлый сервер", когда проект был еще не хайлоад. В 90% случаев это выражается в росте количества запросов к бд, которая либо становится слаба по железу, либо вылазят косяки в запросах, написаных абы как, включая отсутствие индексов и кривую архитектуру.

    Что делается для "хайлоадинга"?
    1) Меняются сервера на помощнее, но это больше к админам обычно.
    2) Выявляются узкие места, в подавляющем большинстве случаев это либо обращения к бд, либо работа со сторонними сервисами, а-ля АПИ фейсбука и все такое.

    Как разгонять именно такие затыки 2 варианта - есть 3 пути:
    1) Оптимизация. Все что возможно ускорить - ускоряется, находятся самые тормознутые запросы, прогоняются через explain, переписываются, тюнятся, индексируются до состояния максимальной производительности.
    2) Кэширование. Обычно используют кей-валуе инмемори хранилища а-ля мемкеш и редис, и результаты запросов часто используемых, но не часто обновляемых данных пишутся в кэш. Время жизни настраивается в зависимости от необходимой актуализации. По идее на высоких нагрузках даже кэш с времением жизни 5-10 секунд может в разы снизить нагрузку на сервера.
    3) Иногда стандартных средств и инструментов не достаточно, и нужно искать какие-то новые инструменты, например переходить на сфинкс, так как фултекстсерч не вывозит. Или большие объемы данных идут на запись, и стандартной пропускной способности бд уже не хватает и нужно что-то типа систем хранения логов, или наоборот, аналитические бд по типу кликхауса...

    Короче - все то же самое что и в стандарте, только оттюнено и обмазано кэшами и инструментами чуть сложнее мускуля...
    Ответ написан
    Комментировать
  • Некорректное поведение кэша сайта?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Я тут ради интереса глянул первый файл в гите. Увидел что у вас логин пароль и хэш лежит в куках. Понял что в принципе смысла дальше что-либо смотреть нет.

    На случай если вы что-то конкретное будете спрашивать, а не приводить юзекейсы и простыни кода на гитхабе в купе с роликами на ютубе:
    Определите проблему с точностью до куска кода, помещающегося в 10-20 строк.
    Опишите что должно быть и что получается
    По необходимости дайте дампы переменных или уточните запрашиваемые детали.

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

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Мне нужно аргументировать ответ, но я не знаю как ответить правильно.
    Очень просто: Так как проверка отнимает процессорное время, то экономия все равно будет липовой, вместо памяти потратится ресурс процессора. Сколь ни будь значительной экономии это не даст ни в том, ни в другом случае, точнее экономия будет в случае отсутствия проверки и существования переменной, что будет происходить скорее всего чаще чем несуществование переменной, ну или по крайней мере в каком-то числе случаев, в то время как проверка будет осуществляться всегда.
    Ответ написан
    Комментировать