Ответы пользователя по тегу PHP
  • Как это работает и какую нагрузку несёт?

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

    @alexalexes
    Вы бы хоть сказали, в какой CMS правите модуль и что за модуль/обертка.
    Если пользоваться чистыми знаниями PHP, то по принципу "есть что-то в свойстве - добавляем в строку":
    $description = $item['description']
           .(isset($item['category_title']) ? ', '.$item['category_title'] : '')
           .(isset($item['city_name']) ? ', '.$item['city_name'] : '');
    $this->setPageDescription($description);

    PS: Вообще, добавлять какие-то сущности через запятую в метатегах характерно для keywords, а не для description. Но вы лучше видите предметную область, вам видней.
    Ответ написан
    1 комментарий
  • Как осуществить выборку MySQL?

    @alexalexes
    А зачем вам куча запросов? Нужен всего один, но с параметрами и мат. функциями.
    Чистая математика, ничего лишнего.
    SELECT *
    FROM points p
    WHERE sqrt(pow(p.x - :x, 2) + pow(p.y - :y, 2)) <= :r -- используем формулу определения расстояния между двумя точками, параметры запроса, которые нужно задать :x, :y, :r.
    Ответ написан
  • Какой эквивалент функции data_seek в PDO?

    @alexalexes
    php.net/manual/ru/pdostatement.fetch.php
    Читайте, как использовать необязательные параметры cursor_orientation и cursor_offset.
    Вероятно, подготовка запроса будет выглядеть так:
    $db->prepare($query, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));

    А чтение строки с шагом вот так:
    $row = $result->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_REL, 2); // шаг = 2
    Ответ написан
    Комментировать
  • Как прервать foreach и вывести один div?

    @alexalexes
    Все, что требует вставки после постобработки списка должно копиться в отдельной переменной $output2. Таких переменных для постобработки может быть несколько, если глубина вложенности большая, или нужно сгенерировать html в разных областях до/после списка.
    $output .= '<div class="floor">';
      $output .= '<div class="category">';
      $output2 = ''; // тут будем копить html, необходимый для вставки после обработки списка
      foreach($myPosts as $newPosts)
      {
          $newText = $newPosts->post_title;
          $post_id = $newPosts->ID;
          $permalink = get_permalink($post_id);
          $thumb = get_the_post_thumbnail_url( $post_id, 'medium' );
          $meta_values = get_post_meta( $post_id, 'floor', true );
          $string = '';
          $test = get_the_category( $post_id );
          if($prev != $meta_values && $output2 == '') // какое-то условие сработало на определенном проходе списка, и его еще не обрабатывали
          {
            $prev = $meta_values;
            $output2 .= '<span class="name">'.$string.'</span>'; // записываем вывод обработки отдельно
          }	
          $output .= '<span class="shop" data-section="'.$meta_values.'" data-shop="'.$post_id.'" data-name="'.$newText.'" data-link="'.$permalink.'" data-newlink="'.$new_links.'" data-cat="<span>'.$name.'</span>"><span>'.$newText.'</span>';
      }
      $output .= '</div>';
      $output = $output2.$output; // доставляем перед списком некие элементы, которые можно получить только после обработки списка.	
      $output .= '</div>';
    Ответ написан
    Комментировать
  • PhpMyAdmin. Появляется ошибка из-за php_max_input_vars. Как исправить?

    @alexalexes
    max_input_vars = 10000000000000000000000000000000000000

    Серьезно. )))) И в какой тип данных среда должна положить это значение, чтобы потом проверять лимит?
    Вы хоть в пределах одного порядка поэспериментируйте, 3000... 5000.
    Ответ написан
  • Как получить id компонента(html) c помощью php?

    @alexalexes
    чтобы записать в базу данных данные мне нужен id

    Насчет записать в БД, нужно понимать две различные ситуации:
    а) вставка записи;
    б) обновление записи.
    Для вставки id передавать и знать не нужно, ключик сам должен генерироваться автоинкрементом или соответствующим триггером на insert.
    Для обновления записи, естественно, нужно передавать какой-нибудь идентификатор или уникальную метку, чтобы однозначно можно было провести update с параметром. В примитивнейшем случае в качестве такой метки будет выступать идентификатор. Его можно передавать скрытым полем и этого будет достаточно.
    <form action="" method="POST">
    <input type="hidden" name="id" value="5"/>
    <input type="sabmit" value="Отправить"/>
    </form>

    На стороне сервера имя и значение поля также отыскивается во входящих массивах, как и другие вводимые поля:
    $id = $_POST['id']; // каким методом отправили форму, таким и принимаем на сервере - все просто.
    Ответ написан
    Комментировать
  • Как передать html таблицу на почту?

    @alexalexes
    Принять данные от отправленной формы и отправить по почте письмо, заполненное по шаблону, аналогично полям формы.
    Для реализации отправки можно воспользоваться встроенной функцией mail(). Можно написать свой велосипед для полноценной работы с smtp, а можно воспользоваться библиотекой, например, PHPmailer.
    Для надежности перед отправкой лучше дополнительно записывать принятые заявки в БД.
    Мало ли по каким причинам письма не будут слаться (на стороне вашего сервера и на стороне почтового сервиса есть очень много моментов, которые могут выстрельнуть).
    Ответ написан
  • Как получить последний и предпоследний значение строки через php mysql?

    @alexalexes
    Добавьте переменную-счетчик внутрить запроса и по ней высечите нужную строчку.
    SELECT a.* 
      FROM (SELECT u.* ,
                    @n := @n + 1 AS num -- переопределяем n для каждой новой строки выборки
              FROM users u,
                           (SELECT @n :=0) counter -- задаем начальное значение переменной n в подзапросе
               ORDER BY u.id DESC
          ) a
    WHERE a.num = 13
    Ответ написан
  • Какая запись вернее: $page = @$_GET['page'] или $page = isset($_GET["page"])? $_GET["page"]: null?

    @alexalexes
    В случае с GET и POST массивами, правильнее всего прощупать наличие ключа.
    Если есть ключ, значит параметр был отправлен клиентом и его можно обработать.
    Если ключа нет в массиве, то не стоит что-то извлекать $_GET["page"], проверять isset(), empty() и т.д.
    $page = array_key_exists('page', $_GET) ? $_GET["page"] : null;
    Ответ написан
  • Обычный метод копируется для каждого объекта или 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);
    Ответ написан
    Комментировать