Задать вопрос
Ответы пользователя по тегу PHP
  • Обычный метод копируется для каждого объекта или PHP оптимизирует и не делает копию методов для объектов?

    @alexalexes
    Объекты - разные, метод - один и тот же.
    Когда вы второй раз вызываете new для уже определенной переменной, выделяется память под новый объект, объект создается заново. Адрес памяти, куда ссылалась до этого $a зачищается сборщиком мусора по мере его возможностей.
    PS: new буквально говорит "возьми ресурсы системы и построй мне объект по чертежу Foo!!!"
    Ответ написан
  • Как безопасно загрузить изображение на сервер?

    @alexalexes
    На стороне PHP пропустить полученный файл через GD библиотеку.
    При необходимости, уменьшить качество выходного файла, и попутно сгенерировать preview, отправив его обратно клиентку (+ подтвердив получение сервером).
    Учтите, придется увеличить доступный объем оперативной памяти для одного процесса PHP.
    На моем опыте, чтобы GD проглотила 16 Мпикс картинку, нужно 128 Мб ОЗУ.
    Перед скармливаем GD взвешиваем картинку с помощью getimagesize().
    Если это не сделать, и с превышением лимита отдать на обработку библиотеке, то скрипт тихо-мирно заглохнет, не сообщив клиенту ничего, а так можно сгенерировать сообщение, что файл большой.
    Ответ написан
  • Как защищится от sql инекции без ооп в php?

    @alexalexes
    А причем тут боязнь ООП?
    В документации описаны, как прикрепить параметры к запросу как в объектно-ориентированном стиле, так и в процедурном. Реализовать общение с СУБД можно и в том, и в другом стиле, если речь идет про MySQl.
    php.net/manual/ru/mysqli-stmt.bind-param.php

    PS: Вы просто боитесь усваивать документацию, пробовать различные примеры реализации. Вот и все.
    Ответ написан
    3 комментария
  • Правильный запрос к MySQL?

    @alexalexes
    Запрос выполнился. $res не хранит выборку.
    Выборку надо вытянуть fetch-функцией.
    Ответ написан
    Комментировать
  • Что не так в фильтре?

    @alexalexes
    В чекбоксах используется принудительное изменение window.location.href на onchange - это вызывает перезагрузку страницы с новыми параметрами. Построением классической формы и отправкой параметров по атрибутам name даже и не пахнет. (Вероятно, из-за "числовых" имен get-параметров).
    а) В select нужно аналогично на onchange событии проанализировать, какую опцию выбрали и сконструировать аналогичным методом url для перезагрузки страницы с новыми параметрами, подставив новый url в window.location.href.
    б) Другой вариант. Заменить тип кнопки "Показать" на button и добавить обработчик onclick, который все равно будет генерировать ссылку для window.location.href, а не отправлять форму классическим способом.
    PS: Честно, никогда не встречал, чтобы параметры get имели чисто числовое название, не считая тех случаев, где используется якорь #.
    Думаю, это плохая практика именования. Я бы использовал бы хоть один символ впереди названия, например,
    ?p1=1&p256=23
    Прокомментируйте, кто в теме таких тонкостей.
    Ответ написан
  • Какой способ получения 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);
    ?>
    Ответ написан