Ответы пользователя по тегу PHP
  • Какой способ получения IP лучше?

    @alexalexes
    Как договоритись с админом сети, или как принято на хостинге.

    https://habr.com/post/177113/

    //здесь не понятно зачем нужна собака @, и зачем фильтровать и обязательно ли это делать?

    Собака отключает логирование ошибки в вызове элемента массива.
    Например:

    $client = $_SERVER['HTTP_CLIENT_IP'];

    Если вдруг в массиве $_SERVER не окажется элемента с ключом 'HTTP_CLIENT_IP', то в лог-файл сервера запишется предупреждение об этом.
    Чтобы предупреждений не было можно поступить так:

    $client  = array_key_exists('HTTP_CLIENT_IP',  $_SERVER) ?  $_SERVER['HTTP_CLIENT_IP'] : '';


    или так, как в вопросе, с использованием собаки.
    Ответ написан
    Комментировать
  • Загрузка файла в хранилище Postgres без прав суперпользователя на PHP?

    @alexalexes
    Если нельзя управлять пользователями, то нужно создать такое приложение, которое может подключиться от имени другого пользователя с нужным набором прав.
    Только это приложение должно быть запущено на сервере на постоянной основе и уметь обмениваться по http с PHP через curl.
    Ответ написан
    1 комментарий
  • Почему выводит кракозябры?

    @alexalexes
    Если у вас используется сервер PHP 5.6 и выше, то нужно отправлять браузеру http-заголовок, в какой кодировке скрипт будет отдавать данные, в независимости в какой кодировке сам файл скрипта, и даже в том случае, если вы нормально отдаете HTML-структуру документа.
    //установка кодировки вывода
      header('Content-Type: text/html; charset=utf-8');

    Если не знаете, в какой кодировке будут данные, то нужно идентифицировать кодировку, и вписать ее в header():
    echo mb_detect_encoding(implode("\n", $output));
    ----------------------------
    Кодировку подобрал для заголовка методом тыка, так как mb_detect_encoding() не вывел явного ответа.
    У меня оказалась CP866:
    header('Content-Type: text/html; charset=CP866');
    $data = 'help';
    exec(escapeshellcmd($data), $output, $return);
    echo implode("<br>", $output)."<br>Return Code: ".$return;
    Ответ написан
  • Как вычислить сумму часов?

    @alexalexes
    Чуть посложнее, чем предыдущая ваша задача. Постарайтесь самостоятельно разобраться, как работать со временем.
    $arraytime = ['07:01:05', '06:21:30', '08:15:15', '07:13:08', '06:02:00', '09:21:10', '12:54:48'];
    $sum = 0;
    foreach($arraytime as $time)
        $sum += strtotime($time) - strtotime('00:00:00');
    echo sprintf('%d:', $sum / 3600).date('i:s', $sum);
    Ответ написан
    Комментировать
  • Как вычислить кол-во в часов из двух времени?

    @alexalexes
    Как вариант.
    $starthours = '08:15:09';  $stophours = '16:45:19';
    $diff = strtotime($stophours) - strtotime($starthours) + strtotime('00:00:00');
    echo date('H:i:s', $diff);
    Ответ написан
    Комментировать
  • Формирование запроса?

    @alexalexes
    А почему не сразу в запросе?
    SELECT *
       from (SELECT  servers.id,
                               servers.game,
                               servers.votes,
                               @n := @n + 1 AS rank
                     FROM servers, (SELECT @n := 0) r
              ORDER BY servers.votes DESC) a 
    where id = 3
    Ответ написан
    6 комментариев
  • Не добавляется в базу данных?

    @alexalexes
    $query = 'INSERT INTO `users`(`email`, `password`) VALUES ('.$login.', '.$password.')';

    Во-первых, никогда, ни при каких обстоятельствах не склеивайте строку запроса с добавлением входных параметров, которые не прошли экранирование по sql нотации. Приклеили к строке запроса непроверенный параметр (а тем более пришедший напрямую от клиента) - считайте, что подписались на sql-инъекцию.

    Адекватная подстановка параметров происходит только при правильной подготовке запроса функциями
    mysqli_prepare() и mysqli_stmt_bind_param().

    Для получения данных из БД нужна "правильная культура" общения с ней.
    Правильная культура подразумевает:
    1. После попытки подключения нужно проверить, а состоялось ли оно.
    2. Прежде чем выполнить запрос, его текст нужно подготовить prepare-функцией.
    3. Если есть входные параметры, то привязать их к запросу bind-функцией.
    4. Запустить выполнение execute-функцией;
    5. Получить результат запроса fetch-функцией;
    6. Закрыть statement или вовсе закрыть соединение.

    В этих пунктах еще нет шагов работы с транзакциями, но если присутствует вот этот минимум, то вы уже адекватно осуществляете процесс общения с СУБД.

    В ваше случае нужно проверить, а состоялось ли подключение. Иначе нет смысла слать запросы.

    Вот пример, где более-менее верно описан процесс взаимодействия с СУБД (взят с www.php.su/mysqli_stmt_bind_param):

    <?php
    $link = mysqli_connect('localhost', 'my_user', 'my_password', 'world');
    
    /* check connection */
    if (!$link) {
        printf("Connect failed: %s\n", mysqli_connect_error());
        exit();
    }
    
    $stmt = mysqli_prepare($link, "INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
    mysqli_stmt_bind_param($stmt, 'sssd', $code, $language, $official, $percent);
    
    $code = 'DEU';
    $language = 'Bavarian';
    $official = "F";
    $percent = 11.2;
    
    /* execute prepared statement */
    mysqi_stmt_execute($stmt);
    
    printf("%d Row inserted.\n", mysqli_stmt_affected_rows($stmt));
    
    /* close statement and connection */
    mysqli_stmt_close($stmt);
    
    /* Clean up table CountryLanguage */
    mysqli_query($link, "DELETE FROM CountryLanguage WHERE Language='Bavarian'");
    printf("%d Row deleted.\n", mysqli_affected_rows($link));
    
    /* close connection */
    mysqli_close($link);
    ?>
    Ответ написан