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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    В цикле. Все операции над массивами производятся в цикле.
    Создаёте новый пустой массив.
    Потом берете берете исходный массив, перебираете его в цикле, и добавляете в новый данные в соответствии со своими запросами.
    Ответ написан
    Комментировать
  • Как правильно деплоить mysql базу/миграции?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Если это не хайдлоад, то есть 95% всех случаев, то никакой проблемы и нет, альтеры отработают быстро.
    В остальных случаях примерно такая схема и применяется, только непонятно, зачем всю базу-то гонять.
    https://github.com/github/gh-ost
    https://docs.percona.com/percona-toolkit/pt-online...
    Ответ написан
  • Нужно ли в таких случаях делать защиту от инъекций?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Нужно, разумеется.
    Это как в одном пошлом анекдоте про поручика Ржевского,
    - Запрос есть? Значит нужно.

    Если кажется, что защита слишком сложная, то либо вариант предложенный Сергей delphinpro в комментариях,
    $stmt = mysqli_prepare($connect, "INSERT INTO `bd` (`id`, `name`, `tel`) VALUES (NULL, ?, ?)");
    mysqli_stmt_execute($stmt, [$_POST['name'],  $_POST['tel']]);

    Либо, поскольку это ещё не везде работает, пишется маленькая функция на 5 строк, и кладётся в файл, где прописано соединение с БД
    function prepared_query($mysqli, $sql, $params, $types = "")
    {
        $types = $types ?: str_repeat("s", count($params));
        $stmt = $mysqli->prepare($sql);
        $stmt->bind_param($types, ...$params);
        $stmt->execute();
        return $stmt;
    }

    И дальше просто
    $sql = "INSERT INTO `bd` (`name`, `tel`) VALUES (?,?)";
    prepared_query($connect, $sql, [$_POST['name'], $_POST['tel']]);

    Просто, быстро, аккуратно, безопасно
    Ответ написан
    Комментировать
  • Как заменить часть строки данными из массива (php)?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    8 комментариев
  • Почему RedBeanPHP возвращает Array?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    В РНР Array - это список значений
    Вы получили ровно то что хотели
    Ответ написан
    3 комментария
  • Как сделать что бы возвращало все значения RB php?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Надо прочитать в документации, что делает функция getCell, а потом подумать.
    Кроме просмотра обучающих видео на юбтубе, программирование также требует и собственной мыслительной активности программиста.

    Если думать совсем не получается, то надо пройти по ссылке из ответа на свой предыдущий вопрос, и прочитать там.
    Ответ написан
    5 комментариев
  • Для чего в проектах принудительно используют use?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Часть проблем высосана из пальца, как очень смешной п.2 - разница в одну точку с запятой, а уже "гораздо длиннее", карл. При том что если класс использовать в коде хотя бы дважды, то вот тут как раз действительно получится "гораздо длинее"

    use \Framework\Main\UI\Extension;
    Extension::load([ 'vendor.module.components.cabinet.personal' ]);
    Extension::unload([ 'vendor.module.components.cabinet.personal' ]);
    vs
    \Framework\Main\UI\Extension\Extension::load([ 'vendor.module.components.cabinet.personal' ]);
    \Framework\Main\UI\Extension\Extension::unload([ 'vendor.module.components.cabinet.personal' ]);

    и будешь постоянно спотыкаться в коде об эти палочки.

    А часть решается не просто, а очень просто: вместо того, чтобы писать код в Блокноте Виндоус, надо в кои-то веки освоить работу с нормальной IDE. Которая
    - автоматом скрывает блок use
    - по ctrl+наведение курсора показывает полный путь, а по ctrl-click сразу переходит в определение метода
    - подсвечивает неиспользуемые неймспейсы, и не проблема их удалить
    Ответ написан
  • Нужно ли выполнять асинхронные запросы чтоб ускорить выполнение кода на PHP?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Когда я вижу такие вопросы, мне хочется плакать.
    "У меня микроскоп показывает только грязь на пальцах. У меня получится посмотреть вакуоли, если я приделаю к микроскопу ветряной двигатель?"

    Если код работает медленно, то надо не выдумывать какие-то фантазии про асинхронные запросы, а ускорить выполнение кода. Который должен выполняться максимум за 0.008 секунды
    Ответ написан
    2 комментария
  • Что не так с json и есть ли отличия между 300 и (int)$a, если $a = "300"?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Если сделать var_dump с переменными и var_dump с числами, то вернутся одинаковые данные:

    Разумеется, это не так.
    Весь этот вопрос - сплошная путаница и какие-то дикие суеверия.
    Сначала заявление что строки и числа var_dump выводит одинаково, потом вдруг что пробел имеет какое-то значение.

    Вам надо обязательно научиться проверять свои догадки. Причем проверять надёжно, а не как сейчас - тяп-ляп.
    Ответ написан
    Комментировать
  • Как быстро проверить, что строка - md5?

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

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

    Надо забыть про mysqli_query и освоить функции prepare(), bind_param(), и execute(). Причём не только для insert, но и для select тоже. Потому что через него можно будет повытаскивать все пароли. Поскольку они ещё и не захэшированы.
    Ответ написан
    Комментировать
  • Как вывести второе поле если первое пустое?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    или покороче,
    'name' => $result['short_name'] ?: $result['name'],
    Ответ написан
    1 комментарий
  • Как решить проблему с созданием куки и возможные ошибки с авторизацией?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    "В F12" надо смотреть не Cookie, а вкладку Network. Все куки, которые ставит сервер, пишутся в ответе сервера на запрос.
    Именно там надо смотреть, что за куки приходят.
    И там же, в запросах браузера, смотреть - какие куки он отправляет.

    В целом код какой-то странный, в части проверок под длинным комментарием.
    получается, что при первом логине, когда $result['hash'] пустой, он должен стирать все куки.
    при этом код удаления ставит куку id, а код проверки использует куку ID

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

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

    И после этого либо изменить вопрос, либо структуру базы данных.
    Ответ написан
    Комментировать
  • В чем разница object и array в json_decode()?

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Это всё просто ужасно. Начиная прямо с первой строчки, class Register extends Database
    Делать отдельный класс для регистрации глупо. Если уж делать класс, то для манипуляции юзером в целом, а не одной только регистрации. Плюс, регистрация пользователя - это не база данных. И не должна наследовать классу Database.
    По сути, вы хотите натянуть ООП на обычное процедурное программирование. Не надо этого делать, получится самолёт из соломы. Сделайте простую функцию.

    Но это ещё цветочки. Остальных проблем тут выше крыши:
    1. Никогда не используйте сокращённый синтаксис INSERT. Всегда надо явно перечислять поля. Это, скорее всего, и является причиной ошибки. Но даже если нет, то проблемы всё равно вылезут в будущем
    2. Собственно сообщение об ошибке нам и надо получить от базы данных, чтобы понять в чем проблема. для этого к коду соединения с БД надо добавить строчку
      mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
      и после этого смотреть сообщение об ошибке
    3. Самое главное - SQL инъекция. Какой смысл делать регистрацию вообще, если любой дурак узнает пароли всех остальных пользователей или сможет авторизоваться вообще без пароля? Запросы надо выполнять только через подготовленные выражения
    4. И по поводу паролей. Пароли надо хранить в фаршированном виде, обработанными функцией password_hash()
    Ответ написан
    Комментировать
  • Как в PHP быстрее и с меньшей нагрузкой на сервер вывести случайное значение сроки с 500000 шт?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Способ с инклюде - это ад кромешный. Память процесса РНР- она как бы не бесплатная. И даже если в моменте ничего не упадёт, то может потом не хватить на какую-то другую операцию. Но главное - это просто варварство, каждый раз тягать в память пол-ляма строк ради того чтобы вывести одну.
    Способ с файлами в принципе эффективен, но многие ос начинают тупить при большом количестве файлов в каталоге, придется разбивать по 500 подкаталогам. В целом гемор.
    spoiler
    И непонятно, зачем так сложно писать
    echo file_get_contents("/str/" . mt_rand (1,500000) . ".txt");

    Самый простой способ - это действительно сделать таблицу в БД, где будет два поля, число по возрастанию (первичный индекс) и собственно значение строки.
    и выбирать по первому полю через то же mt_rand (1,500000)

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    5 июня вы уже задавали этот вопрос.
    Если за три месяца вы так и не освоили базовые приёмы работы с БД в РНР, то может ну его совсем?
    Тем более что при таких-то дырищах всё равно это будет не баланс, а решето.
    Ответ написан
    Комментировать
  • Как исправить ошибку Implicit conversion from float (int) to int loses precision?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Этот код какой-то эстет писал.
    Для получения количества полных дней вместо битовых выкрутасов надо просто использовать floor()
    Хотя в данном случае надо использовать ceil, ну или round. Потому что эти 5 сотых дня происходят явно от прехода на летнее время. И с конверсией в int теряется 1 день.
    Ответ написан
    Комментировать