Ответы пользователя по тегу PHP
  • Как правильно сгруппировать массив php?

    @alexalexes
    Если строки в массиве строго форматированы, и путь всегда начинается с "/home/каталог", то, чтобы получить ключ для вновь сформировываемого массива, достаточно функции explode(), если вам нужно более гибко искать название каталога, то придется вычленять его регулярным выражением.
    <?
      $input_arr = [
      "/home/fol1/test.txt",
      "/home/fol1/Browsers/test2.txt",
      "/home/fol2/Browsers/test3.txt",
      "/home/fol2/Browsers/ttre/test2.txt"
      ];
      $out_arr = [];
      foreach($input_arr as $item)
      {
        $folders = explode('/', $item);
        $key = $folders[2];
        if(!isset($out_arr[$key]) || !array_key_exists($item, $out_arr[$key])) // если еще не был такой путь
          $out_arr[$key][] = $item;
      }
      print_r($out_arr);
    ?>
    Ответ написан
    Комментировать
  • Как лучше сделать парсер данных с разных источников?

    @alexalexes
    В вашей схеме еще не хватает подсистемы scheduler - планировщик заданий.
    Его нужно чаще всего запускать по крону (а может он у вас будет вертеться в бесконечном цикле, а может спать в потоковом режиме выполнения).
    Планировщик, на основе результатов проходов паука, парсера, ограничений на проходимых сайтах, нагрузки собственной системы, будет регулировать частоту запуска перезапуска заданий.
    Желательно, чтобы задания паука и парсера были достаточно атомарны.
    Паук в одну страницу постучал, записал статус получения ответа, каков контент в ответе (html или текстовое сообщение, или JSON и тд.), удалось ли ему распознать структуру, метаданные и тд.
    Если, например, вернулась 404 стр, то возможно, с помощью планировщика установить правило, что можно натравить паука на url чуть позже, через час, день, неделю и тд.
    По аналогии, можно фиксировать статусы работы других подсистем checker-а, парсера.
    Если один из модулей застревает на 5 разе на каком-то задании, то сыпать критическую ошибку в лог и тд.

    В общем, каков бы состав модулей не был, но планировщик нужен.
    Ответ написан
    Комментировать
  • Не приходят формы с сайта на почту?

    @alexalexes
    У вас что клиентский, что серверный скрипт не имеют функционала оповещать пользователя о возникшей ошибке.
    php-скрипт должен отдавать хоть малюсенькое текстовое сообщение, что удалось отправить почту.
    ....
    $send_result = mail($admin_email, adopt($form_subject), $message, $headers );
    echo $send_result ? 'success' : 'fail';

    Клиентский скрипт должен иметь возможность в коллбэк функции done словить это сообщение:
    ...
    ).done(function(e)
    {
        var resp = e.responseText;
        alert(resp === 'success' ? 'Сообщение отправлено!' : 'Ошибка отправки сообщения');
    ....
    }

    Для аякса хорошо бы еще добавить функцию fail(), когда серверный скрипт вообще не отвечает.
    $.ajax({
          type: "POST",
          url: "../js/mail.php", //Change
          data: th.serialize()
        }).done(function(e) {
         .......
        }).fail(function()
        {
          alert('Фатальная ошибка отправки!');
        });

    Немного доработав скрипты, и получив некоторые сообщения, можно будет сориентироваться, какого рода ошибка у вас возникла.
    Ответ написан
    Комментировать
  • Как удалить нужную запись из БД?

    @alexalexes
    Если заняться изучением основ SQL, то можно понять, что в данной ситуации самым оптимальным решением будет - выполнить запрос с параметром:
    DELETE FROM videos WHERE id = ?
    Естественно, на странице браузера надо обеспечить, чтобы при нажатии кнопки "Удалить" серверу передавался id удаляемой записи, помимо того, какое действие мы хотим совершить.
    Серверный скрипт, также должен принимать не только параметр вида действия (delete), но параметр id, на какую запись необходимо направить действие. Далее, структура SQL-запроса должна иметь в себе возможность подставить параметр.
    PS:
    $ids = R::getAssoc('SELECT id FROM videos');
        $videos = R::find( 'videos', 'id = ?', $ids );

    Самое не оптимальное решение - выгребать все записи из таблицы, а потом на стороне серверного приложения искать ту единственную, которая удовлетворяет условию. Эта медвежья услуга нагружает тракт обмена данных между веб-сервером и СУБД-сервером.
    Ответ написан
    Комментировать
  • Как сделать вывод значений из одинаковых полей формы?

    @alexalexes
    Обработчик селекта js который и меняет блоки с помощью display:none, display:block.

    Вариант А. Переписать этот обработчик так, чтобы наверняка удалял неиспользуемый вариант и создавал блок с нужным вариантом полей, тогда у вас в форме не будут лишних полей.
    Вариант A2. Переписать этот обработчик так, чтобы в скрытых блоках имена полей были с префиксами, а не в скрытых префиксы убирались, тогда сервер будет обрабатывать только те поля, у которых нормальные имена (без префиксов).
    Вариант A3. К дополнению к display: none, нужно вырубать поля атрибутом disable.
    Вариант Б. Поля с именами, которые будут обрабатываться на сервере вынести в отдельные поля hidden (на форме будут поля с теме же именами, но с префиксами, чтобы они не пересекались и не брались в учет сервером), и по submit сделать обработчик, чтобы он переносил в них значения по текущему состоянию формы.
    PS: Самый нетрудозатратный для разработчика - вариант А3.
    /* 
      Функция вкл и выкл полей формы в различных контейнерах
      @param str enable_id - id-контейнера, в котором нужно вкл. поля ввода
      @param arr disable_ids - массив id контейнеров, в которых нужно выкл. поля ввода
    */
    function fields_enable_and_disable(enable_id, disable_ids)
    {
      var enable_container = document.getElementById(enable_id); // получаем контейнер, в котором нужно "включить" поля ввода
      var field_types = ['input', 'select', 'textarea']; // все виды полей ввода с которыми нужно проделать манипуляцию вкл/выкл.
      var count_i = field_types.length; // кол-во типов полей
      for(var i = 0; i < count_i; i++) // перебираем типы полей
      {
        var field_type = field_types[i]; // текущий тип поля
        var enable_fields = enable_container.getElementsByTagName(field_type); // получаем коллекцию полей ввода, которые нужно вкл.
        var count_j = enable_fields.length; // кол-во полей текущего типа
        for(var j = 0; j < count_j; j++) // перебираем поля этого типа
          enable_fields[j].disabled = false; // включаем
        var count_k = disable_ids.length; // кол-во контейнеров, в которых нужно выкл. поля
        for(k = 0; k < count_k; k++) // перебираем неактивные контейнеры
        {
          var disable_id = disable_ids[k]; // id - текущего неактивного контейнера
          var disable_container = document.getElementById(disable_id); // получаем неактивный контейнер
          var disable_fields = disable_container.getElementsByTagName(field_type); // получаем поля текущего типа неактивного контейнера
          var count_n = disable_fields.length; // кол-во этих полей по текущ. типу
          for(var n = 0; l < count_n; n++)
            disable_fields[n].disabled = true; // выкл. эти поля
        }
      }
    }
    Ответ написан
  • Как это работает и какую нагрузку несёт?

    @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-функцией.
    Ответ написан
    Комментировать