Задать вопрос
  • Как роботам показывать оригинал страницы, а пользователей отправлять редиректом на другой адрес?

    ky0
    @ky0 Куратор тега Системное администрирование
    Миллиардер, филантроп, патологический лгун
    Смотрите в заголовок юзер-агента и в зависимости от увиденного редиректите, либо нет. Но:

    1. Поисковики не очень любят, когда ботам и живым людям отдаётся разное.
    2. Многие краулеры в юзер-агенте обманывают.

    В целом, это можно сделать и без РНР, с помощью одного веб-сервера.
    Ответ написан
    Комментировать
  • Как роботам показывать оригинал страницы, а пользователей отправлять редиректом на другой адрес?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Вы хотели сказать "чтобы весь сайт гарантированно вылетел из поиска"?
    Да, это надёжный способ
    Ответ написан
    Комментировать
  • Как сделать сообщение 'Неправильный ключ" при входе в форме. PHP?

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

    Надо сначала научиться работать с БД правильно

    <?php 
    
    session_start();
    require_once 'connect.php';
    
    $key = $_POST["key"];
    
    $stmt = $connect->prepare("SELECT * FROM `keys` WHERE `key` = ?");
    $stmt->bind_param("s", $key);
    $stmt->execute();
    $result = $stmt->get_result();
    $user = $result->fetch_assoc();
    if ($user) {
        $_SESSION['key'] = $user;
        header('Location: ../profile.php');
        exit;
    } else {
        $_SESSION['msg'] ='Неправильный ключ';
        header('Location: ../index.php');
        exit;
    }

    И потом в индексе вывести $_SESSION['msg'] как угодно и удалить
    Ответ написан
    6 комментариев
  • Где можно найти подробную информацию про шаблонизацию/шаблонизаторы php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    В гугле. Всё есть в гугле.
    Перед тем как интересоваться шаблонизаторами, надо научиться пользоваться интернетом.
    Искать информацию, анализировать информацию, усваивать информацию.
    Учиться формулировать вопросы. Как для поисковика, так и на форум.

    В таком общем виде вопросы задают в гугль.
    А на форум пишут уже конкретные вопросы, если что-то непонятно.
    Ответ написан
    Комментировать
  • Как изменить определенные строки по 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
    16 лет пилю все эти штуки
    В идеале - да, по факту - оно того чаще всего не стоит, ниже объясню почему.
    * Вообще, если у вас такой вопрос возникает, то вам оно, скорее всего, не нужно.

    Основных целей две:
    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
    А вот сравнивать значения можно только тогда, когда старшие разряды идут впереди младших. В частности, строки, содержащие дату, можно сравнивать и сортировать только в формате "задом наперёд". Что делает её очень удобной. Например при именовании папочек с фоточками на домашнем компе

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