• Как изменить определенные строки по id в mysql?

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    ... вот ты прямо так на английском и пиши
    где = WHERE
    поле id = id
    от 1 до 10 000 = >=1 AND id <= 10000

    Теперь собирай всё вместе:
    WHERE id >=1 AND id <= 10000

    А теперь добавляй это условие к своему запросу:
    UPDATE table SET field=field*2 WHERE id >=1 AND id <= 10000
    Ответ написан
    4 комментария
  • Как исправить ошибку "PHP Startup: Unable to load dynamic library"?

    @sw26
    Проблема была в том, что в файле php.ini были кривые пути.
    Начиналось все с диска W, причем у меня его вообще нет. я поменял все w:\ и w:/ (нужно посмотреть, какой диск у Вас) на правильный путь. все заработало 100% (перезапустить консоль нужно).
    Понимаю, что автору мой комментарий не нужен уже, но вдруг кто-то это увидит и кому-то это поможет.
    Ответ написан
    Комментировать
  • Как битые jpg заменить годным файлом?

    karabanov
    @karabanov
    Системный администратор
    find /path/to/bad/files/dir -iname "*.jpg" -exec cp -v /path/to/good.jpg {} \;
    Ответ написан
    6 комментариев
  • Как отправить с помощью mailer письмо, с нужной мне почты?

    jamessvetsky
    @jamessvetsky
    Специалист по почтам и рассылкам
    Насколько я вижу, mail1 не проходит авторизацию, скорее всего надо либо в настройках включить портальный пароль (это они так обычный назвали) либо использовать пароли приложений
    6227aa4a31f74817391392.jpeg

    Но вообще очень плохой вариант. С одной стороны яндекс может блочить отправку через свой SMTP, подробнее писал в этой статейке
    https://7fk.ru/nastroyka-smtp/
    С другой стороны отправка через mail1 с полем from mail2 будет всеми почтовиками восприниматься как спуффинг и письма далеко не везде попадут даже в папку спам
    Ответ написан
    2 комментария
  • Как можно экспортировать базу данных MySQL Workbench так, чтобы любой компьютер, который я зайду, при запуске моего приложения смог читать мо бд?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Чтобы приложение получало доступ к базе на том компьютере, на котором запущено (localhost, 127.0.0.1), кто-то должен установить на этом компьютере сервер MySQL и создать в нём нужную базу данных.
    Именно поэтому как локальную однопользовательскую чаще всего используют базу SQLite. Она не требует сервера и для переноса достаточно скопировать один файл с данными базы.
    Если же вам надо, чтобы все пользователи работали с одной общей базой, то подключаться надо не по 127.0.0.1, а по IP, который доступен для всех компьютеров, работающих с базой.
    Ответ написан
    1 комментарий
  • Где разместить сайт?

    @Akela_wolf
    Extreme Programmer
    Учитывая что Vue - это клиентское приложение, не вижу смысла выделять для него отдельный хостинг.

    Встраивайте внутрь вашего приложения и размещайте все там же, на Laravel Forge
    Ответ написан
    Комментировать
  • SUM столбца чисел с запятой?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Если данные должны суммироваться, то никакой запятой в них быть не должно. Десятичный разделитель для данных в mysql - ТОЧКА.
    И числовые данные надо хранить в предназначенных для этого типах полей.
    Со списком можно ознакомиться в документации: https://dev.mysql.com/doc/refman/8.0/en/numeric-ty... и выбрать наиболее подходящий. Это может быть либо тип с фиксированной точкой (DECIMAL), либо с плавающей (FLOAT).
    Ответ написан
    9 комментариев
  • Как провести соответствие между строкой и классом с точки зрения SOLID?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Это всё очень плохо.
    В первом варианте человек должен знать, как мяукают кошки, а в последнем "правильном" варианте человек трогает не кошку, а кошачий голос(?!).
    В "идеальном" варианте опять же выбирается не животное, которое надо погладить, а его голос.

    Чтобы следовать принципам солид, надо понять в первую очередь ЗАЧЕМ это всё делается.
    А делается это для того чтобы уменьшить связность. Чтобы класс, использующий какой-либо функционал, не знал деталей его реализации. И, соответственно, мы могли бы менять реализацию без опасения поломать что-то в классе-пользователе.

    При этом extends, кроме как от абстрактного класса, эту связность всегда увеличивает.
    И его надо избегать. А использовать принцип Composition over inheritance. То есть нужный функционал получать не наследованием, а передачей независимых функциональных модулей в виде параметров.

    Соответственно, нам надо сделать иерархию: голос - животное - потрогать.
    И вот теперь у нас хоть голос, хоть животное, будут открыты для каких угодно изменений, до тех пор пока они поддерживают публичный контракт.
    / ******* голоса *******/
    abstract class VoiceEngine {
    	public function getVoice() {}
    }
    class CatVoiceEngine extends VoiceEngine {
    	public function getVoice() {
    		return "Meow!";
    	}
    }
    class DogVoiceEngine extends VoiceEngine {
    	public function getVoice() {
    		return "Bark!";
    	}
    }
    class HumanVoiceEngine extends VoiceEngine {
    	public function getVoice() {
    		return "Да пошёл ты!";
    	}
    }
    / ******* животные *******/
    abstract class Animal {
    	public function __construct(public VoiceEngine $voiceEngine) {}
    	public function say() {
    		echo $this->voiceEngine->getVoice();
    	}
    }
    class Cat extends Animal{}
    class Dog extends Animal{}
    class Human extends Animal{
    	public function touchAnimal(Animal $animal) {
    		$animal->say();
    	}
    }
    / ******* исполнение *******/
    $cat = new Cat(new CatVoiceEngine());
    $dog = new Dog(new DogVoiceEngine());
    $human = new Human(new HumanVoiceEngine());
    $human->touchAnimal($cat);
    $human->touchAnimal($dog);
    $human->touchAnimal($human);


    После того как я, раздуваясь от гордости, написал этот ответ, до меня вдруг дошло что на вопрос-то я так и не ответил.
    Соответственно, задачу выбора животного возлагаем на отдельную сущность:

    class AnimalFactory {
        public static function create($type) {
            return match($type) {
                'cat' => new Cat(new CatVoiceEngine()),
                'dog' => new Dog(new DogVoiceEngine()),
                'human' => new Human(new HumanVoiceEngine()),
            };
        }
    }
    $human = new Human(new HumanVoiceEngine());
    $human->touchAnimal(AnimalFactory::create('cat'));

    В итоге мы вернулись к тому же кейсу (match - это улучшенный case), но при этом у нас всё разделено, и каждый класс занимается строго своим делом.
    Ответ написан
  • Filesize возвращает 0 или false или пустоту от файлов больше 60 мегабайта, но мне нужно проверить: больше ли файл гигабайта. Как такое решить?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Проверьте лимиты на объём принимаемого файла (upload_max_filesize) и объём запроса (post_max_size) в настройках PHP.
    Ответ написан
    2 комментария
  • Как вместо цифры брать id из переменной?

    Adamos
    @Adamos
    Откладываем баланс, пока рано.
    Читаем уроки, в названии которых есть слово "Авторизация".
    Ответ написан
    Комментировать
  • Могу ли я заниматься коммерческой разработкой (backend с php) на Windows 10?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Очередной дурацкий вопрос.
    И дело даже не в том что линукс действительно на первых порах не нужен.

    Ну нет бы хоть кто-то спросил, "я вот учу это, это и это, а еще хочу вон то и то, а что ещё посоветуете?"
    Нет - все желающие вайти стройными рядами маршируют на тостер за разрешением, "а можно я не буду учить это, это и это?"
    Ну что ж вы за народ-то такой?
    Учить еще не начал, а уже боится - как бы не перетрудиться.

    Что - уже все основы выучил? Теперь на перепутье стоишь, уже идти устраиваться или линукс мучать? Какой там линукс? Базовые операторы, основы БД, отладку, обработку ошибок, разделение кода и представления, основы НТТР, основы безопасности уже выучил? Нет? Ну так надо садиться и учить то что и на винде прекрасно учится. И задавать вопросы если что-то непонятно. Для этого тостер придуман.
    А не ковырять в носу мечтательно, "все у нас хорошо, только линукса не хватает!".

    Надо меньше мечтать и больше работать. И задавать вопросы по ходу дела. Тогда станешь программистом.
    А с таким подходом дальше дивана не продвинешься.
    Ответ написан
    11 комментариев
  • Надо ли все детали дизайна сайта заключать в автолэйауты?

    SeaInside
    @SeaInside
    15 лет пилю все эти штуки
    В идеале - да, по факту - оно того чаще всего не стоит, ниже объясню почему.
    * Вообще, если у вас такой вопрос возникает, то вам оно, скорее всего, не нужно.

    Основных целей две:
    1. Автоматическое перестраивание макета в случае использования компонентов
      Вот есть у вас традиционная, любимая дизайнерская сущность "карточка".
      Она вынесена в компонент и используется на N страницах примерно N * 50 раз.
      Приходит клиент и говорит: хочу в карточку добавить внизу большую красную кнопку.
      Вы добавляете кнопку в компонент.
      Если и сам компонент, и все родители, где он используется, сделаны с помощью автолейаутов - на этом ваша работа заканчивается, все страницы выглядят как надо.

      Если автолейаутов нет, добро пожаловать либо в "руками передвинуть все экземпляры на всех страницах" (что нудно, скучно, а если клиент завтра передумает, то вообще лол), либо в "ну я вот тут на странице "Карточка v2" показал, как должно быть", что спустя какое-то время ведёт к бардаку на проекте, в котором невозможно найти концов.
    2. Больше уверенности в том, что всё стоит ровненько
      Что выливается в то, что верстальщику над макетом работать приятнее - он видит автолейаут и он сразу уверен, что отступ между всеми элементами одинаковый.
      Скорее всего, получится сделать `pixel-perfect`, если заказчику это будет важно. А без автолейаутов у вас может быть ситуация, когда между одинаковыми элементами разный отступ.
      * Необязательно будет - можно быть внимательным, но дополнительная уверенность - это хорошо для всех. Технология страхует от ошибок.

    Теперь о том, почему не стоит.
    • Для того, чтобы автолейауты помогали процессу, а не мешали - у вас ещё до начала работы должно быть полное представление о том, что вы хотите в итоге получить.
      Если вы находитесь в процессе творческого поиска - рисуйте как рисуется. Как только кажется, что всё выглядит хорошо - подумайте над лейаутами.
    • Когда нужно задизайнить сложный, составной компонент с разными вариантами - его реально нужно проектировать, по субъективным ощущениям это гораздо ближе к вёрстке, чем к дизайну - а это вообще другая профессия, и думать там надо по-другому.
      У меня, когда доводится рисовать, компоненты структурно получаются практически такие же, как они и на вёрстке потом будут - и это замечательно в долгосрочной перспективе - бардака меньше.
      Но я - в первую очередь технический специалист, а дизайнер не думает (и не должен думать) как верстальщик, и сделает немного не то и немного не так. Со стороны будет выглядеть чаще всего как "создал себе проблем на ровном месте".
      Кроме того, у этого есть минусы: компонент становится сложнее (порой - прям ощутимо), чем если просто внутри фрейма мышкой расставлять элементы. Это влияет на то, насколько легко другому человеку разобраться, что происходит и внести свои изменения.
    • В фигме нет (пока нет) абсолютного позиционирования. Пока в ходу хак с фреймом ширины/высоты 0/0 - но это именно что хак, это увеличивает сложность и разработки, и поддержки. Сложные компоненты без этого не заворачиваются в автолейауты никак.
    • Не очень опытных дизайнеров автолейауты серьёзно ограничивают в творчестве - дизайн получается... Ну, квадратный, что ли.
    • Не все вещи возможно реализовать на автолейаутах


    Во всём нужна мера. Должно быть удобно, быстро, надёжно и понятно команде.
    А где эта мера - ну каждый ведь для себя решит, верно? :)
    Ответ написан
    3 комментария
  • В чем ошибка моего кода?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Самое время познакомиться с темной стороной программирования.
    Начинающие вайтишники искренне думают, что программист - это типа такой художник. Берет мольберт, поллитру, кисти и начинает ВАЯТЬ. Потом отходит на шаг, любуется делом рук своих, и снова. Ваять. А потом сразу заказчику, за большие деньги.

    Так вот, в реальности это всё не так.
    Большую часть времени программист не пишет код.
    А пытается разобраться, почему он не работает.

    Так что мы будем сейчас учиться это делать.
    Тем более, что это в принципе несложно.
    Главное не думать, что чем-то поможет сидеть и тупить в свой кодик. И приглашать других людей потупить в него тоже бессмысленно. Потому что причина может быть совсем не в нем. но даже если проблема и в коде, то искать её всё равно надо по-другому.
    В код не надо тупить. Его надо ЗАПУСКАТЬ.
    И выводить промежуточные результаты. Проверять его работу.
    Заранее выяснить, какие должны быть значения у переменных, и проверять их на каждом этапе.
    Где не совпадут - там и проблема.
    В идеале IDE сама покажет содержание всех переменных при трассировке, но если пишешь код в блокнотике, то даже тупо писать var_dump($bar1,$var2,$var3...); и смотреть что там лежит.
    Условия проверять еще проще, тупо echo 'зашли в условие if (!empty($user))';
    И если лежит не то, или эхо не выводится - вот тогда уже смотреть в код и думать, почему так получилось.

    В частности, при авторизации надо проверить две вещи:
    1. Находится ли юзер по логину
    2. если находится, то проверить корректность хэша. Для этого при регистрации надо вывести полученный через password_hash пароль и записать на бумажке
    потом запросить сохраненный из БД и сравнить

    Кроме того
    Разумеется, отладка невозможна без сообщений об ошибках.
    В половине случаев РНР человеческим голосом сообщает в чем проблема.
    Поэтому всегда, в любом окружении должно стоять error_reporting(E_ALL);
    плюс на домашнем компике полезно прописать ini_set('display_errors', 1); чтобы сразу видеть ошибки на экране.
    На боевом сервере разумеется поставить 0 вместо 1, и добавить ini_set('log_errors', 1);

    У меня только один вопрос.
    Какой смысл вообще делать парольную защиту, если любой придурок сможет спокойно авторизоваться через SQL инъекцию?
    Ответ написан
    9 комментариев
  • Как словить и прочитать http запрос?

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

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Записывать дату в РНР можно практически в любом формате. Хоть 12/12/12
    А вот сравнивать значения можно только тогда, когда старшие разряды идут впереди младших. В частности, строки, содержащие дату, можно сравнивать и сортировать только в формате "задом наперёд". Что делает её очень удобной. Например при именовании папочек с фоточками на домашнем компе

    Ну и как правильно отмечено выше, здесь ничего не записывается, а просто выводится. То есть вопрос к тому, кто выводит.
    Ответ написан
    Комментировать
  • Как переписать подключение к базе данных, по принципам ООП?

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

    ООП - это не картина, которую купил и на стенку повесил, для красоты.
    Это инструмент для решения какой-либо задачи.
    Если задачи нет, то и ООП применять не следует.

    в данном случае перед ООП надо выучить куда более базовые вещи.
    Например научиться применять готовые классы, такие как mysqli
    узнать почему за использование @ программистам в аду льют кипяток на самые нежные части тела
    выучить что exit('Ошибка подключения'); - это говнокод
    ну и открыть для себя разделение логики работы с данными и логики отображения. То есть сначала получить все данные, а потом только выводить.

    Эту страницу можно переписать в соответствии с принципами аккуратного кода

    Сначала сделать файл config.php.
    Этот файл можно будет исключить из системы контроля версий и таким образом иметь на каждом сервере свой

    <?php
    return [
        'db' => [
            'host' => '127.0.0.1',
            'port' => 3306,
            'db'   => 'pizza',
            'user' => 'root',
            'pass' => '',
            'charset' => 'utf8mb4',
        ]
    ];

    потом сделать файл mysqli.php
    Этот файл можно будет включать во все скрипты, которым нужно соединение с БД
    <?php
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $db = new mysqli(
        $config['db']['host'], 
        $config['db']['user'], 
        $config['db']['pass'], 
        $config['db']['db'], 
        $config['db']['port']
    );
    $db->set_charset($config['db']['charset']);
    $db->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1);


    Потом сделать страницу pizza.tpl.php в которую поместить весь HTML
    .
                <select id="single" class="form-control" name = '1234' >
                    <option value="" disabled selected style='display:none;'>выберите тип</option>
                    <?php foreach($types as $object): ?>
                        <option value ="<?=$object['id']?>"><?=$object['name']?></option>
                     <?php endforeach ?>
                </select>


    И потом сделать страницу pizza.php на которой собрать это всё вместе
    <?php
    $config = require 'config.php';
    require 'mysqli.php';
    
    $sql="SELECT * FROM pizza";
    $types=$db->query($sql)->fetch_all(MYSQLI_ASSOC);
    
    include 'pizza.tpl.php';


    После этого можно будет потихоньку приглядываться к ООП.
    Например сделать класс pizzaModel
    Но делать его будет иметь смысл только тогда, когда мы будем знать, какие еще действия с пиццей будет производить этот код
    Ответ написан
    5 комментариев
  • Пагинация через Rest API?

    AlexNest
    @AlexNest
    Работаю с Python/Django
    Пробовал писать подобные функции, но url никак не меняется.

    А как они поменяются, если они захардкожены (т.е. 'https://reqres.in/api/users?page=1' всегда будет отправлять на первую страницу. Нужно формировать ссылку динамически: например
    function fetch_data(page) { // Номер страницы
    	const getProducts = async () => {
    		const obj = await fetch('https://reqres.in/api/users?page=' + page); //
    		const result = await obj.json();
    
    	}
    }
    fetch_data(1);
    fetch_data(2);
    fetch_data(315);
    Ответ написан
    Комментировать
  • Как на PHP по формату даты 00.00.0000 вывести текстом, типа "second saturday of february"?

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

    Это же все смехотворные задачи, каждая из которых решается за 30 секунд

    Ох, я забыл про last. Может быть, это и является арифметическим камнем преткновения? ;-)
    Ответ написан
    Комментировать
  • Нужно ли изучать PUG и насколько он эффективен?

    DevMan
    @DevMan
    нет ничего НУЖНОГО.
    есть только то, что РЕШАЕТ поставленные задачи.

    он тебе помогает? нужен!
    я спокойно обхожусь без него.

    сейчас мало кто обходится голой вёрсткой: или spa, или server-side.
    и там и там есть свои шаблонизаторы. корячить туда паг конечно можно, но, имхо, не уперлось.

    хотя может дать незначительный профит для прототипов. хотя и для них уже есть куча инструментов.
    Ответ написан
    Комментировать
  • Почему WHERE не работает с диапазоном дат php?

    roswell
    @roswell
    и швец, и жнец, и на дуде игрец
    Следовало бы представить в запросе отметки дат как строковые данные, а не как литералы: 1))=>'2022-01-07', иначе они выродятся в целое число.
    Ответ написан
    4 комментария