• Какое Api для Pet проекта с авторизацией можно использовать?

    LittleBob
    @LittleBob
    Я думаю, вам идеально подойдёт Firebase. Удобный и достаточно простой инструмент, а позволяет многое (Авторизация, база данных и ещё куча всего). Для индивидуального проекта бесплатного плана хватит за глаза
    Ответ написан
    Комментировать
  • Как уменьшить количество таблиц-справочников с тремя-четырьмя строками?

    @rPman
    тут несколько подходов, я трогал каждый из них и все они имеют право на существования
    1. оставь как есть, я рекомендую, пусть будет 100500 таблиц справочников (если проблем с именами нет ну и отлично), fk-индексы все это свяжут а инструменты анализа базы данных помогут с этим работать (автоматические query builder с мышевозекательным интерфейсом) и база будет сама следить за тем что идентификаторы справочников не противоречивы
    недостатков я не могу придумать, кроме может быть сильно разросшейся структуры, когда то давно я слышал что некоторые базы данных при увеличении количества таблиц начинают хуже работать но как я понимаю это если их будет десятки тысяч а не десятки и сотни.. может быть резервное копирование такой базы или ее репликация будет проходить чуть медленнее или еще хуже, организационно репликация может быть настроена на не рассылку ddl модификаций, в этом случае создание нового справочника будет задавать работу еще и админам, что нежелательно.

    2. противоположный, использование одной таблицы key-value для нескольких разнородных справочников (id, value, table_name), в 99% случаев можно использовать один сиквенс (одну последовательность идентификаторов), вам же не обязательно чтобы разные справочники начинали счет своих строк с одного и того же числа 1.
    Недостаток - база данных теперь не сможет контролировать что вы используете непротиворечивый идентификатор (можно в запись одного справочника указать номер из другого), хотя несуществующий так же нельзя будет указать (и будут работать delete cascade), так же удобной автогенерации sql не будет. Структура будет проще, так же интерфейс редактирования таких справочников может быть один вместо кучи форм и добавлять новые справочники будет сильно проще (хотя с точки зрения разработки нет особой разницы, один insert ты написал или create table перед этим)

    3. не хранить справочники в базе данных вообще, т.е. за значение справочников отвечает бакэнд (хранятся в статичных файлах или в коде) самый дибильный подход, редактировать такие справочники скорее всего только руками в конфигах/исходниках. Недостатки - база данных совсем не будет знать ничего о значениях и не сможет ни проконтролировать ни помочь с запросами
    Но это позволит снять немного нагрузки с базы данных, сделает структуру проще и позволит перенести управление значениями справочников на откуп ide редактора (если хранить значения справочников в коде, можно дать значениям имена переменных, так как в коде часто их так или иначе заводить придется)

    Лично я третьим подходом в чистом виде не пользовался, но у меня был набор скриптов, которые из справочников в базе данных формировали код с инициализацией констант и их именами для приложения (сами справочники приложением редактироваться не могли) и был соблазн перевести эту часть базы из 'оперативной' в 'для разработчика', так как справочник это что то - отвечающее за отображение информации, но не за бизнеспроцессы (ну примерно как языковые файлы для приложения, не хранить же переводы строк интерфейса тоже в базе, ну так и справочники смогут работать как часть этого интерйфейса и тоже может требовать перевода).
    Ответ написан
    4 комментария
  • Как генерировать красивый PDF с помощью PHP?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Самый правильный путь генерация не на основе html а с нуля
    Посмотрите сюда https://habr.com/ru/post/31438/

    upd https://stackoverflow.com/questions/7364/edit-pdf-...

    Для вас есть 2 пути :
    Создать шаблон pdf загрузить его и четко по месту разместить текст
    Второй вариант это с 0 сформировать весь репорт.

    В любом случае рабочий процесс следующий: дизайнер отрисовывает макет, а вы вычисляете размеры плейсхолдеров и заполняете их в коде.
    Ответ написан
    8 комментариев
  • Почему неправильно работает сравнение?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Вопрос
    Сколько строк вернёт база данных, если в запрос передать несуществующий логин?

    Дополнительный вопрос
    Какой смысл вообще городить авторизацию, если любой придурок авторизуется без всякого пароля, через SQL инъекцию?

    Подробнее про вопрос секьюрности этого куска:
    Если переменная подставляется напрямую в запрос, то это значит что в нее можно дописать SQL, который будет делать совсем не то, что ожидалось.
    Например, если вместо имени пользователя написать что-то вроде имя' AND LEFT(password, 1) = 'a
    то тогда код напишет "Лоигн занят" если первая буква пароля - "а". Пара десятков таких запросов - и первую букву мы уже угадали. Тем же способом же достаём остальные и вот мы получили пароль любого клиента.

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

    Здесь надо делать так

    $input = json_decode(file_get_contents("php://input"), true);
    
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $link = mysqli_connect(*информация БД*);
    $link->set_charset("utf8mb4");
    
    $stmt = $link->prepare( "SELECT login FROM sn_users WHERE login=?");
    $stmt->bind_param("s", $login);
    $stmt->execute();
    $result = $stmt->get_result();
    $row = $result->fetch_assoc();
    if ($row) {
        echo "Лоигн занят";
    } else {
        echo "Лоигн свободен";
    }
    Ответ написан
    7 комментариев
  • Как правильно связать php сайт с mysql?

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

    Чтобы соединить сайт с mysql, в РНР вообще-то есть два API - mysqli и PDO. Несколько лет назад с mysqli вообще невозможно было нормально работать, но на данный момент они выровнялись, хотя PDO все равно удобнее, по трем причинам
    1. Единый интерфейс при работе с различными СУБД (неактуально, если mysql для нас является синонимом слова база данных)
    2. Набор функций-хелперов для получения данных из БД в различных форматах (при желании легко воспроизводится вручную)
    3. Именованные плейсхолдеры (для некоторых это главная причина использовать PDO)

    Но в целом, как я говорил выше, сейчас можно использовать любое API. Главное - не использовать тот древний говнокод, который приведён в вопросе.

    1. Создаём файл`config.sample.php` куда кладем все настройки приложения, в том числе базы данных
    return [
    	'db' => [
    		'host' => '127.0.0.1',
    		'username' => '',
    		'password' => '',
    		'dbname' => '',
    		'port' => 3306,
    		'charset' => 'utf8mb4',
    	],
    ];

    2. В файле, который включается во все скрипты сайта, добавляем код
    if (!file_exists('config.php'))
    {
    	throw new \Exception('Create config.php based on config.sample.php');
    }
    $config = require 'config.php';

    3. И дальше в этом же файле пишем собственно нормальный код подключения к БД
    либо к mysqli
    // включаем режим информирования об ошибках
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    // подключаемся к серверу
    $dbc = $config['db'];
    $db = new \mysqli($dbc['host'], $dbc['username'], $dbc['password'], $dbc['dbname'], $dbc['port']);
    // не забываем установить кодировку, чтобы не было ошибок с кракозябрами
    $db->set_charset($dbc['charset']);

    либо к PDO
    $options = [
        \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION,
        \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
        \PDO::ATTR_EMULATE_PREPARES   => false,
    ];
    $dbc = $config['db'];
    $dsn = "mysql:host=$dbc[host];dbname=$dbc[dbname];charset=$dbc[charset];port=$dbc[port]";
    $pdo = new \PDO($dsn, $dbc['username'], $dbc['password'], $options);

    После того как будет освоена работа с системой контроля версий (а по-хорошему это надо было сделать уже давно) добавляем config.php в файл .gitignore
    Таким образом на каждом хосте, где исполняется этот код, будет собственный файл с настройками, создаваемый по образцу из config.sample.php

    Да, и Очень Важное Дополнение:
    почему нельзя сделать 1 соединение для сайта и не тратить каждый раз время на коннект к БД?

    Никогда не следует переживать по поводу воображаемых проблем. Вот только когда создание коннекта каждый раз станет реальной проблемой, только тогда и начинать переживать по этому поводу и искать пути решения (спойлер: никогда).
    Ответ написан
    14 комментариев
  • Как сделать задачу одним запросом в MySQL?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    MySQL 8.0 и выше
    WITH RECURSIVE `cte` (`date`) AS (
      SELECT :from_date
      UNION
      SELECT `date` + INTERVAL 1 DAY
        FROM `cte`
        WHERE `date` < :to_date
    )
    SELECT `cte`.`date`,
           IFNULL(`s`.`count`, 0) AS `joined_count`,
           IFNULL(`u`.`count`, 0) AS `left_count`
      FROM `cte`
      LEFT JOIN (
        SELECT `joined_date`, COUNT(*) AS `count`
          FROM `table`
          WHERE `joined_date` BETWEEN :from_date AND :to_date
          GROUP BY `joined_date`
      ) AS `s` ON `s`.`joined_date` = `cte`.`date`
      LEFT JOIN (
        SELECT `left_date`, COUNT(*) AS `count`
          FROM `table`
          WHERE `left_date` BETWEEN :from_date AND :to_date
          GROUP BY `left_date`
      ) AS `u` ON `u`.`left_date` = `cte`.`date`
    Ответ написан
    Комментировать
  • Изучаю java 3 й месяц, прошу помочь советом куда двигаться и можно ли начать искать стажировки или пока рано?

    @AndrewRusinas
    Это частый вопрос, а ответ один и тот же вне зависимости от языка/стека:
    Просто начни проходить собесы. Узнаешь о том, какие у тебя слабые места и что по факту требуется работодателям, на десятый собес уже сможешь получить какой-никакой оффер.
    Ответ написан
    Комментировать
  • Как подключить Oracle Database к Go?

    @evgensoft
    Необходимо в блок import добавить подключение конкретного драйвера, например -
    _ "gopkg.in/goracle.v2"

    Открытие подключения примерно так -
    db, err := sql.Open("goracle", "user/pass@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=tcp)(HOST=hostname)(PORT=port)))(CONNECT_DATA=(SERVICE_NAME=sn)))")
    Ответ написан
    Комментировать
  • Как убрать readonly в Postgresql?

    Melkij
    @Melkij
    PostgreSQL DBA
    Postgresql вам редактировать и не препятствует. Раз вы смогли сделать create table - значит база не в read only режиме. Напишите соответствующий update и выполните.

    А вот вашему GUI клиенту скорей всего не нравится отсутствие primary key.
    Ответ написан
    Комментировать
  • Если я зайду на вредоносный сайт, могут ли с моего iPhone украсть фото и видео( я не ввожу никаких паролей и Логинов)?

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

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

    А если просто из головы выдумывать какие-то нелепые фантазии вместо кода, то они работать-то не будут

    Про то, как выполнять SQL запросы из РНР, можно посмотреть в этом ответе
    Но сначала надо понять, какой именно запрос мы хотим выполнить. А с этим тут тоже проблемы.
    Ответ написан
  • При попытке записать апостроф в SQL выдает ошибку? Как это исправить?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Учить РНР надо не по написанным нубами при царе Горохе руководствам, а по нормальным учебникам.
    Или хотя бы по нормальным ответам на тостере.
    https://qna.habr.com/q/918033#answer_1847841

    Никакого $data в запросе быть не должно. Любые переменные должны отправляться в БД отдельно
    Для этого надо
    Заменить все переменные в запросе на специальные маркеры, которые называются плейсхолдеры или параметры, а по сути - просто знаки вопроса
    Подготовить запрос к исполнению с помощью функции prepare(). Эта функция принимает строку запроса и возвращает экземпляр специального класса stmt, с которым в дальнейшем и производятся все манипуляции
    Привязать переменные к запросу.
    Выполнить подготовленный ранее запрос с помощью с помощью execute()

    В mysqli это будет так
    $sql = "INSERT INTO `events` (`title`, `discription`, `date`, `img`) VALUES (?,?,?,?)";
    $stmt = $link->prepare($sql);
    $stmt->bind_param("sssss", $title, $discription, $date, $path);
    $stmt->execute();


    bind_param() принимает в качестве параметров все переменные, которые должны попасть в запрос, в том же самом порядке, в котором стоят плейсхолдеры в запросе. Но кроме того, сначала в этой функции должны быть указаны типы для всех переменных, в виде строки, где тип переменной обозначается одной буквой. То есть букв в этой строке должно быть ровно столько, сколько дальше будет переменных. К счастью, можно особо не париться с типами и для всех переменных указывать тип "s".

    И тогда никаких ошибок запроса уже никогда не будет. Не говоря уже про инъекции.
    Ответ написан
    2 комментария
  • Карьера программистом в 18 лет?

    FairyTaleComposer
    @FairyTaleComposer
    Достаточно ли знаний лучше судить не по кол-ву освоенных технологий, а по глубине знаний и практического опыта решения задач в проектах. От себя могу сказать: дерзайте. Я была в такой же ситуации, со школой были проблемы из-за здоровья и отсутствия денег. И у меня вопрос заработка встал в 13 лет. Я пыталась искать какие-то способы посильные мне (уборка, потом уроки музыки в 17-19). В 20 пришла к программированию. По своему опыту в музыке и программировании могу сказать: это очень хорошо, что Вы уже пришли к поиску работы. И то, что Вы уже изучаете специальность это наоборот похвально. Корочка Вам не даст знаний, она может дать только более простое внедрение в систему недалёких людей, которые не в состоянии оценивать опыт и знания других людей и привыкли к тому, что корочка это главное, это показатель (потому что их так учили). И как это так, они потратили столько лет на просиживание штанов в учебных заведениях, а Вы получите работу гораздо более быстрым и выгодным способом. Поэтому всё зависит от Вашей готовности идти против системы. Если пойдёте путём отсутствия специального образования - будьте готовы, что Вам будут завидовать и не пропускать Вас. (человеческий фактор, в общем) Если пойдёте по стандарту получать высшее образование по специальности, раз у Вас уже возник такой вопрос и необходимость работать, Вы можете не смочь доучиться и всё-равно встать перед фактом. Что нужна работа здесь и сейчас. Либо по специальности, либо каким-нибудь продавцом-уборщиком. (теряете возможность заниматься своей специальностью, не советую) Даже если Вы пойдёте учиться в университет, Вам дополнительно нужно будет продолжать изучать то, что непосредственно касается Вашей специальности. Ничего связанного с реальными проектами в университетах не преподают (всего того, что у Вас указано в списке).

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

    @galaxy
    return "$n " . ( ($n / 10) % 10 == 1 || $n % 10 > 4 || $n % 10 == 0 ? 'лет' : ($n % 10 == 1 ? 'год' : 'года') );

    детский сад...
    Ответ написан
    Комментировать
  • Почему не работает REGEXP в mysql?

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

    uvelichitel
    @uvelichitel Куратор тега Go
    habrahabr.ru/users/uvelichitel
    Мне кажется вы с ног на голову... Может быть так?
    type Admin struct {
      Permissions map[string]interface{}
      User
    }
    type Subscriber struct {
      Online        bool
      Status        string
      SubscriptedTo []int
      User
    }
    type User struct {
      ID    int
      Login string
    }
    Ответ написан
    Комментировать
  • Как создать список разделенный по классам?

    @Akela_wolf
    Extreme Programmer
    ORDER BY klass, podklass отсортирует так что будут овощи, затем фрукты. А строить вот такую древовидную структуру MySQL не умеет, придется это делать вручную на PHP
    Ответ написан
    1 комментарий
  • Как сделать в запрос Mysql что бы вывести по 10 записей каждой страны?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    И наш традиционный вопрос: что я делаю не так, печатая заголовок вопроса не в форму на тостере, а в адресную строку своего браузера?
    Ответ написан
    Комментировать
  • Как преобразовать дату July 19, 2021 08:10 PM в Y-m-d H:i?

    @easycode
    не боюсь задавать глупые вопросы ))
    так пробовали?
    <?php
    $input = 'July 19, 2021 08:10 PM';
    echo date('Y-m-d H:i', strtotime($input));
    Ответ написан