Задать вопрос
  • При вызове функции wp_redirect() выходит ошибка ERR_TOO_MANY_REDIRECT?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    is_user_logged_in это какая-то странная константа. Подозреваю, что хотели вызвать функцию is_user_logged_in(), но забыли скобки

    PS elseif и return-то тут зачем? С такими условиями в ветку elseif мы всегда попадаем, если пользователь не залогинен (то есть было бы достаточно просто else), а до return вообще никогда делао не доходит (потому что exit в одной из веток сработает раньше)
    Ответ написан
    Комментировать
  • Почему не все emoji сохраняются?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    SET NAMES 'utf8mb4' выполнить после подключеия к базе, например
    Ответ написан
  • Почему нет ответа от клиента websocket к серверу websocket, workerman?

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

    Во-вторых,
    foreach($ws_worker->connection as $connection) {
         $connection->send("connect client");
    }

    При старте воркера клиента ты хвататешь объект с connection'ами сервера и перебираешь их? Как, зачем, и чего ты хочешь этим добиться?

    В-третьих:
    $ws_connection = new AsyncTcpConnection('ws://ws.eodhistoricaldata.com/ws/crypto?api_token=demo');

    О, кажется пошли куда-то коннектитться.
    Предположим, что ws.eodhistoricaldata.com - это твой сервер. И даже, что с помощью reverse proxy ты завернул этот url на порт 100 своего сайта, но вот что за "/ws/crypto" и "api_token=demo"? По коду выше видно, что твой сервер ни с чем таким не умеет работать. Ты точно туда коннектишься, куда хочешь?
    Ответ написан
  • Как лучше связать таблицы для поиска по индексированным столбцам?

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    Читал, что при использовании JOIN индексирование бесполезно

    Чушь, ни читай такое больше

    По связям - показывай структуру таблиц, описывай примерно какие данные надо доставать, посмотрим.
    Пока вопрос слишком абстрактный и на него можно дать только не менее абстрактные (и оттого абсолютно бесполезные) ответы
    Ответ написан
    Комментировать
  • Как перевести на русский язык вывод времени и даты вывод из MySQL?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    Если формат или наор форматов известны, то проще всего будет написать helper
    function russianDate(int $timestamp) {
    	list($year, $month, $day) = explode("-", date("Y-n-j", $timestamp));
    	$monthsHandbook = [
    		1 => "января", 
    		2 => "февраля",
    		3 => "марта",
    		4 => "апреля",
    		5 => "мая",
    		6 => "июня",
    		7 => "июля",
    		8 => "августа",
    		9 => "сентября",
    		10 => "октября",
    		11 => "ноября",
    		12 => "декабря"
    	];
    	$monthName = $monthsHandbook[$month];
    	
    	return "{$day} {$monthName} {$year} года";
    }


    Если за простотой не гонишься, то устанавливай и используй Intl
    Ответ написан
  • Почта для домена от маил, как убрать проверку ящика на существование при отправки письма? или как чекать почту до отправки письма?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    > Надо как-то проверять маил ящики до отправки письма на почту и до добавления данных в бд, как это можно сделать?

    Не надо. Надо ожидать ошибки на любом этапе и корректно это обрабатывать. Например, так:

    /* Попытаемся сделать всё что нам надо*/
    try {
        $email = $request->getRequired("email"); // вытащим email из запроса
        $validator->checkEmail($email); // сделаем базовую проверку на то что email корректный. Пример реализации ты как раз описал в вопросе
        $password = $userComponent->generatePassword(); // сгенерируем пароль
        $user = $userComponent->createUser($email, $password); // создадим пользователя, используя известные нам логин и пароль
        $mailer->sendRegistrationEmail($user); // отошлём пользователю email c паролем
        $response->setHeader(200); // укажем в ответе, что всё прошло успешно
    
    /* Но в каждой строчке из блока try может пойти что-то не так. Надо предусмотреть это и обработать такие случаи */
    } catch (MalformedRequestException) { // могут не передать email в запросе
        $response->setHeader(400); // укажем в ответе, что именно пошло не так, выбрав правильный код ошибки
    } catch (ValidationException) { // email может быть корявым. Ну, например "test1111"
        $response->setHeader(422);  // укажем в ответе, что именно пошло не так, выбрав правильный код ошибки
    } catch (ComponentException $e) { // при попытке создать пользователя что-то может пойти не так
        $logger->write("warning", "An error occurred during creation of the user.") // вообще, интересно бы узнать, что именно пошло не так, поэтому данную информацию надо залоггировать
        $logger->writeExceptionInfo("debug", $e); // ... и максимально подробно. Чтобы при переключении системы в 
        $response->setHeader(500);  // укажем в ответе, что именно пошло не так, выбрав правильный код ошибки
    } catch (MailerException $e) {  // при попытке отправить email что-то может пойти не так. ВОТ ОНО РАДИ ЧЕГО ВСЁ ЗАТЕВАЛОСЬ
        $logger->write("warning", "Unable to send registration email to {$user->email}"); // первым делом залоггирем ошибку
        $logger->writeExceptionInfo("debug", $e); // подробности ошибки тоже залоггируем
    
        // раз отправить пароль не удалось, то регистрация не прошла успешно. И свежесозданного пользователя можно смело удалять. Можно использоватль для этого механизм транзакций, но этот пример у нас простой и такие сложности ни к чему 
        try { // да, в момент удаления тоже что-то может пойти не так, поэтому опять используем try...catch
             $userComponent->deleteUser($user->id); 
        } catch(\Throwable $e) { // если не удалось удалить пользователя, то просто запишем информацию в лог
             $userId = $user->id ?? "Not Specified";
             $logger->write("warning", "Unable to delete user {$userId}" during rollback caused by MailerException);
             $logger->writeExceptionInfo("debug", $e);
        }
    
        $response->setHeader(502);  // укажем в ответе, что именно пошло не так, выбрав правильный код ошибки
    }
    
    $response->send(); // отошлём ответ пользователю
    Ответ написан
  • Yii2: как получить страницу пагинации?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    Это приватная переменная. Используй метод getPage() чтобы получить номер текущей страницы. Документация: https://www.yiiframework.com/doc/api/2.0/yii-data-...
    Ответ написан
    2 комментария
  • Почему не записываются буквы при регистрации?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    Кавычки вокруг $surname потерял при составлении SQL-запроса.
    https://habr.com/ru/post/662523/ - начни с этого, чтоб такого не было
    Ответ написан
    Комментировать
  • Почему-то не работает отправка формы, почему?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    Sendmail на сервере настроен? Если нет или не знаешь, что это такое, то явно пропиши параметры SMTP в своём php-файле

    $mail->isSMTP(); //Send using SMTP
    $mail->Host = 'smtp.example.com';  //Set the SMTP server to send through
    $mail->SMTPAuth = true;  //Enable SMTP authentication
    $mail->Username  = 'user@example.com'; //SMTP username
    $mail->Password  = 'secret';  //SMTP password
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;  //Enable implicit TLS encryption
    $mail->Port = 465; //TCP port to connect to; use 587 if you have set `SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS`


    Кстати, именно так и по умолчанию и было сделано в документации к библиотеке, который ты пользуешься, в разделе Simple Example
    Ответ написан
  • Как просмотреть нужные файлы в папке?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    Использовать функции для работы с файловой системой. glob, например.
    И ты не стесняйся - рассказывай что уже пытался сделать, что получилось, где застрял. Код показывай, там, ага

    Дополнительная информация из комментариев:
    Для неопределенного количества вложений используют рекурсию - пишешь функцию, которая возвращает список файлов в каталоге и его подкаталогах в нужном тебе формате, которая вызывает сама себя для каждого найденного каталога или стилистической ссылки и добавляет результат к списку файлов.
    Пример рекурсии: https://qna.habr.com/q/1189114#answer_2211560

    Также, есть способ через итератор: https://www.php.net/manual/en/class.filesystemiter...
    Ответ написан
    4 комментария
  • Почему не отрабатывает скрипт php (ошибка 500)?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    Кто-то цвет сообщений немытыми руками попытался менять.
    Строки 124-152 замени на это и будет тебе щщастье.

    echo "<span style=\"color:#093;\">Заявка принята. Спасибо!</span><br /><br />";
          echo "Вы можете отправить ещё одну заявку в <a href=\"http://www.dfl.org.ru/competitions/order/\">разделе \"Online-заявка\"</a>.";
          exit();
        }
    }
    
    //print_r($request);
    
    if (empty($send)) {
        $send = "";
    }
    
    if (empty($request)) {
        $user = "";
    }
    if (($send == "yes") && ($request['tour'] == "0"))
        echo "<span style=\"color:#f00;\">Вы не указали турнир, в котором желаете участвовать!</span><br />";
    if (($send == "yes") && empty($request['team']))
        echo "<span style=\"color:#f00;\">Вы не написали название команды!</span><br />";
    if (($send == "yes") && ($request['year'] == "0"))
        echo "<span style=\"color:#f00;\">Вы не указали год рождения игроков команды!</span><br />";
    if (($send == "yes") && empty($request['city']))
        echo "<span style=\"color:#f00;\">Вы не указали город!</span><br />";
    if (($send == "yes") && empty($request['phone']))
        echo "<span style=\"color:#f00;\">Вы не указали контактный телефон для связи с вами и подтверждения участия!</span><br />";
    if (($send == "yes") && empty($request['name']))
        echo "<span style=\"color:#f00;\">Вы не указали фамилию и имя контактного лица!</span><br />";
    if (($send == "yes") && empty($request['email']))
        echo "<span style=\"color:#f00;\">Вы не ввели контактный e-mail, чтобы мы с Вами связались!</span><br />";
    Ответ написан
    Комментировать
  • Почему не доступна куки из поддомена?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    Надо разрешить CORS для поддомена.
    Примерно так (инструкция для Apache):
    SetEnvIf Origin ^(https?://.+\.mywebsite\.example(?::\d{1,5})?)$   CORS_ALLOW_ORIGIN=$1
    Header append Access-Control-Allow-Origin  %{CORS_ALLOW_ORIGIN}e   env=CORS_ALLOW_ORIGIN
    Header merge  Vary "Origin"

    Подробности на SO
    Ответ написан
    Комментировать
  • PHP как вывести на страницу текстовое поле, кнопку и список стран?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    Подобный виджет обычно называется Livesearch.
    Делается с помощью JS. PHP-сервер может выступать как источник данных. Пример: https://www.w3schools.com/php/php_ajax_livesearch.asp
    Готовые решения: https://www.sitepoint.com/14-jquery-live-search-pl...
    Ещё пример: https://codepen.io/yuis-ice/pen/pqbEwa

    Если выделение найденных букв не сильно критично, то можно вообще голым HTML обойтись:
    <div>Choose a browser from this list:</div>
    <input list="countries" />
    <datalist id="countries">
        <option value="United States">
        <option value="Canada">
        <option value="Russian Federation">
        <option value="Finland">
    </datalist>
    Ответ написан
    Комментировать
  • Как с помощью php заменить текст в нутри тега,?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    <?= $balance ?? "Войти" ?>
    Ответ написан
    Комментировать
  • Как использовать vue с php?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    <?php
    echo "data1";


    Хотите классы - используйте router
    Ответ написан
    Комментировать
  • Как с помощью функции array_slice удалить значение из массива?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    $numbers = [
        123,
        124,
        125,
        111,
        222,
        566,
        777,
    ];
    $shift = 0;
    
    foreach ($numbers as $i=>$number) {
        $digits = str_split((string)$number);
        $first = $digits[0];
        $same = true;
        
        foreach ($digits as $digit) {
            if ($digit !== $first) {
                $same = false;
                break;
            }
        }
            
        if ($same) {
            $shift++;
        } else {
            $numbers = array_merge(
                array_slice($numbers, 0, $shift),
                array_slice($numbers, $shift+1)
            ); 
        }
    }


    Бонусом - решение в одну строчку без всяких array_slice и foreach:
    <?php
    $numbers = [
        123,
        124,
        125,
        111,
        222,
        566,
        777,
    ];
    
    $numbers = array_filter($numbers, function($n){ $n = (string)$n; return $n[0] == $n[1] && $n[1] == $n[2];});
    Ответ написан
  • Как наполнить объект?

    Immortal_pony
    @Immortal_pony Куратор тега JavaScript
    max_kruze ты показывай код своих попыток преобразования, не стесняйся.
    На текущий момент я вижу следующие проблемы:
    1. Во входных данных отсутствует куча закрывающих кавычек, из-за чего код в принципе не работает.
    2. Входные данные не консистентны - иногда название команды оказывается седьмым элементом в массиве, а иногда - шестым. Возможно есть и другие неконсистентные места.

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

    В качестве аттракциона невиданной щедрости я дарю тебе кусок кода, который на 20% реализует функционал, но даёт ключ к пониманию механизма преобразования.
    Код подразумевает что с проблемами входных данных ты сможешь разобраться самостоятельно

    result = {}
    
    info.forEach((team) => {
        const country = team[0]
        const sport = team[1]
        const title = team[6]
        const place = team[7]
        const squad = team[8]
        const peoples = team[9]
        
        if (!result.hasOwnProperty(country)) {
        	result[country] = {}
        }
        
        if (sport === 'football') {
        	if (!result[country].hasOwnProperty('footballTeam')) {
                result[country]['footballTeam'] = {}
                
                if (!result[country]['footballTeam'].hasOwnProperty(title)) {
                	result[country]['footballTeam'][title] = {}
                }
                
                result[country]['footballTeam'][title]['place'] = place
                result[country]['footballTeam'][title]['squad'] = squad
                result[country]['footballTeam'][title]['peoples'] = peoples
            }
        }    
    })
    Ответ написан
    Комментировать
  • Как вы сохраняете пользователей авторизованных через социалки?

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    В ту же таблицу. Добавляю туда поле {socialNetworkName}_id;
    username, если должен быть в системе уникальным, генерируется в процессе первого входа.
    password генерируется в процессе первого входа и высылается на почту.

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

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    Создай функцию, где твоя логика явно прописана:
    function sumArrays(...$arrays) {
        usort($arrays, fn($a, $b) => count($b) - count($a));
        $biggest = $arrays[0];
        $other = array_slice($arrays, 1);
        $result = [];
        
        foreach ($biggest as $rowIndex=>$row) {
            $resultRow = [];
            
            foreach ($row as $fieldIndex => $field) {
                foreach ($other as $otherArray) {
                    if (array_key_exists($rowIndex, $otherArray)) {
                        $field += $otherArray[$rowIndex][$fieldIndex];
                    }
                }
                
                $resultRow[] = $field;
            }
                        
            $result[] = $resultRow;
        }
        
        return $result;
    }


    ... Дальше используй её на любом количестве массивов
    var_dump(sumArrays($arr2, $arr3, $arr));
    Ответ написан
    Комментировать
  • Как создать запрос на вывод по количеству отзывов?

    Immortal_pony
    @Immortal_pony
    SELECT
        magazin.id, -- укажи явно таблицу в выборке, потому что у тебя теперь есть две таблицы с полем id
        magazin.name,  -- укажи явно таблицу в выборке, потому что у тебя теперь есть две таблицы с полем name
        gorod,
        COUNT(otziv.id) AS 'quantity' -- добавь количество отзывов в выборку. Это не обязательно, работать будет и без этого шага
    FROM 
        magazin
        LEFT JOIN otziv ON (otziv.magaz_id = magazin.id) -- присоедини таблицу
    WHERE 
        gorod=$gorods
    GROUP BY
        magazin.id  -- добавь группировку
    ORDER BY 
        COUNT(otziv.id) DESC -- поменяй сортировку
    LIMIT 
        20


    PS Я бы крайне не рекомендовал использовать транслитерированный русский в названии полей никогда.
    Ответ написан
    1 комментарий