Профиль пользователя заблокирован сроком с 10 апреля 2022 г. и навсегда по причине: систематические нарушения правил сервиса
  • Загрузка картинок на сайт. Возможен ли универсальный подход?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    если пользователь загружает на сайт изображение, например, формата gif или png - приложение выдаёт ошибку

    Если отвечать на вопрос буквально, то есть, как бы, imagecreatefromgif и imagecreatefrompng.
    Но если это только "например", и хочется прям полной всеобъемлющей универсальности, и делать аватарки из pdf, imagick, причем лично й предпочту вызывать утилиту командной строки чем колупаться с расширением пхп
    Ответ написан
    Комментировать
  • Какие есть библиотеки для комментирования php кода и оценки покрытия кода комментариями?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Это бессмысленный вопрос, и ответа на него не существует.

    Чисто процент строк с комментариями можно посчитать примитивным грепом, но следйет отдавать себе отчет, что эта метрика абсолютно бессмысленная, и ничего, кроме вреда, не принесет.
    Ответ написан
    Комментировать
  • Можно ли вывести оба параметра в одном foreach?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Принятый ответ - это какой-то ужас.
    Буквальный правильный ответ будет таким
    while($enum_fields = $property_enums->GetNext()) {
        $sorts[] = $enum_fields[VALUE];
        $ids[] = $enum_fields[ID];
    }
    natsort($sorts);
    foreach ($sorts as $i => $name) {
        echo $ids[$i], $name;
    }

    А правильный ответ будет, разумеется, в том, чтобы сразу создавать один массив
    while($enum_fields = $property_enums->GetNext()) {
        $sorts[$enum_fields['ID']] = $enum_fields['VALUE'];
    }
    natsort($sorts);
    foreach ($sorts as $id => $name) {
        echo "$id $name";
    }


    Если natsort не подходит, то использовать asort
    Ответ написан
  • Почему этот код работает?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Я правильно понимаю, что из всего этого адского говнокода тебе непонятен только оператор добавления в массив []?

    Учебник разорвать, сжечь и выкинуть на помойку.
    На будущее, этот код пишется вот так
    $data = mysqli_query($link, "SELECT * FROM workers")->fetch_all(MYSQLI_ASSOC);
    var_dump($data);
    Ответ написан
  • Почему не получается сделать запрос в базу данных PDO PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Чтобы было понятно.

    Проблема в том, что админ наследует модели, а не использует её как сервис.
    И в итоге обращение идет не к Model:query(), а к PDO::query().

    Плюс в этом "ООП и MVC" еще примерно 100500 косяков.
    Например, этот сайт ляжет, как только выйдет в продакшен, и ты перестанешь быть его единственным посетителем.

    Класс Model надо переименовать в DB и сделать нормальный код соединения. Наследников у него быть не должно.
    после этого создать единственный экземпляр класса, и передавать его в конструктор всем классам, которым нужна работа с БД.

    Для общего развития: Детские болезни моего первого класса для работы с БД (англ.)
    Ответ написан
  • Как лучше отображать связи в таблицах?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    В огороде бузина, а в Киеве дядька. Я пишу микрофреймворк, не понимаю, чем вложенный запрос отличается от джойна, а тег вопросу поставлю PDO, который ни к тому, ни к другому отношения не имеет.
    Ответ написан
  • Какие области в веб - разработке осваивать в перспективе?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Надеюсь, вопрос закроют как дубль. Потому что ну сколько можно уже. "Я ничего не знаю, ни к чему душа особо не лежит, но хочу быть молодым перспективным владельцем стартапов, газет, пароходов поэтому скажите мне какой язык программирования делает людей богатыми и успешными. но только чтобы особо напрягаться не нужно было!"
    Ответ написан
    4 комментария
  • Как сравнить два значения времени?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Просто сравнивай

    если $alert больше. чем $times, то такое-то условие, а если меньше, то другое.

    if ($alert > $times) {
      // такое-то условие,
    } else {
      // другое. 
    }


    И да, делать это надо в запросе, а не в пхп
    Ответ написан
    Комментировать
  • Как забиндить через execute массив строк в IN SQLite оператор PDO?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    https://phpdelusions.net/pdo#in

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Разумеется, не сохранять такой ужас в items.php, а делать нормальный массив
    return [
      'name1' =>[
        'number'	=> '10',
        'sysname'	=> 'name1',
        'url' 		=> '/',
        'title'		=> 'Title 1',
        'promo'		=> 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.'],
      'name2' =>[
        'number'	=> '20',
        'sysname'	=> 'name2',
        'url' 		=> '/',
        'title' 	=> 'Title 2',
        'promo' 	=> 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.'],
    ];

    И потом просто

    $brand = $_GET['brand'] ?? null;
    $element = $items[$brand] ?? null;
    Ответ написан
    Комментировать
  • Как привязать sql-оператор «default» к параметру запроса в bindParam?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Никак, поскольку это бессмысленно.
    Привязка служит для передачи в базу данных переменных значений. Собственные же функции базы данных пишутся прямо в запросе.

    Чтобы вставилось дефолтное значение, можно просто не указывать значение в запросе
    $pdo->query("insert into rows values ()");
    Ну или сделать так как предложили в комментариях
    $sql = 'insert into rows set row = DEFAULT(row)';
    $sth = $pdo->prepare($sql);
    $sth->execute();
    Ответ написан
    Комментировать
  • Почему код не вносит запись в бд?

    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 комментария
  • Загрузка файла на сайт?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    $files = glob("папка с файлами/*");
    foreach ($files as $one) {
        $name = pathinfo($one,  PATHINFO_FILENAME);
        $name = htmlspecialchars($name);
        $path = urlencode($one);
        echo "<a href='$path'>$name</a><br>"
    }
    Ответ написан
    Комментировать
  • Как в подготовленный MySQL запрос вставить данные из массива?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Имена полей и названия плейсхолдеров ни в коем случае нельзя брать из $data
    Есть класс юзеров,

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Это хороший вопрос.

    Начнем с того, что согласно принципу единственной обязанности в контроллере никакого добавления в БД быть не должно.
    Контроллер, вообще, это самая ничтожная часть веб-приложения. Его задача - получить данные из НТТР запроса и передать их в модель и потом передать ответ браузеру. Тупо "подай-принеси".
    А вот модель уже и должна записывать в базу, проверять валидность данных и совершать все прочие телодвижения.

    чтобы сформировать абстракцию, надо знать задачу не на уровне огрызка туманной фразы, "ряд дополнительных методов и запросов, нужных для формирования фильтров в магазине". Что за запросы? При чем здесь фильтры вообще? Как реализован интерфейс с БД - это ОРМ, прямая работа с БД, что-то ещё?

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

    То есть контроллер дергает валидатор и смотрит ответ.
    Если есть ошибка валидации, то показывает форму обратно
    Если ошибок нет - дергает сервис на добавление товара и потом редиректит куда-нибудь

    А сервис уже выполняет все те действия, которые необходимы при добавлении товара.

    В принципе, валидацию тоже можно в сервис, но тогда надо продумать обратную коммуникацию с контроллером.

    Самое главное что тут надо понимать - что Модель - это не интерфейс по взаимодействию с одного класса с одной таблицей в БД (как это до сих пор считается большинством), а вся совокупность логики - классов и модулей - реализующих бизнес-логику приложения. То есть, в модель входят и мапперы, и сервисы, и репозитории и все что угодно - кроме интерфейсов взаимодействия с внешним миром, таких как контроллеры.
    Ответ написан
    7 комментариев
  • Как правильно настроить кодировку на нескольких языках?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Настроить кодировку на всех языках очень просто. В БД и браузере везде должна стоять UTF-8. Не в воображении, а в реальности:

    - Таблица в бд должна создаваться с charset=utf8
    - Соединение с бд в РНР должно задавать кодировку utf8 (с помощью специально предназначенной для этого функции)
    - Веб-сервер при ответе должен отдавать заголовок Content-type с charset=UTF-8
    Ответ написан
  • Ошибка при запросе в бд?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    $sql="SELECT COUNT(*) FROM `post` WHERE osoz=1 AND id_author=?";         
    $stmt = $connect->prepare($sql);     
    $stmt->bind_param("s",$id_au);
    $stmt->execute();
    $row = $stmt->get_result()->fetch_row();
    echo $row[0];
    Ответ написан
    Комментировать
  • Как переделать синтаксис MySQL чтобы он работал в PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    $mysqli->query("CREATE TEMPORARY TABLE foo AS SELECT * FROM texts WHERE id = 465");
    $mysqli->query("UPDATE foo SET id = 837, html_text = 'text', text_lang = 'russian'");
    $mysqli->query("INSERT INTO texts SELECT * FROM foo");
    $mysqli->query("DROP TABLE foo");
    Ответ написан
    Комментировать
  • Как сделать так, чтобы рядом с каждой записью была цифра от 1 до 10?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Не думал что когда-нибудь буду писать такой ответ

    <ol>
    <?php цикл php { ?>
        <li><span class="post"><?= $zapis ?></span></li>
    <?php } ?>
    </ol>
    Ответ написан
    2 комментария
  • Добавление данных к к существующей записи через спец символ?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    НЕ НУЖНО

    Это чудовищное издевательство над базой данных и программистами, которым потом придется с этим работать.
    Для Андрея надо завести отдельную таблицу, связанную с исходной,и записывать в неё, обычным инсертом
    Ответ написан
    Комментировать