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

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

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

    Вариант 1, при котором никакой код менять не надо. Отключаем эти проверки устанавливая переменную mysql innodb_flush_log_at_trx_commit=0. Для этого надо обладать правами рута.
    Вариант 2: заключить все вставки в транзакцию
    Вариант 3: добавлять все записи одним запросом. Это можно сделать либо кодом Slava Rozhnev, либо запросом LOAD DATA INFILE

    Да, и между вашими вариантами 2 и три нет никакой разницы. Это один и тот же вариант, про который в любом случае надо забыть: он вообще никогда не должен применяться. Переменные должны попадать в запрос только через плейсхолдеры.
    Ответ написан
    2 комментария
  • Как в при записи набора строк в файл преобразовать символы, чтобы символ \n не делал перевод строки?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    file_put_contents('file.txt',json_encode($strings,JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE));


    Если нужен CSV, то так и надо было сразу говорить
    В этом случае файл должен выглядеть так
    "Иван Иванович"
    "Пётр
     Петрович"
    "Дмитрий Дмитревич"

    И все прекрасно будет читаться.
    И разумеется, в РНР есть функция записи CSV
    Ответ написан
    Комментировать
  • Хэш sha1 разный в зависимости от того в каких кавычках строка?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    В приципе, в комментариях уже всё разжевали, но на всякий случай
    Выполняем простой код
    var_dump("{\"order_id\":\"FACTPRECHR152632\",\"amount\":\"8300.00\"}");
    var_dump('{\"order_id\":\"FACTPRECHR152632\",\"amount\":\"8300.00\"}');

    и смотрим на результат

    после этого выполняем ещё один простой код
    $json = json_encode(["order_id"=>"FACTPRECHR152632", "amount"=> "8300.00"]);
    var_dump($json);
    var_dump(addcslashes($json, '"'));

    смотрим на результат
    сравниваем его с предыдущим

    И после этого идем с вопросами к тому, кто придумал написать здесь addcslashes
    Ответ написан
    Комментировать
  • Сколько обращений к базе данных происходит в данном коде?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    "Обращений" - либо 4, либо 1, в зависимости от настроек и содержимого connectdbpdo()
    "заставлять базу что-то делать" - в любом случае один.
    Ответ написан
    Комментировать
  • Возможна ли sql инъекция?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Нет.
    Ответ написан
    1 комментарий
  • Как наследовать два класса в php?

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

    В первую очередь надо задать себе вопрос, а зачем вам отдельный класс на каждый вид запроса? Если там достаточно одного метода?

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Зачем вы задаёте не тот вопрос, с которым у вас проблема?:)

    Ваша проблема в том, что вы хотите проэксплуатировать баг в ПДО, из-за которого он не сообщает об ошибке.
    Не надо этого делать.
    Передавайте ровно столько параметров, сколько "масок" в запросе. Проблема решена.
    Ответ написан
    Комментировать
  • Почему не работает password verify?

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

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

    В данном конкретном случае проблема может быть в "переносе" данных между серверами, насколько можно судить из этого невнятного вопроса
    Ответ написан
    Комментировать
  • Как получить ключ 1-го уровня по значению из массива 2-го уровня?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Серфить примеры не надо.
    Надо запомнить одно очень простое правило: все операции над массивами производятся в цикле.
    Это очень просто запомнить. И даже понять.
    Массив - это набор данных.
    Чтобы что-то в найти в этом наборе - его надо перебрать.
    Вот и перебирайте. Как только нашли нужное значение - вот ваш ученик.
    Вам знаком оператор foreach?
    Ответ написан
    Комментировать
  • Как реализовать поиск по нескольким полям?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Если вычистить из кода неверные кавычки и бессмысленные телодвижения, и переделать на "использование стандартных подготовленных запросов" (с) @Rsa97
    $data = [
        "%{$_POST['surname']}%",
        "%{$_POST['name']}%", 
        "%{$_POST['fathername']}%",
        "%{$_POST['phone']}%",
    ];
    $query = "SELECT * FROM `people` 
              WHERE `surname` LIKE ? OR `name` LIKE ? OR `fathername` LIKE ? OR `phone` LIKE ?";
    $result = $conn->execute_query($query, $data);


    Если используется устаревшая версия РНР, то либо добавить в неё execute_query руками, либо написать по-старинке,
    $stmt = $conn->prepare($query);
    $stmt->bind_param("ssss", ...$data);
    $stmt->execute();
    $result = $stmt->get_result();


    Одно из преимуществ такого подхода в том, что мы как раз не путаемся в кавычках. Одинарные в запросе становятся не нужны
    Ответ написан
  • Composer как сгенерировать composer.json с заранее выбранными пакетами?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    "Cгенерировать composer.json с уже установленными в нем зависимостями" невозможно.
    Потому что файл composer.json не устанавливает никакие зависимости. Это делает сам композер, соответствующей командой.

    Если вам нужен composer.json с прописанными в нем пакетами, то composer.json собственно и предназначен для того, чтобы прописывать в нем зависимости. Так работают 100% приложений, использующих композер - в их дистрибутивах лежит файл composer.json, в котором прописаны зависимости. Если, как вы говорите. во всех проектах используются одни и те же зависимости, вы можете взять файл от любого проекта и добавить его в репозиторий.
    Ответ написан
    1 комментарий
  • Есть разница: передам я в метод класса большой массив или предварительно сделаю из него выборку и передам только его небольшой фрагмент?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Массивы в РНР передаются методом copy-on-write.
    Это означает, что потребление памяти вырастет только в том случае, если массив внутри функции будет изменён.
    Соответственно, если переданный массив будет изменяться, то лучше вырезать.
    Если будет только читаться, то проще передать целиком.
    Ответ написан
    2 комментария
  • Можно ли указывать не уникальные ключи в HTTP Query String?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Учитывая, что тот же РНР прекрасно обрабатывает запросы вида ?foo[]=bar&foo[]=bar2, то уникальность явно не является обязательной.
    А то что он видит как один (только не первый, а последний), то это как раз совершенно очевидно и банально.
    Если вы в коде напишете
    $array['foo'] = 'bar';
    $array['foo'] = 'bar2';
    То разумеется в $array останется только второй вариант, который тупо перезатрет первый. И Оппач тут совершенно не при чем.

    Но вам никто не мешает написать свой парсер QUERY_STRING и брать из него неуникальные значения.
    Ответ написан
    2 комментария
  • Что делать, если код показывает 500 ошибку (в частности: Okay-CMS)?

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

    Вот же у вас написано:
    if ($config->get('debug_mode') == true) {
            print $message;

    Значит надо найти конфиг и поменять значение этого параметра.

    Если не поможет, то хотя бы тупо временно добавить echo $e; под } catch (\Exception $e) {
    Оно не будет рассусоливать про конфиги, композеры, протоколы и прочие умные идеи, а просто напишет какая конкретно произошла ошибка, чтобы её можно было исправить.
    Ответ написан
    1 комментарий
  • Как распознать что сайт пытаются взломать?

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Код тут действительно неправильный, причем по очень многим параметрам. Много бессмысленных телодвижений, инъекции, плюс условие можно записать оптимальнее. Так что помимо исправления конкретной опечатки от Rsa97, надо править этот код целиком
    $sql = "SELECT * FROM blocks WHERE user_id = ?";
    // выполняем запрос без инъекций. если версия РНР не новая, надо будет дописать эту функцию самому
    $result = $conn->execute_query($sql, [$id]);
    // получаем запрошенную строку, без всяких num_rows и foreach
    $row = $result->fetch_assoc();
    // получаем $block_level, даже если в $row пусто
    $block_level = $row["type"] ?? 0;
    // match - новое выражение в РНР начиная с 8.0 версии. в сто раз аккуратнее чем забор из elseif
    $block_text_type = match ($block_level) {
        1 => "Незначительная блокировка",
        2 => "Частичная блокировка",
        3 => "Полная блокировка",
        default => "Нет блокировок",
    };
    Ответ написан
    2 комментария
  • Как заменить пробелы на дефис и обратно?

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Открыть в редакторе главную страницу, поставить курсор после слова footer, дописать -home и сохранить страницу?
    Ответ написан
    8 комментариев
  • Как хранить логи приложения на php?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Собираем логи Symfony в Elasticsearch с помощью Filebeat и Monolog
    Ответ написан
    Комментировать
  • Как объединись значения из двух массивов в один?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Если данные нужны для нескольких заказов, то вариант @Rsa97
    Если только одного заказа, то проще двумя запросами, результат второго просто подцепить в виде отдельного элемента к массиву, полученному из первого
    Ответ написан
    Комментировать