Ответы пользователя по тегу PHP
  • Почему срабатывает условие, хотя, по идее, не должно?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Надо учиться отлаживать свой код самостоятельно.
    Ну то есть вы уже начали, это очень хорошо.
    Но выводить просто 'find data' не очень информативно. Вам надо понять, почему оно выводится.
    Добавьте к var_dump ('find data'); результат strpos($value,'г ') и посмотрите на результат. причина сразу станет ясна.

    И соответственно, код надо будет доработать, чтобы получить желаемый результат.
    Кстати, если у вас 8 версия РНР, то в нем есть готовая функция для такой проверки, вместо strpos
    Ответ написан
    Комментировать
  • Как получить массив в массиве, в одном запросе?

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Если у вас задача потребляет CPU по максимуму, то да - распараллеливать её на большее количество процессов, чем имеется в наличии потоков - бессмысленно.
    Но обычно задача по добавлению записи в БД потребляет не слишком много поцессора. А если речь про "парсинг", где процессор 99% времени ждет пакет из сети, распараллеливать можно хоть на десятки процессов.
    Конкретное количество зависит от потребления процессора конкретной задачей.

    Количество потоков не всегда равно количеству ядер, умноженному на два. Надо смотреть на конкретный процессор. Тем более на VPS, где процессор тоже виртуальный.

    Если говорить про конкретный пример, то в идеале конечно надо написать нормальный код, который запишет в БД несчастные 3 тыщи товаров меньше чем за секунду. А заниматься параллелизмом уже когда счет пойдет на сотни тысяч. Тем более что цифра скорее всего взята с потолка. Я много повидал говнокода на своем веку, но такой, чтобы добавление одного товара занимало 30 секунд я даже вообразить себе не могу.

    Единственная загадка - при чем тут "web", если речь идет про CLI. И, если уж говорить про веб, то с какой радости он "однопоточный".
    Ответ написан
    Комментировать
  • Как исправить ошибку авторизации?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Смотрите.
    Вот вы заходите на страницу adminpanel.php без авторизации. Там происходит что?
    Правильно, перенаправление на avt.php.
    Вы попадаете на страницу avt.php, где первой строчкой идет обращение к переменной $_POST['login'].
    И откуда она там возьмется?

    Чтобы этого не было, из adminpanel.php надо направлять куда?

    Кроме того.
    Просто header('Location: '); писать недостаточно. Если я не захочу, то не буду переходить на указанную страницу, а останусь на этой.
    то есть попаду на админпанель без авторизации.
    Это очень дурацкая и очень известная дыра в безопасности.
    После header('Location: '); всегда должно идти die;
    Ответ написан
  • Нужно ли делать условие перед вызовом метода для избежания выделения дополнительной памяти?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Если говорить про конкретный пример, то он просто бессмысленный, даже с точки зрения житейской логики.
    Учитывая, что if ($isTestOrder) можно прочитать, как ЕСЛИ переменная не занимает памяти то проверка выглядит просто глупостью. "Если переменная не занимает памяти, то не передавать её. Так мы с экономим память!" Если переменная и так не занимает никакой памяти, то какого еще дополнительно выделения памяти она может потребовать?

    Если говорить про передачу параметров вообще, то оба неправы, но тимлид ближе к истине и надо всегда следовать его рекомендации не экономить на пустом месте. А экономить только адресно, когда экономия очевидна и востребована.

    В общем случае тут не будет никакой экономии, ни на спичках, ни без.

    При передаче параметра внутрь метода под него выделяется дополнительная память

    - это чушь и неправда.

    При передаче в функцию параметра, который в принципе может занимать хоть какую-то осмысленную память (то есть не числа, не булева значения, и не null), память под него НЕ выделяется.
    • Объекты изначально передаются по ссылке
    • Строки и массивы - с использованием механизма copy-on-write. Что означает, что память будет выделяться только если переданное значение будет изменено в процессе обработки. А если оно будет только считываться, то дополнительной памяти занимать не будет

    Для всех остальных типов, как было правильно сказано тимлидом - это будет экономия на спичках.
    Ответ написан
    6 комментариев
  • Как вывести число записей добавленных в БД через PHP?

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Самое главное - ничего не писать на Yii 1.1

    Если хотите изучить какой-то фреймворк, то учите ларавель

    Если для сайта пишется своя собственная система управления контентом, то обычно она называется админкой, а не CMS
    Ответ написан
    7 комментариев
  • Как передать параметр объекта класса PHP в js?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    1. РНР теги пишутся не так
    2. Если вы хотите что-то передать, то передаваемое значение надо вывести, а не просто написать.
    3. Данные из РНР в JS всегда передаются через json_encode
    if(<?= json_encode($boris->step) ?> == true)
    Ответ написан
  • Отправка вложений через php mailer. Почему не отправляются изображения?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    При решении любых задач необходимо применять логику. Желательно не женскую, а формальную. Булеву.
    Если вам "очень нужна форма", то она у вас уже есть. Задача решена.

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

    Эту задачу тоже надо решать с помощью логики.
    Разбивая её на отдельные элементы, приступая к следующему только после того, как выполнили предыдущий.
    При отправке файлов из формы у вас несколько этапов
    1. Отправка отправка одного файла из формы в РНР скрипт.
    2. Отправка файла, гарантированно имеющегося на сервере, на почту.
    3. Если отправка одного файла работает, а нужно больше, то добавить нужное количество и вернуться к п.1

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

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

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

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

    А ошибка 500 к заливке отношения не имеет, она может быть от чего угодно.
    Сам текст ошибки надо посмотреть в логе ошибок веб-сервера, прочитать, что там написано, и исправить
    Ответ написан
    4 комментария
  • Есть ли учебник по PHP в котором после каждой главы задаются задания?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Сейчас выходит книга Джона Дакетта, PHP & Mysql.
    Там после многих примеров даются задания. Они, правда, дурацкие, типа "Упражнение. В шаге 5 в переменную $message добавьте название компании."
    Но они позволяют хотя бы не просто смотреть на готовые примеры, а как-то почувствовать их, заставляют зайти в папку с кодом, который прилагается к книге, и поиграться с ним, посмотреть, что будет, если изменить ту или иную команду.
    Но это не такие глобальные задания, типа "написать что-то своё, на основе полученной в главе информации".

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Если говорить с практической точки зрения, то лично я бы не стал ковыряться в этом говнокоде, а выкинул его целиком. И сделал нормально:
    1. перед сохранением в базу текст вообще не трогал
    2. (опционально - валидация, которая не трогает текст, а может только выдать ошибку, что он не соответствует требованиям)
    3. перед выводом:
      • сделать ему htmlspecialchars()
      • и отрендерить в маркдаун, чтобы вместо этих пещерных <b> и <br> поддерживалось натуральное форматирование переводов строк, списков, выделения, и прочего.



    Ответ написан
    3 комментария
  • Что будет, если убрать из URL уникальный id у новости в CMS?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Сто раз уже обсуждалось.
    Заголовок не гарантирует не только уникальность, но и неизменность.
    В реальной жизни заголовки довольно часто редактируются.
    И "если убрать из URL уникальный id", то все ссылки, которые вели на статью, после редактирования превращаются в тыкву.
    Ответ написан
    4 комментария
  • Как загрузить файл по sftp в php?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Мне нетрудно скопировать пример из документации
    <?php
    $connection = ssh2_connect('shell.example.com', 22);
    ssh2_auth_password($connection, 'username', 'password');
    
    ssh2_scp_send($connection, '/local/filename', '/remote/filename', 0644);

    И получить на 100% корректный и на 100% бесполезный ответ.
    Важна ведь не полезность ответа, а чтобы он понравился модераторам этого богоспасаемого ресурса.
    Ответ написан
    Комментировать
  • Почему с формы обратной связи на почту хостинга приходит пустое письмо?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Странно, какой разительный контраст с кодом из удаленного вопроса.
    Я уж хотел вспомнить молодость, поумиляться глубокомысленному коду $post = !empty($_POST) ? true : false;...
    Но с другой стороны, в удаленном коде было непонятно, почему вообще письмо уходит, а здесь уже гораздо ближе к реальности.
    обратить внимание надо, во-первых, на тег
    <form action="#" id="form_body" class="form">
    и посмотреть в примерах, что туда пишут.
    После этого вывести результат var_dump($_POST); и внимательно его изучить.
    После этого снова вернуться к форме и подумать, чего в ней не хватает

    Ну и разумеется выкинуть часть с else if ( $method === 'GET' ) {
    Ответ написан
    9 комментариев
  • Код php в другом блоке не отображает переменную из текущего блока?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    • Открываем исходный код страницы по Ctrl-U и с удивлением видим там свое <? $a=1; ?> прямо в браузере.
    • После этого вспоминаем, что простой открывающий тег РНР (в отличие от сокращенного echo) пишется как <?php
    • Исправляем первый блок
    • Всё работает


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

    чтобы значение переменной было видно внутри функции, её надо передать в виде параметра
    function myfunc($a) {
        echo $a;
    }
    $a = 1;
    myfunc($a);


    Ну или присвоение значения переменной происходит внутри условия, которое не выполняется.

    Если выкладываете не реальный код, который у вас не работает, а какие-то каракули от балды, то всегда сначала протестируйте, сохраняется ли в этих каракулях ваша проблема
    Но лучше всегда выкладывать реальный код.
    Ответ написан
  • Как экранировать sql запрос внутри texarea?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Это очень просто сделать.
    Надо всего лишь освоить подготовленные выражения.
    Например, почитав вот тут https://habr.com/ru/articles/662523/

    И все запросы, в которых участвуют переменные, выполнять только таким образом.
    А texarea там, или tinymce - это уже без разницы.
    Ответ написан
    1 комментарий
  • Телеграм бот, inline_keyboard - не отправляет запроса webhook на сервер?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    На чистом РНР (если закрыть все скобки в этом огрызке кода), все прекрасно отображается и отправляется.
    $resp = [
                'chat_id' => $chat_id,
                'text' => 'Вы находитесь в главном меню',
                'reply_markup' => json_encode([
                    'inline_keyboard' => [
                        [
                            [
                                'text' => 'refresh',
                                'callback_data' => 'LALALALA'
                            ]
                        ],
                        [
                            [
                                'text' => 'LALALALA',
                                'callback_data' => 'LALALALA'
                            ]
                        ]
                    ]])];
    $url = "https://api.telegram.org/bot$bot_token/sendMessage?".http_build_query($resp);
    file_get_contents($url);

    При условии, разумеется, что передается корректный chat_id. Но если будет неправильный chat id, то тогда клавиатура вообще не отобразится, и тогда именно это было бы проблемой, а не вебхук.

    Попробуйте сначала сформулировать, с чего вы взяли, что "не отправляет запроса вебхук на сервер".

    Но в целом, я предполагаю что главная ваша проблема, конечно же - в отсутствии логирования.
    Я не представляю, как вообще люди берутся писать ботов без базового логирования, которое включает
    1. Сырой инпут, который пришел на вебхук.
    2. Сырой запрос, отправленный в телегу
    3. Разумеется, все ошибки РНР.
    4. Разное другое отладочное логирование.
    Ответ написан
    9 комментариев
  • Функция move_uploaded_file выдает ошибку 0, что делать?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    0 - это не ошибка, а какая-то фигня.
    Ошибка - это Warning, который генерирует эта функция, если не может выполнить свою работу.
    Чтобы увидеть эту ошибку на экране, надо включить вывод ошибок РНР на экран, display_errors
    Если ошибки выводить на экран нельзя, то их надо смотреть в логе.

    Чтобы узнать, что делать, надо прочесть сообщение об ошибке
    Ответ написан
  • Почему при удалении куки возникает ошибка Warning: Cannot modify header information?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Чтобы решить эту проблему, надо научиться пользоваться интернетом.
    В частности, освоить такой сложный навык, как взять сообщение об ошибке, вставить в адресную строку своего браузера, и нажать enter
    И после этого с удивлением обнаружить, что объяснений этой ошибки существует несколько миллионов.
    Например https://ru.stackoverflow.com/questions/284578/

    И заодно не помешает научиться задавать вопросы. Чтобы не спрашивать про то, что вы и так знаете.
    Ответ написан
    4 комментария