• По какой причине сайт не работает на хостинге?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Путь истинный:
    1. Зайти в панельку своего хостинга, найти там, где лежат лог ошибок
    2. В нем всё написано.
    3. Во всех непонятных ситуациях повторить пп. 1-2

    Добавлять строчку ini_set('display_errors', 1); не следует. На хостинге вывод ошибок должен быть выключен. И даже в качестве временной меры это добавлять бессмысленно - ошибки всегда будут, надо учиться работать с логами.
    Ответ написан
    Комментировать
  • Как не дать права на SELECT?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Это называется "доступ по API".
    Вместо прямого соединения с БД, "скрипт" отправляет запросы на удаленный веб-сервер, причем не SQL запрос, а какой-нибудь JSON. А уже приложение на веб-сервере соединяется с БД и отправляет запрошенные данные назад.
    Это приложение будет и ключ проверять, и права доступа - какому пользователю какие данные можно отдавать.
    Именно по такой схеме например работают мобильные приложения в вашем телефоне.
    Ответ написан
    Комментировать
  • Как преобразовывать заглавную букву в главную и обратно при поиске как в гугле?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Никак не преобразовывать. Все прекрасно ищется и так.
    Ответ написан
    Комментировать
  • Как реализовать зависимость аргумента одного класса от другого класса?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Соглашусь с предыдущими комментаторами, пример СЛИШКОМ высосан из пальца, чтобы по нему давать какие-то рекомендации.
    Но в целом, бак должен быть отдельным объектом в составе машины, а никаким не "аругментом".
    И у него может быть метод consumeFuel(miles)
    Который может принимать длину дороги в качестве аргумента, и уменьшать количество топлива в соответствии с заложенной формулой.

    Car.Tank.fillMax()
    print Car.Tank.getLevel()
    Car.Тank. consumeFuel(Road.length)
    print Car.Tank.getLevel()

    По поводу последнего варианта - всегда исходите из здравого смысла. Может ли быть дорога частью автомобиля? Нет, это очевидная бессмыслица. Дорога может быть частью поездки. Как и автомобиль. Вот в рамках объекта Trip они вполне могут взаимодействовать друг с другом.

    Вообще, тут важно сразу понять, что ООП гораздо сложнее "базового" процедурного программирования, которое в принципе может осилить любой. Все эти циклы, условные переходы, функции, базовые алгоритмы, последовательное выполнение команд. Или даже асинхронное.

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

    Эта резкая разница в кривой обучения поначалу действительно обескураживает. Но надо просто себе уяснить, что да, тема требует гораздо больше усилий, и обязательного чтения учебников. Но при этом не надо идти на поводу у всяких "упростителей". Да, если задача - решить проблему, то надо ее решать доступными средствами. Но если задача - подняться на следующий профессиональный уровень, то надо грызть.

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    То что вам нужно, называется "профайлинг".
    Его можно делать с помощью разных инструментов, таких как Xdebug, но можно и коряво, вручную расставляя код типа такого
    $microtime = microtime(1);
    // что-то делаем
    $timer['sql'] = microtime(1) - $microtime;
    Потом куда-то выводим этот таймер, чтобы никто не видел.

    Но в принципе тут и без профайлинга можно сказать, что тормозит запрос в БД.
    На шаредах всегда так. Хотя кривые руки при работе с БД тоже скорее всего виноваты.
    Ответ написан
    6 комментариев
  • Сильно ли тяжело для базы данных innoDB 1 500 таблиц?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Для базы это ерунда
    А вот для разработки будет проблема, потому что автор, наплодивший этот зоопарк, явно не прочитал даже начальных сведений про базу данных, и не понимает, зачем в ней нужны таблицы.
    А программистская привычка с подозрением относиться к повторениям ещё не выработалась.

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

    Я настоятельно рекомендую книгу Святослава Куликова "Реляционные базы данных в примерах", она свободно доступна для скачивания. В ней как раз и даются основы проектирования баз данных.
    Ответ написан
    Комментировать
  • Форма обратной связи по SMTP работает, вводя только мою почту? Как исправить?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Вам же человеческим языком пишут, что нельзя подставлять липу в $mail->setFrom($email);
    Или просто уберите эту строчку, или пишите в нее СВОЮ ПОЧТУ.

    Как вариант, можете перед setFrom добавить addReplyTo()
    Ответ написан
    6 комментариев
  • Как вынести запросы rest api на постоянное соединение?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Ответ тут очень простой - никак.
    Мало того, что вешать все запросы на одно соединение просто глупо, когда БД может обрабатывать их тыщи. И та же нода, если делается по-уму, то использует пул соединений, а не одно.
    Но, главное, РНР так не работает.

    И проблема здесь не в количестве соединений, а в том, кто писал код.
    Если в коде используется только одно соединение за все время работы скрипта (а не открывает новое соединение на каждый запрос, как у всех гениальных скриптописателей), и база данных устроена по уму (не тормозит), то хватит даже самого дохлого хостинга с лимитом в 5 одновременных подключений. Просто потому что любой запрос к рест апи должен работать не дольше 0.01 секунды. И любые проблемы будут появляться только при частоте обращений больше 100 в секунду.

    Соответственно, вместо фантазий про "одно соединение" надо переделывать кривой код и базу данных.
    Ответ написан
    Комментировать
  • Как создать базу данных и связать с PHP и MySQL?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    База данных нинужна
    Достаточно будет
    <?php
    file_put_contents('databaza.txt', json_encode($_POST, JSON_UNESCAPED_UNICODE)."\n", FILE_APPEND);

    ну и чтобы вывести
    foreach(file('databaza.txt') as $loh) {
         echo json_decode($loh, true)['email'], "<br>\n";
    }


    Ну а форму на HTML я думаю Frontend developer (senior+) уж как-нибудь осилит.
    Ответ написан
    2 комментария
  • Как отправить ссылку из переменной?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Я, когда столкнулся с этой проблемой, сделал тупо
    ALERT=$(echo $ALERT | env php -r 'echo urlencode(file_get_contents("php://stdin"));')

    %)
    Но я правда и не парюсь с постом, а просто отправляю
    curl -s "https://api.telegram.org/$BOT:$TOKEN/sendMessage?chat_id=$CHAT&text=$ALERT"
    Ответ написан
    Комментировать
  • Как объединить значение двух файлов и внести в переменную?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Говорят, скоро никаких профессий не останется, только составители промтов к искусственному интеллекту.
    Так что надо потихоньку учиться выражать свои желания словами (хотя злые языки утверждают, что этому учат в средней школе на уроках литературы, и по идее совершеннолетний недоросль уже должен этим искусством владеть).
    И если задать мирозданию вопрос не "как объединить два файла", а написать то, что на самом деле нужно,
    bash сделать из двйх файлов один с двумя колонками
    то гугль прекрасно найдет вам ответ, даже без всякого ИИ.
    Ответ написан
    Комментировать
  • Как написать регулярное выражение для обработки разметки из ckeditor?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    1. Никогда не используйте регулярки для парсинга HTML
    2. Никогда не задавайте вопрос про свой вариант решения проблемы. Всегда задавайте вопрос про саму проблему.
    3. Htmlpurifier, HtmlSanitizer
    Ответ написан
    Комментировать
  • Как оптимизировать код php во избежании дублирования, при добавление данных в БД?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Для того, чтобы не повторять программный код, специально были придуманы подпрограммы.
    Когда один и тот же код может выполняться для разных наборов данных.
    В РНР есть несколько способов сделать подпрограмму, но самый удобный - это написать функцию.
    Важно только соблюдать чувство меры и принцип единственной ответственности - функция должна делать что-то одно. К примеру, если она должна что-то писать в базу данных, то не должна при этом с базой соединяться.
    function save_data($pdo, $data, $type) {
        $stmt = $db->prepare('INSERT INTO ads (snippet, amp, date, anchor, link,type) 
                              VALUES (:snippet,:amp,:date,:anchor, :link, :type)');
        $pdo->beginTransaction();
        foreach ($data as $values) {
            $values['type'] = $type;
            $stmt->execute($values);
        }
        $pdo->commit();
    }

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

    И вызывать примерно так

    $db = new PDO('mysql:host=localhost;dbname=test', 'root', '');
    // ТОЛЬКО EXCEPTION! c warning-ами в детский сад ходите детей пугать
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    $file = file_get_contents("ads.json");
    $data = json_decode($file, true);
    save_data($db, $data['p1']['ads'], 'ads');
    
    $file = file_get_contents("May-12_17-57-28.json");
    $data = json_decode($file, true);
    save_data($db, $data['p1']['serp'], 'serp');


    На этом этапе, посмотрев на повторяющийся код, можно сделать еще одну итерацию
    function import_data($filename, $type, $pdo) {
        $file = file_get_contents($filename);
        $data = json_decode($file, true);
        save_data($pdo, $data['p1'][$type], $type);    
    }

    Но можно уже и не частить
    Ответ написан
  • Не срабатывает sql запрос. Как быть?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Не выполняется mysql запрос

    Но в данном случае можно сократить путь "получение сообщения об ошибке - чтение сообщения об ошибке - гугление сообщения об ошибке".
    Надо эти черточки и нолики перенести из bind_param в сам запрос.
    Ответ написан
    Комментировать
  • Почему неверно считается результат арифметического выражения?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    3 комментария
  • Как исправить долгое выполнение запросов на большой таблице?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    возможно вся логика неправильная и можно сделать более грамотно.


    Штирлиц шел по Берлину, и не мог понять, что выдавало в нем русского шпиона - то ли рация за спиной, то ли волочащийся сзади парашют, то ли болтающийся на груди ППШ.

    когда записей в таблице порядка 10 миллионов время выполнения запроса


    ВНЕЗАПНО оказалось, что если использовать микроскоп для забивания гвоздей, то в него становится почему-то плохо видно.

    В простой БД два поля - id и data. У поля data тип JSON. В нем хранятся данные, получаемые из нескольких форм.


    Но вы же, когда эту, с позволения сказать, "базу данных" проектировали, ведь радовались своему остроумию и хитрости? Зачем проектировать структуру базы данных, делать какие-то таблицы, между таблицами связи. потом сложные запросы писать? Если можно хопа, и в джейсон все кучей навалить!

    Ну вот и продолжайте радоваться дальше.

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Все очень просто.
    Надо всего лишь различать зарегистрированных и незарегистрированных пользователей.
    Для первых ничего не пишется на клиента, а только в базу.
    Для вторых ровно наоборот - в базу писать нечего, поэтому все сохраняется локально.
    Плюс нужна процедура мержа с клиента в базу, когда в момент авторизации что-то есть локальное. По уму надо у пользователя спросить, "вот такие-то товары были в корзине, добавить их к вашей?" Но многие магазины не заморочиваются и просто сливают локальную корзину с той что лежит в базе.
    Ответ написан
    9 комментариев
  • Влияет ли различные кодировки таблиц на производительность MySQL?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Нет, не влияет.
    Если хотите чтобы у вас нормально сохранялись тексты, а не рубились на половине, используйте utf8mb4
    про utf8 давно пора забыть
    Ответ написан
    Комментировать
  • Как агрегировать данные по элементам вложенного массива?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    В цикле.
    Все операции над массивами производятся в цикле.

    Чтобы посчитать количество элементов, вам не нужно Node.js/Pandas/MS SQL,PostgreSQL и их диалекты/Mongo а так же SQL, JAVASCRIPT и MONGODB

    Также, перебор массива в цикле с трудом можно отнести к DATA SCIENCE.
    Скорее - к первому классу начальной школы программирования.

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

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    null - это и есть "отсутствие данных".
    Надо не маяться дурью, а просто вставлять данные как есть.
    если вместо null надо вставить что-то еще, то использовать COALESCE
    Ответ написан
    Комментировать