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

    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
    Чебуратор тега РНР
    $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 комментария
  • Includ узнать кто запустил?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    ну например $_SERVER['PHP_SELF']
    но вообще такой вопрос говорит о том что вы что-то делаете неправильно и нужно больше контекста.
    зачем вдруг понадобилось узнавать, в каком файле был вызван include?
    в общем случае без адовых костылей это не узнать, и лучше поэтому не заморочиваться.
    Ответ написан
    3 комментария
  • Как отправить ответ для recapcha?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Может быть, все-таки, не наглеть, и не делать гадости другим людям?
    Делать такие вещи - это как мусорить на общественном пляже.
    Тебе в данный момент так комфортнее, но ты так загаживаешь среду обитания для сотен людей.

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    но потом мне стало совсем ничего не понятно - чего это у меня один и тот же класс будет всем подряд заниматься. Там и без того уже сборная солянка - и регистрация, и проверка текущих кукизов, а тут еще и ..

    Именно в этом состоит разница между двумя основными архитектурами ORM - Active Record и Data Mapper.

    Data Mapper разделяет работу с бд и бизнес-логику самого объекта. В итоге мы имеем два объекта - UserMapper и User. UserMapper занимается общением с базой - ищет в БД и возвращает инстанс объекта User, обновляет данные в БД, удаляет строку из БД. Класс же User реализует только бизнес-логику, ничего не зная о том, как его данные хранятся в БД.

    Active Record же держит все в одном классе, то есть сам юзер ищет себя в базе, удаляет, и так далее.

    Я думаю, сейчас настало время перейти к варианту Data Mapper.
    Ответ написан
    1 комментарий
  • Как проверить параметр функции?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Так и проверять - через параметр.

    function myinclude($position) {
        if ($position == 'header') {
        }
    }
    myinclude('header');
    myinclude('sidebar');
    myinclude('fooer');
    Ответ написан
    Комментировать
  • Ошибка синтаксиса mysql, почему?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    потому что это называется SQL инъекция.

    Запросы надо выполнять через подготовленные выражения.
    $query = "INSERT INTO users SET login = ?, name = ?, email = ?, pass = ?, status = 'user'";
    $stmt = $link->prepare($query);
    $stmt->bind_param("ssss",$login,$name,$email,$pass);
    $stmt->execute();


    То же самое касается и всех остальных запросов, в которых участвуют переменные
    Ответ написан
    Комментировать
  • Как получить имя формы в обработчик php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Никак. Разумеется.

    Фома передает только те поля, которые передаются через инпуты.
    Тег <form> не является инпутом и указывать для него атрибут name бессмысленно.
    Если хочется получить каке-либо дополнительно значение, его надо передавать через скрытое поле ввода.
    Ответ написан
    1 комментарий
  • Как сделать вывод страниц из бд по ЧПУ php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-l
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php [L,QSA]


    Во-первых, никаких "categor". Введенный адрес всегда доступен в пхп, так что загружать этим htaccess бессмысленно.

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

    Соответственно, вынимаем из $_SERVER['REQUEST_URI'] ид новости, и по этому ид запрашиваем.
    Ответ написан
    5 комментариев
  • Как установить кодировку?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    при соединении с БД надо задать кодировку utf8
    Ответ написан
    Комментировать