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

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    MetaProducts Offline Explorer
    Ответ написан
    Комментировать
  • Как распарсивать ну ооочень иерархический json?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    Не очень понятен вопрос. Тем более, что структура, которую ты нарисовал, не является валидным JSON'ом.

    В PHP есть встроенная функция json_decode, которая прекрасно справляется с иерархиями любой сложности.
    Ответ написан
    8 комментариев
  • Как расшифровать зашифрованный php-файл?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    Хочешь смотреть исходный код - покупай лицензию.
    Ответ написан
    3 комментария
  • Как привести дату к нужному формату ?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    Дело в том, что в PHP нет русских названий месяцев. Так что формировать всё равно придётся руками. А вот для разрезания есть getdate. Что-то вроде такого:
    $month=[1=>'января', ..., 12=>'декабря'];
    $test_date='2014-10-06 14:01:25';
    $tmp=getdate(strtotime($test_date));
    $result=sprintf('%02d %s %4d года, %02d:%02d',
                    $tmp['mday'], $month[$tmp['mon']], $tmp['year'], $tmp['hours'], $tmp['minutes']);

    Другой вариант основан на том, чтобы генерировать месяц в любом виде, а дальше регуляркой его менять. Что-то вроде:
    $result=preg_replace_callback('#<(\d+)>#', function($data){
      static $month=[1=>'января', ..., 12=>'декабря'];
      return $month[$data[1]];
    }, date('d <m> Y года, H:i', strtotime($test_date)));
    Ответ написан
  • Как определить id авторизованного пользователя с удаленного сервера?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    Первые пришедшие в голову варианты (в самом примитивном виде):

    При загрузке с сервера в браузер либо передавай id пользователя через куки, либо добавь к URL фотографии ?id=...

    При загрузке из браузера на сервер просто передавай вместе с изображением и id-либо через input type="hidden", либо через куки, либо добавляй ?id=... к URL обработчика фотографии.
    Ответ написан
  • Как правильно выполнить этот запрос к MySQL?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    @dez-fafara абсолютно прав. Но набор однотипных OR'ов лучше заменять на IN:
    SELECT * FROM `products` WHERE `available`='1' AND `sex` IN ('0', '2') ORDER BY `order`
    Ответ написан
    Комментировать
  • Почему появляется ошибка mysqli error #1054?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    А кавычки вокруг test где? Твой второй вариант создаёт запрос:

    $data = $db->query("SELECT `price` FROM `price` WHERE `name` IN(test,test2,test3)");

    Что, очевидно, не равно первому варианту.

    P.S. Неужели так сложно набрать
    var_dump("SELECT `price` FROM `price` WHERE `name` IN(".implode(',', $name_id).")");
    и самому посмотреть, что получается?
    Ответ написан
    Комментировать
  • Как сделать загрузку PHP Include с задержкой?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    Передавай адреса того, что надо загружать со сторонних сайтов, в javascript. А уже JS-кодом последовательно подгружай контент на страницу. PHP здесь тебе никак не помочь не может.
    Ответ написан
  • Где ошибка в скрипте авторизации?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    1. При использовании подготовленных выражений (т.е. '?' на месте значения параметра в запросе) никаких mysql_real_escape_string и прочих функций экранирования НЕ НУЖНО!
    Должно остаться только: $login = htmlspecialchars(trim($_POST['login']));
    2. Для хэширования пароля есть специальная функция crypt. А в новых версиях PHP целый набор функций ru2.php.net/manual/ru/ref.password.php. При хэшировании к паролю необходимо добавлять соль.

    3. Если используется utf-8 (или другой вариант юникода), то логин нужно дополнительно нормализовать - чтобы не было разных логинов, которые внешне выглядят совершенно одинаково:
    $login = htmlspecialchars(trim(Normalizer::normalize($_POST['login'], Normalizer::FORM_KC)));
    Ответ написан
    Комментировать
  • Как изменить опции в товаре?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    Насколько я понимаю, никак. Только удалив старый товар и добавив новый.
    Ответ написан
    Комментировать
  • Где лучше хранить данные для JQuery UI Autocomplete?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    Городов в России слишком много, чтобы удобно хранить их в файле. Так что только в БД. Но проблема в том, что есть множество населённых пунктов с совпадающими названиями. И если надо их различать, то придется гранить не только город, но и регион, и район региона.
    Ответ написан
    Комментировать
  • Как быстрее выбрать изображения из БД (mysql php)?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    Быстрее всего будет работать вариант, когда имена файлов изображений хранятся непосредственно в таблице "лот" - чтобы JOIN вообще не было. Будет ли это 10 полей типа VARCHAR, или одно поле, хранящее сериализованный массив - не принципиально.

    Но хранить, разумеется, надо именно имена файлов, а не сами файлы.

    @kaasius прав в том, что картинки надо раскидывать по множеству папок. Но должно быть 2 уровня папок, а не один и в механизме распределения он ошибается. Раскидывать надо не по id, а случайным образом. Например, взять md5(uniqid($id_лота, true)) и первые 3 символа использовать в качестве имени папки, а следующие 3 - в качестве имени подпапки. Получится что-то вроде /images/48e/da3/имя_файла.
    Ответ написан
    Комментировать
  • Как сортировать список, взятый из БД, по месяцу и дню?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    1. Если ты хочешь отсортировать именно по месяцу и дню без года, то какого чёрта добавляешь в шаблон форматирования даты %Y?

    2. Если же ты сортируешь по полной дате и поле bd имеет тип DATE, DATETIME. TIMESTAMP и т.п. (т.е. тип, предназначенный для хранения даты) то никаких извращений с DATE_FORMAT не требуется - просто ORDER BY bd DESC.

    3. Для ситуации, когда поле не заполнено, в SQL если специальное значение NULL. Костыли в виде bd!='0' - ещё один бред.
    Ответ написан
    4 комментария
  • Как в скрипте JS прописать условие отбора элемента (Drupal 6)?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    var tmp=$("a[href$='.jpeg'], a[href$='.jpg'], a[href$='.JPEG'], a[href$='.JPG']");
    if(tmp.length>1){
      tmp.addClass('colorbox').attr('rel', 'gal').colorbox();
    }
    Ответ написан
    1 комментарий
  • Стоит ли в MySQL разделять таблицы по разным БД?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    В MySQL (к другим СУБД это не относится) в запросе возможно указать базу данных. Более того, в одном запросе может быть обращение к таблицам разных БД. Разумеется, если все они работают на одном сервере.

    Т.е. безо всяких дополнительных соединений можно сделать:

    INSERT INTO base1.table1 (field2) SELECT base2.table2.field2 FROM base2.table2;

    Таким образом, никаких проблем с разделением таблиц по нескольким базам нет. И несколько соединений тоже не требуется.

    Если же базы будут работать на разных серверах, то да - понадобится по одному соединению на сервер. Что тоже проблем не вызовет.
    Ответ написан
    Комментировать
  • Как реализовать цикличный алгоритм расчета даты в php?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    Посмотри на функцию getdate - возвращаемые элементы wday и mday помогут решить задачу.
    Ответ написан
    Комментировать
  • Как найти последовательность тегов в html-документе?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    Проще всего это сделать с помощью регулярных выражений. Например, вот так:
    $val=preg_replace('#<p[^>]*>\s*((?:<img\s[^>]+>\s*){2,})</p[^>]*>#is', '<div>$1</div>', $val);

    Если же это не обязательно <p>, а любой тег, то:
    $val=preg_replace('#<([[:alpha:]]+)(?:\s[^>]*)?>\s*((?:<img\s[^>]+>\s*){2,})</\g{1}(?:\s[^>]*)?>#is', '<div>$2</div>', $val);
    Ответ написан
    2 комментария
  • Как сделать редирект после регистрации (php) ?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    После всей обработки регистрации, но до вывода чего-либо в браузер необходимо добавить код:

    header('Location: /account/settings');
    exit;
    Ответ написан
    Комментировать
  • Как собрать многоуровневый массив?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    Зачем такие сложности? Всё делается намного проще - без рекурсий и проверок множества дополнительных условий:

    $input = 'Шла Саша по шоссе и сосала сушку';
    
    $inp_arr = preg_split('#[[:space:]]+#s', trim($input)); // Список обрабатываемых слов
    $current = array(); // Список уже обработанных слов
    $result  = array(implode(' ', $inp_arr)); // Добавляем в результат исходную фразу
    while (count($inp_arr) > 1) { // Пока в списке обрабатываемых не менее 2 слов
      $head = array(); // Голова списка обрабатываемых слов
      $tail = $inp_arr; // Хвост списка обрабатываемых слов
      while (count($tail) > 1) { // Пока в хвосте не менее 2 слов
        $head[]   = array_shift($tail); // Перенос первого слова хвоста в конец головы
        // Добавляем комбинацию в результат
        $result[] = array_merge($current, array(implode(' ', $head), implode(' ', $tail)));
      }
      $current[] = array_shift($inp_arr); // Перенос первого слова обрабатываемых в уже обработанные
    }
    
    var_export($result);


    Вариант, который перебирает все комбинации, всё же удобнее сделать рекурсивным, но алгоритмически он проще, т.к. не надо заботиться о том, чтобы в $current было по одному слову:

    $input="Шла Саша по шоссе и сосала сушку";
    $result=generate(preg_split('#[[:space:]]+#s', trim($input)));
    var_export($result);
     
    function generate($inp){
      $out=array(implode(' ', $inp));
      $head=array();
      while(count($inp)>1){
        $head[]=array_shift($inp);
        foreach(generate($inp) as $val){
          $out[]=array_merge(array(implode(' ', $head)), (array)$val);
        }
      }
      return $out;
    }

    Если нужно сортировать по длинам строк, то достаточно изменить порядок обработки: предыдущий вариант начинает перебор с пустой головы и длинного хвоста, а надо с длиной головы и пустого хвоста:

    function generate($inp){
      $out=array(implode(' ', $inp));
      $tail=array();
      while(count($inp)>1){
        array_unshift($tail, array_pop($inp));
        foreach(generate($tail) as $val){
          $out[]=array_merge(array(implode(' ', $inp)), (array)$val);
        }
      }
      return $out;
    }

    Если же нужно отсортировать результат по длинам строк независимо от того, в какой позиции эта строка находится, то проще всего - как и сказал @Fesor - использовать отдельную сортировку результата. Например, вот так:

    usort($result, function($val_1, $val_2){
      // Получение кол-ва слов в строках сравниваемых вариантов
      $len_1=array_map(function($data){ return count(preg_split('#[[:space:]]+#s', $data)); }, (array)$val_1);
      $len_2=array_map(function($data){ return count(preg_split('#[[:space:]]+#s', $data)); }, (array)$val_2);
    
      // Массивы кол-ва слов, отсортированные по убыванию
      $sort_len_1=$len_1;
      $sort_len_2=$len_2;
      rsort($sort_len_1);
      rsort($sort_len_2);
    
      // Проверяем, что два варианта имеют разное кол-во слов в строках
      for($i=0; $i<count($sort_len_1); $i++){
        if($sort_len_1[$i]!=$sort_len_2[$i]){
          return $sort_len_2[$i]-$sort_len_1[$i];
        }
      }
    
      // К данному моменту варианты по длинам строк уже отсортированы
      // Этот цикл сортирует варианты с одинаковыми длинами по местоположению длинных строк
      // Если такая сортировка не требуется - удалить цикл
      for($i=0; $i<count($len_1); $i++){
        if($len_1[$i]!=$len_2[$i]){
          return $len_2[$i]-$len_1[$i];
        }
      }
    
      return 0;
    });
    Ответ написан