Задать вопрос
  • Где лучше качество кода?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    Все плохо
    • Глобальные переменные — зло
    • На лицо некий код, который и с сессией работает и с БД — явное нарушение общепринятных принципов, например SRP
    • $dao как инициализирована? Явно не через конструктор
    • Использование цифры, вот сиди гадай по ней — это плохо, используйте именованную константу. Например 3 — это некий статус для desktop, вот и назовите ее STATUS_DESKTOP, хотя далее...
    • вы обращаетесь к одному методу, который шибко умный — работает с флагами, тем самым нарушая SRP и сам содержит if/else, сделайте просто 2 раздельных метода:
      getMobileOpinionList()
      getDefaultOpinionList()

    • Предикат лучше вынести в отдельный метод isMobileOnly(), тк условия могут поменяться в нем, не будете же везде в if менять по всему проекту
    Ответ написан
    33 комментария
  • Можно ли не использовать вентилятор в блоке питания ATX?

    Zoominger
    @Zoominger
    System Integrator
    Да, может. Инженеры не просто так поставили туда принудительное охлаждение, а подавляющее число поломок РЭА вызывается неверным температурным режимом.
    Оставьте, короче.
    Ответ написан
    Комментировать
  • PHP разбить текст на слова, вернуть слова и делители?

    GomelHawk
    @GomelHawk
    PHP / Symfony developer
    Можно немного проще:

    $string = 'МАЗ 5551  ... ';
    $result = \array_filter(
        \preg_split('/([\\s.,!-])/u', $string, 0, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY),
        static function ($value) { return $value !== ' '; }
    );
    Ответ написан
    Комментировать
  • Сервер не видит tpl файл, почему?

    @PapaStifflera
    Родился, вырос...
    Очевидно, что ни Ubuntu, ни Ubuntu Server, ни VirtualBox здесь не виноваты.
    Разбирайтесь с кодом, путями и, возможно, правами доступа.
    Ответ написан
    5 комментариев
  • Как превратить фоновое изображение в водяной знак, изменив прозрачность?

    @iText_A
    Посмотрите пример BackgroundTransparent. Это вариант примера BackgroundImage

    В своем коде вы добавляете Image к экземпляру Document. В этом нет ничего плохого, но если вы хотите сделать изображение прозрачным, нужно создать мягкую маску. Это нетрудно, но есть и более простой способ сделать фон прозрачным: добавьте изображение прямо к содержимому, а затем определите прозрачность с помощью PdfExtGState:

    PdfCanvas canvas = new PdfCanvas(pdfDoc.addNewPage());
    ImageData image = ImageDataFactory.create(imgSrc);
    canvas.saveState();
    PdfExtGState state = new PdfExtGState();
    state.setFillOpacity(0.6f);
    canvas.setExtGState(state);
    canvas.addImage(image, 0, 0, pageSize.getWidth(), false);

    Вы можете сравнить результаты примеров выше и увидеть разницу.
    Мой пример написан на Java, но его легко изменить для C#.
    Ответ написан
    Комментировать
  • Как создать двухмерный штрихкод в виде векторного изображения?

    @iText_A
    Посмотрите пример BarcodePlacement. Здесь мы создаем три штрихкода PDF417:
    Image img = createBarcode(1, 1, pdfDoc);
    doc.add(new Paragraph(String.format("This barcode measures %s by %s user units",
        img.getImageScaledWidth(), img.getImageScaledHeight())));
    doc.add(img);
    img = createBarcode(3, 3, pdfDoc);
    doc.add(new Paragraph(String.format("This barcode measures %s by %s user units",
        img.getImageScaledWidth(), img.getImageScaledHeight())));
    doc.add(img);
    img = createBarcode(3, 1, pdfDoc);
    doc.add(new Paragraph(String.format("This barcode measures %s by %s user units",
        img.getImageScaledWidth(), img.getImageScaledHeight())));
    doc.add(img);

    Результат выглядит следующим образом:
    5d087aa1295b9835771594.png
    Штрихкоды
    Так выглядит один из штрихкодов внутри:
    5d087ac3eccf0509071833.png
    Векторные данные
    Я добавляю вид изнутри, чтобы показать, что двухмерный штрихкод не добавляется как растровое изображение (как в вашем примере). Это векторное изображение, состоящее из группы маленьких прямоугольников. Вы можете проверить это самостоятельно в файле barcode_placement.pdf
    ОбъектImageне должен вас запутать. Если вы посмотрите на метод createBarcode(), то увидите, что Image в действительности является векторным изображением:
    public Image createBarcode(float mw, float mh, PdfDocument pdfDoc) {
        BarcodePDF417 barcode = new BarcodePDF417();
        barcode.setCode("BarcodePDF417 barcode");
        return new Image(barcode.createFormXObject(Color.BLACK, pdfDoc)).scale(mw, mh);
    }

    Высота и ширина, которые передаются через метод scale(), определяют высоту и ширину маленьких прямоугольников. Во внутренней части штрихкода, можно увидеть следующее:
    0 21 3 1 re
    Это прямоугольник, у которого x = 0, y = 21, ширина — 3, а высота —1.

    Когда вы запрашиваете размер штрихкода, то получаете число необходимых прямоугольников. Размеры штрихкода будут рассчитываться следующим образом:
    Rectangle size = barcode.getBarcodeSize();
    float width = mw * size.getWidth();
    float height = mh * size.getHeight();

    Вы допускаете, что значение size (размер в единицах пользователя) верно, только если mw и mh равняются 1.

    Я использую значения для создания примера PdfFormXObject и переношу его в Image. Затем я могу добавить Image к документу, как и любое другое изображение. Основное отличие этого изображения от обычных заключается в том, что оно векторное.
    Ответ написан
    Комментировать
  • 4 модуля ОЗУ и процессор поддерживающий только 2 канала памяти?

    Zoominger
    @Zoominger
    System Integrator
    Заведутся. Каналы - это логическое понятие, со слотами связанное слабо.
    Ответ написан
    1 комментарий
  • Как сделать РУТ права на sony xperia XA (f3111)?

    NeiroNx
    @NeiroNx
    Программист
    Комментировать
  • Нужен ли класс в этом случае? Или можно держать функцию особняком?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Это проблема упрощения.
    Реальный код трудно понять, поскольку он учитывает множество нюансов, важных в реальной жизни.
    поэтому в обучающих материалах код упрощают, так что начинает казаться что без классов будет даже проще.

    Кроме того, авторы видеокурсов в большинстве своем - неграмотные имбецилы, которые с трудом понимают код, который пишут. Кроме шуток. Пример. Вот так пишут обезьяны:
    $i = 0;
        $newsList = array();
        while($row = $result->fetch()) {
          $newsList[$i]['id'] = $row['id'];
          $newsList[$i]['title'] = $row['title'];
          $newsList[$i]['date'] = $row['date'];
          $newsList[$i]['author_name'] = $row['author_name'];
          $newsList[$i]['short_content'] = $row['short_content'];
          $i++;
        }
        return $newsList;

    Реально, макаки.
    Этот гамадрил где-то сам увидел обучающий материал из 1990-х годов прошлого века, запомнил его, и теперь лепит уже в свои "обучающие ведидео".
    при том что если бы он понимал смысл этого кода, то написал бы просто
    $newsList = array();
        while($row = $result->fetch()) {
          $newsList[] = $row;
        }
        return $newsList;

    Поскольку $row уже содержит все нужные данные и переливать их из пустого в порожнее не нужно.
    А если бы наш бабуин хотя бы раз в жизни поинтересовался инструментами, которые он использует, то написал бы и вовсе одну строчку,

    return $result->fetchAll();

    Поскольку все уже написано до нас - надо только руку протянуть и использовать готовое.

    И это я не говорю о том, что класс насковозь дырявый в плане безопасности.

    Если вернуться к теме "отдельные функции или класс", то для примера приведенного здесь класс, действительно, не нужен. Любая коллекция статических методов может быть заменена на набор функций.

    В нормальной же модели класс нужен, поскольку в ней будут использоваться переменные класса, например соединение с БД. Таким образом его можно будет передать в конструктор один раз и не писать соединение в каждом методе.
    Также в модели удобно прописать имя таблицы. Тогда множество методов можно будет унаследовать от единого прототипа. например

    abstract class Model {
        protected $table;
        protected $db;
        public function __construct($db) {
             $this->db = $db;
        }
        public function find($id) {
            $sql = "SELECT * FROM `$this->table` WHERE id=?";
            $stmt = $this->db->prepare($sql);
            $stmt->execute([$id]);
            return $stmt->fetch();
        }
    }
    class News extends Model {
            protected $table = 'news';
    }
    $news = new News($db);
    $article = $news->find($id);


    Вот это уже будет минимальное оопэ, и использование класса будет более чем оправдано - один раз написали код, а потом его используем.

    Если хочется нормальных обучающих материалов, рекомендую канал Дмитрия Елисеева, https://www.youtube.com/user/ElisDN/videos
    Ответ написан
  • Как произвести правильный подсчет в тесте?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Такой код, где много if, else тестировать очень сложно и это сложно читаемо. Вынесите весь код логики в отдельные классы, с методами и тестируйте их. Например класс может быть класс QuestionPoint . В нем методы
    public function isAnswerExists($answers){}

    и тому подобные..

    Получится такой код, если совсем примитивно

    $question = 1;
    foreach ($questions as $key => $question) {
    $questionPoint = new  QuestionPoint($question);
    $questionPoint->isAnswerExists($question, $answer)
    }


    Поэтому делайте код по ООП или DDD и тогда будет вам счастье. В вашем случае будет гемор. Особенно если код в контроллере. Тестировать его будет крайне сложно и долго. Такие тесты запускать никому не захочется. Вам придется в тестах поднимать приложение и базу данных. Хотя в вашем случае это вообще лишнее!

    В общем выносите код из контроллера и избавляйтесь от лапши. Создавайте объекты.
    Ответ написан
    2 комментария
  • Где сейчас тусуются серьезные PHP программисты?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Завсит от цели, для чего это спрашивается.

    Если чтобы поприставать с нубскими вопросами - то нигде.
    Если чтобы почитать умных мыслей - РНР дайджест на Хабре прекрасно суммирует все, что было написано за две недели. У меня например никогда не хватает времени, чтобы прочесть всё. Куда больше-то - я уж и не знаю.
    Если чтобы поучаствовать в серьезном прокете - на гитхабе, выбирай любой.
    Если чтобы послушать интересные доклады и пообщаться вживую - то конференции.
    Если интересует внутренне устройство языка - то php internals.
    Если интересует, что пишут пхп селебрити про что угодно, кроме программирования - то твиттер (Расмус показывает картинки из аэропортов и роботов, которых собирает его сын, Сара постит котиков - и так далее).

    Где точно не тусуются:
    Тостер и всякие подобные ресурсы типа стаковерфлоя.
    Ну то есть специалиста можно найти, если поискать, но концентрация будет гомеопатическая, если учитывать количество восторженных щеночков, которые увидели язык вчера, и спешат срочно поделиться уже накопленным багажом знаний.
    Чаты. Телеграм, дискорд - вот это вот все.
    Самая адовая трата времени, которая в принципе бывает в жизни.
    Опять же, люди пишут о чем угодно, кроме программирования, и ради пары полезных строчек надо убить весь день.
    Ответ написан
    4 комментария
  • Как заменить разные слова на ссылки с помощью preg_replace?

    Melkij
    @Melkij
    PostgreSQL DBA
    Смотрите в код и думайте, что ваш код выполняет на самом деле. Смотрите отладчиком содержимое переменных либо банально распечатайте их.

    1) Вы сначала делаете match (не знаю зачем, ну да ладно, не о том вопрос).
    2) Затем обходите результаты.
    3) Затем игнорируете то что вы нашли и по всё той же регулярке что в пункте 1 заменяете всё в строке на певрое совпадение.

    Результат совершенно логичен. Исправьте логику, чтобы заменять в теле цикла только одно соответствующее совпадение.

    Через preg_replace это делать банально проще и удобнее, чем match + цикл по нему. А есть ещё preg_replace_callback если просто replace не хватает.
    Ответ написан
    1 комментарий
  • Какой PHP устанавливать себе локально для изучения? PHP-fpm или PHP?

    @neznae4ko
    Программирую, разрабатываю, печатаю, паяю и создаю
    Для изучения разницы нет. Для изучения подойдет классическая связка LAMP
    Ответ написан
    Комментировать
  • Почему не работает цикл в PHP?

    irishmann
    @irishmann
    Научись пользоваться дебаггером
    Ошибка с формами, радио кнопки у вас на одной форме, а отправляете файл вы совсем через другую спс. тов. Дмитрий
    code
    <form action="functions.php" method="post">
      A4 <input type="radio" name="ans" value="ans1">
      A3 <input type="radio" name="ans" value="ans2"  /><br />
    </form>
      
        <form method="post" enctype="multipart/form-data">
          <input type="file" name="file">
          <input type="submit" value="Datei herunterladen!">
        </form>



    Надо сделать так примерно
    code
    <form action="#" method="post" enctype="multipart/form-data">
                A4 <input required type="radio" name="ans" value="ans1">
                A3 <input type="radio" name="ans" value="ans2">
                <input type="file" name="file">
                <input type="submit" value="Загрузить">
            </form>


    Проверяете условие, а потом объявляете переменную, естественно у вас условие не выполняется.
    code
    if ($answer == "ans1") {
    $answer = $_POST['ans'];

    Надо сначала объявлять переменную, потом уж делать с ней что душе угодно. Но именно в данном случае в объявлении функции она не к месту. См. след. пункт.
    code
    $answer = $_POST['ans'];  	
    if ($answer == "ans1") {

    Как заметил Дмитрий так функции нельзя объявлять
    code
    if ($answer == "ans1") {
    $answer = $_POST['ans'];  	
         function make_upload($file){	
      // формируем уникальное имя картинки: случайное число и name
      $name = mt_rand(0, 10000) . $file['name'];
      copy($file['tmp_name'], 'Folder_A4_SW_EIN/' . $name); //ПАПКА ДОК
       return true;    
       }
    }else{
        function make_upload($file){	
      // формируем уникальное имя картинки: случайное число и name
      $name = mt_rand(0, 10000) . $file['name'];
      copy($file['tmp_name'], 'img7/' . $name); //ПАПКА, КУДИ ПАДАЮТЬ ДОКУМЕНТИ
      }      
    }


    Вынесите название в отдельный аргумент
    code
    function make_upload($file, $folder)
    {    
        // формируем путь + уникальное имя картинки
        $name = $folder . DIRECTORY_SEPARATOR . uniqid(true) . $file['name'];
        copy($file['tmp_name'], $name);
        return true;    
    }
    UPD: рабочий г-но код
    <?php
        include_once('functions.php')
    ?>
    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title>Загрузить изображения на сервер</title>
        </head>
        <body>
            <form action="#" method="post" enctype="multipart/form-data">
                A4 <input required type="radio" name="ans" value="ans1">
                A3 <input type="radio" name="ans" value="ans2">
                <input type="file" name="file">
                <input type="submit" value="Загрузить">
            </form>
            <?php
            // если была произведена отправка формы
                if(isset($_FILES['file']))
                {
                    // проверяем, можно ли загружать изображение
                    $check = can_upload($_FILES['file']);
    
                    if($check === true)
                    {
                        $folder = $_POST['ans'] == 'ans1' ? 'Folder_A4_SW_EIN' : 'img7';
                        make_upload($_FILES['file'], $folder); // загружаем изображение на сервер
                        echo "<strong>Файл был успешно загружен!</strong>";
                    }
                    else
                    {
                        // выводим сообщение об ошибке
                        echo "<strong>$check</strong>";  
                    }
                }
            ?>
        </body>
    </html>

    <?php
        function can_upload($file)
        {
            // если имя пустое, значит файл не выбран
            if($file['name'] == '')
            return 'Вы не выбрали файл.';
    
            /* если размер файла 0, значит его не пропустили настройки 
            сервера из-за того, что он слишком большой */
            if($file['size'] == 0)
            return 'Файл слишком большой.';
    
            // разбиваем имя файла по точке и получаем массив
            $getMime = explode('.', $file['name']);
            
            // нас интересует последний элемент массива - расширение
            $mime = strtolower(end($getMime));
            
            // объявим массив допустимых расширений
            $types = array('jpg', 'png', 'gif', 'bmp', 'jpeg', 'pdf', 'ppt', 'ods', 'dotx', 'docx', 'doc');
    
            // если расширение не входит в список допустимых - return
            if(!in_array($mime, $types))
            return 'Недопустимый тип файла.';
    
            return true;
        }
    
        function make_upload($file, $folder)
        {    
            // формируем путь + уникальное имя картинки
            $name = $folder . DIRECTORY_SEPARATOR . uniqid(true) . $file['name'];
            copy($file['tmp_name'], $name);
            return true;    
        }

    Ответ написан
    3 комментария
  • Почему может зависать компьютер?

    mrsexy
    @mrsexy
    Senior Pomidor
    Больше похоже на отвал графического процессора. Вы используете встроенное графическое ядро для вывода или видеокарту? В любом случае проблема кроется там. Если используете дискретку, отключите в биосе видео ядро. И проверьте ещё раз. Или наоборот отключите дискретку и подключитесь через материнку.
    Ответ написан
  • Как сделать поиск и вставку файлов через условно {{}}?

    @IS-Builder
    ~ PHP-8 & REGEXP - This is a really powerful kit ~
    $str = 'Исходный текст и {{}}.';
    $dir = 'blog\flowers.txt';
    $str = preg_replace_callback(
        '~{{\K(?=}})~',
        function()use($dir){
            return file_get_contents($dir);
        },
        $str
    );
    
    echo $str;

    Но для подобных замен есть более подходящие инструменты:
    $str = 'Исходный текст и {{}}.';
    $dir = 'blog\flowers.txt';
    $str = str_replace('{{}}', '{{'. file_get_contents($dir) . '}}', $str);
    
    echo $str;
    Ответ написан
    1 комментарий
  • Можно ли получить внутреннее значение PHP массива сохраненного в MySQL с помощью serialize() не доставая весь массив?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Вопрос из серии: стреляю себе в ногу, больно, как стрелять себе в ногу, но что бы не больно?

    Нормализируйте БД и не пользуйтесь serialize для вставки. Вот эти 200 элементов мне почему-то так кажется, отлично бы лежали в отдельных строках отдельной таблицы.
    Ответ написан
    Комментировать