Ответы пользователя по тегу PHP
  • Как обойти xls файл допустим парсером PHPExcel с не фиксированными кол-вами полей по вертикали?

    elevenelven
    @elevenelven
    Php Dev @ Amadeus
    Если у строк товара значимые колонки A,B,C,D.
    А у строк описаний, значимая колонка только A.
    То очевидно, что присутствие значений в колонках B-D является маркером товара.
    Ответ написан
    Комментировать
  • Насколько эффективен скрипт↓?

    elevenelven
    @elevenelven
    Php Dev @ Amadeus
    У вас непарное количество открывающих и закрывающих фигурных скобок.

    xreservederror - это константа? А это $GLOBALS[xreservederror] что такое?

    hexdec($i) я бы заменил на intval($i,16). Но hexdec('ff') вообще заменил бы на 255.

    Создали бы переменную
    $fileName = './db/'.$pre.dechex($i).'.list'

    Вот этот кусок:
    if($i<16)
          $pre=0;
    
        if(!file_exists('./db/'.$pre.dechex($i).'.list'))
          mkfile('./db/'.$pre.dechex($i).'.list');

    Если $i>=16, то переменной $pre не будет.

    Как указал 27cm, это что-то странненькое.
    if($i>hexdec('ff')){
          return false;
          $GLOBALS[xreservederror].='<t>[u01] Database is full.</t>';
          break;
        }


    Вот этот кусок:
    $data.=str_repeat(' ', $size);
    $data=substr($data, $size);

    Я так понимаю, вы берете некоторую строку и увеличиваете её длину на $size, а потом берете фрагмент получившейся строки отступив $size с начала строки. Я тут вижу много входных данных, которые приведут к созданию файла заполненного пробелами.

    Было бы легче вам подсказать по коду, если бы вы объяснили что он делает, написали комментарии к некоторым мутным кускам кода, а также объяснили к чему в вашем вопросе тэг Базы данных.

    ---------------
    UPD

    О! Спасибо что откомментировали код, и стало немного яснее. Я понял ваш вопрос.
    Вы хотите забабахать свое хранилище данных, на файловой системе. Объемы будут в районе 3ГБ.
    ---------
    Я вам сейчас скажу крамольную вещь, но вроде очевидную. Файловая система, это не самый лучший вариант по быстродействию. А ваш код не предусматривает никакого кеширования.

    Я бы отошел от идеи использовать свой велосипед. Индустрия изобрела для вас кучу различных хранилищ. Sql, NoSql, ключ-значение, хеш-таблицы. Вы хотите что-то хранить на диске?!
    MySQL и Redis хранят данные на диске, но в то же время у них есть кеширование и механизмы оптимизации, выгрузка в RAM.

    А кроме того, ваш код:
    - слишком примитивен и не оптимален. Нет поддержки транзакций и явного механизма блокировок. А это вылезет коллизиями при нагрузке.
    - не учитывает очень важные нюансы работы, например особенности работы php с файловой системой.

    что на счёт быстродействия?
    Быстродействие будет посредственное, а главное с коллизиями.

    не нагнётся ничего при 3 ГБ данных?
    Вы будете создавать излишнюю нагрузку на диск.
    Вопрос надо ставить не в гигабайтах, а в обращениях в секунду. Диск захлебнется.
    Ответ написан
  • Как подсчитать общее количество записей по "парам"?

    elevenelven
    @elevenelven
    Php Dev @ Amadeus
    Исходя из формулировки вопроса, как-то очень просто выходит. Цитирую вас:
    Как подсчитать общее количество записей по «парам»?
    Вы хотите выбрать сообщения, которые отослал полизователь или прислали пользователю
    SELECT * FROM `messages` WHERE `to_user`={$user['id']} OR `from_user`={$user['id']}


    Дальше вы говорите, что на самом деле выбрать желаете что-то другое.
    Тоесть два человека обменялись сообщениями... выводим цифру 1
    Я так понимаю, что вы хотите получить общее количество диалогов, а не записей(в таблице сообщений)?!
    А потом я смотрю на ваш запрос и вижу, что вы ищете(пытаетесь искать) количество диалогов в котором данный пользователь участвует.

    SELECT * FROM `messages` AS z1
    WHERE z1.`from`={$user['id']} OR z1.`to`={$user['id']}
    AND NOT EXISTS(
    	SELECT id FROM `messages` as z2 WHERE z2.`to` = z1.`from` AND z2.`from` = z1.`to`
    )
    GROUP BY `from`,`to`
    Ответ написан
    Комментировать
  • Как можно улучшить этот кусок говнокода на PHP?

    elevenelven
    @elevenelven
    Php Dev @ Amadeus
    Я бы попробовал использовать extract.
    Или сделал бы каждое изображение экземпляром классом, который бы инкапсулировал в свойствах все эту ерунду.

    Этот код сложно отрефакторить. Его проще переписать.
    Ответ написан
  • Как правильно сделать удаление комментария?

    elevenelven
    @elevenelven
    Php Dev @ Amadeus
    Не берите данные об UserID из того что предоставляет пользователь.

    Берите из сессии или из объекта User (смотря какой у вас фреймворк, или CMS, или самописный движок)

    if( $comment->getUserId() === $_SESSION['user']['id'] ){
       //doDelete
    }else{
      Logger::log('Fraud attempt');
    }


    Хотя по формулировке вопроса я чувствую у вас нет привязки комментария к ID пользователя?
    Ответ написан
    2 комментария
  • Как выбрать последний id из sql таблицы?

    elevenelven
    @elevenelven
    Php Dev @ Amadeus
    $sql = "SELECT LAST_INSERTED_ID FROM members";
    $sql = mysql_query ($sql);
      while ($row = mysql_fetch_assoc($sql)) {
        echo "<span class='num'>" . $row['id'] . "<span>";
      }
    Ответ написан
  • PHP как распараллелить запросы?

    elevenelven
    @elevenelven
    Php Dev @ Amadeus
    Можете глянуть в сторону Gearman.
    Если коротко, то вы создаёте в скрипте запрос на выполнение определенной работы и передаёте его работнику (который уже и будет её делать минуту), а сам скрипт потратит на это секунду. Следующую работу он отдаст другому свободному рабочему.
    Очень удобно. Хотя требует некоторого вклада в инфраструктуру.
    Ответ написан
    Комментировать
  • Как группировать массив по имени?

    elevenelven
    @elevenelven
    Php Dev @ Amadeus
    Простите, нет под рукой PHP. Написал с планшета.
    /**
         *
         * Input array consists of elements as in example
         * <code>
         * Array
         * (
         * [0] => Array
         * (
         * [name] => Холопова Анастасия
         * [num_meet1] => 4
         * )
         *
         * [1] => Array
         * (
         * [name] => Погарченкова Мария
         * [num_meet1] => 2
         * )
         *
         * [2] => Array
         * (
         * [name] => Индутова Валерия
         * [num_meet1] => 1
         * )
         *
         * [3] => Array
         * (
         * [name] => Валерьянова Саша
         * [num_meet2] => 1
         * )
         *
         * [4] => Array
         * (
         * [name] => Валерьянова Саша
         * [num_meet3] => 1
         * )
         *
         * [5] => Array
         * (
         * [name] => Холопова Анастасия
         * [num_meet4] => 1
         * )
         *
         * )
         * </code>
         *
         * @param array $array
         *
         * @return array
         */
        function alterArray(array $array){
    
          $newArray = [];
          foreach($array as $subarray)
          {
            if(isset($subarray['name']))
            {
              $lastElementOfArray = array_slice($subarray, 1, 1);
              reset($lastElementOfArray);
              $newArray[ $subarray['name'] ][ key($lastElementOfArray) ] = current($lastElementOfArray);
            }
          }
          return $newArray;
        }
    Ответ написан
    1 комментарий
  • Как составить правильную модель mysql?

    elevenelven
    @elevenelven
    Php Dev @ Amadeus
    habrahabr.ru/post/254773

    Исходя из описания, вы верно разбили сущности на 3 таблицы.

    Вам не придется создавать промежточную таблицу если рецепт будет принадлежать к одной географической кухне (отношение один -к-одному). Когда вы добавите таблицу География кухни, то просто id из этой таблицы сопоставите полю в таблице рецептов (geo_region_id)

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

    elevenelven
    @elevenelven
    Php Dev @ Amadeus
    Вы не выгружаете из базы чекбоксы, там могут быть и короткие целочисленные поля, и булевы. Вы считываете данные из бд(которые могут быть вообще в разных таблицах и иметь сложные связи) для того чтобы посредством програмного кода представить их на html-странице.
    Допустим, у вас эти данные представлены в виде html-формы, которую после редактирования вы отправляете через Post-запрос.
    Данные которые к вам пришли посредством этого post-запроса, вы с помощью некоторой программной логики преобразовываете и запросом к бд обновляете измененные поля.
    Ответ написан
    Комментировать
  • Как получить даты всех дней этой и следующей недели в PHP?

    elevenelven
    @elevenelven
    Php Dev @ Amadeus
    На коленке.
    function getDatesForThisAndNextWeek()
    {
      $days = ['Monday' => 1, 'Tuesday' => 2, 'Wednesday' => 3, 'Thursday' => 4, 'Friday' => 5, 'Saturday' => 6, 'Sunday' => 7];
    
      $i = 1;
      foreach($days as $k => $v)
      {
        $today = new \DateTime();
        $today->setISODate((int)$today->format('o'), (int)$today->format('W'), $days[ ucfirst($k) ]);
        $daysArray[ $i ] = $today->format('Y-m-d');
    
        $todayPlusWeek       = $today->modify('+1 week');
        $daysArray[ $i + 7 ] = $todayPlusWeek->format('Y-m-d');
    
        $i++;
      }
      ksort($daysArray);
      return $daysArray;
    }
    
    var_dump(getDatesForThisAndNextWeek());
    Ответ написан
    1 комментарий
  • Почему такое поведение PHP при сложении чисел?

    elevenelven
    @elevenelven
    Php Dev @ Amadeus
    Вы уверены что код у вас не выполняется дважды? Редиректы на странице, циклы?

    Давайте для полноты картины вы приведете код
    $article->getViews();
    $article->setViews();
    Ответ написан
  • Как полностью избавиться от логики в шаблоне?

    elevenelven
    @elevenelven
    Php Dev @ Amadeus
    Я предлагаю вам посмотреть какие функции имеет шаблонизатор Twig
    Там есть и for, и if. То есть, это нормально в шаблоне использовать условия и циклы.

    И в контроллере пустую переменную не передать - ругается на invalid foreach.
    Как тогда?

    На то он и контроллер, чтобы контролировать ввод\вывод.
    if(null === $myVar){
        $myVar = [];
     }

    Если к вам пришла пустая переменная, а в шаблоне вывода ожидается массив, то преобразуйте её в пустой массив, перед передачей в шаблон.
    Ответ написан
    Комментировать
  • Как задать две кодировки в php парсере?

    elevenelven
    @elevenelven
    Php Dev @ Amadeus
    А в какой кодировке сохранен сам файл .php?

    Замечу что у вас не совсем корректно в коде описан паттерн. Он задается с делимитером в начале и конце.
    <?php
    $subject = "abcdef";
    $pattern = '/^def/';
    preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE, 3);
    print_r($matches);
    ?>


    ru2.php.net/manual/ru/reference.pcre.pattern.syntax.php
    php.net/manual/ru/function.preg-match.php
    Ответ написан
    2 комментария
  • Почему различие реальных заказов и google analytics ecommerce?

    elevenelven
    @elevenelven
    Php Dev @ Amadeus
    Всё это хозяйство в аналитику передается через JS.
    Одна js ошибка на странице не поймана и в аналитику ничего не пойдет.
    Не догрузился скрипт из-за проблем с соединением, то же самое.
    Где-то в аяксе напортачили, заказ прошел, ga - нет.
    Ответ написан
    Комментировать
  • Как определить компетентность на должность middle - senior php developer?

    elevenelven
    @elevenelven
    Php Dev @ Amadeus
    Никак. Middle должен оценивать минимум senior, senior минимум techlead.
    Senior- это уже вопросы не на знание языка и приведение типов, а паттерны, транзакции, деплой, покрытие тестами, типичные бизнес проблемы в предметной области.

    На middle(но не middle+), могу порекомендовать https://tests4geeks.com/test/php-mysql
    Даст представление о кандидате, в целом.
    Ответ написан
    Комментировать