Профиль пользователя заблокирован сроком с 10 апреля 2022 г. и навсегда по причине: систематические нарушения правил сервиса
  • Не могу решить проблему с синтаксисом sql?

    rozhnev
    @rozhnev Куратор тега PHP
    Fullstack programmer, DBA, медленно, дорого
    Можно так:
    <?php
    
    require_once 'vendor/connect.php';
    
    $login = mysqli_real_escape_string($connect, $_SESSION["login"]);
    
    $query = mysqli_query($connect, "SELECT * FROM `users` WHERE login = '$login'");
    
    $balance = mysqli_fetch_assoc($query);
    
    echo 'Balance:' . $balance['balance']. PHP_EOL;
    
    if(isset($_POST['click'])) {
    	mysqli_query($connect, "UPDATE `users` SET `balance`=`balance`+0.001 WHERE login = '$login'");
    	echo 'New balance:' . ($balance['balance'] + 0.001) . PHP_EOL;
    }
    
    ?>


    Share PHP code online

    А лучше так:

    <?php
    
    require_once 'vendor/connect.php';
    
    /* prepare statement */
    $stmt = $connect->prepare("SELECT `balance` FROM `users` WHERE login = ? ");
    
    /* bind parameters for login */
    $stmt->bind_param("s", $_SESSION["login"]);
    
    /* execute query */
    $stmt->execute();
    
    $stmt->bind_result($balance);
    
    /* fetch value */
    $stmt->fetch();
    
    /* free result to next use */
    $stmt->free_result();
    
    echo 'Balance:' . $balance . PHP_EOL;
    
    if (isset($_POST['click'])) {
    
    	/* prepare statement */
    	$stmt = $connect->prepare("UPDATE `users` SET `balance`=`balance`+0.001 WHERE login = ? ");
    
    	/* bind parameters for login */
    	$stmt->bind_param("s", $_SESSION["login"]);
    
    	/* execute query */
    	$stmt->execute();
    
    	echo 'New balance:' . ($balance['balance'] + 0.001) . PHP_EOL;
    }
    
    ?>


    Test PHP code online
    Ответ написан
    Комментировать
  • Поможет ли суррогатный ключ увеличить скорость вставки в таблицу?

    @antiiii Автор вопроса
    Сделал ещё ряд тестов.

    Точно так же, две таблицы:
    - первичный ключ: char(32)+date, партицирование по годам + 3 дополнительных индекса по полям;
    - первичный ключ: auto increment+date, партицирование по годам, уникальный ключ char32+date + 3 дополнительных индекса по полям;

    В каждой таблице изначально 5 млн строк, в каждом тесте вставлялось по 100 000 новых.
    Строки вставлялись по одной и пачками по 20 (среднее кол-во на продакшене за один вызов скрипта).
    Запросы делались по одному, без оборачивания в транзакцию (насколько я понимаю, если запрос один - то и транзакция бесполезна, независимо от кол-ва строк?).

    В результате получено ускорение в 2,6 раз:
    - 0,010 сек с суррогатным и 0,026 сек с char(32) построчно;
    - 0,003 и 0,007 по 20 строк за запрос.

    Кроме этого, batch-запросы с auto increment имеют намного меньшее max время вставки: 1,5 сек против 11,4 (да, 11 секунд на вставку 20 строк).

    Также при заполнении таблиц тестовыми данными (5 млн строк на каждую), auto increment показал в ~2.3 раза больше скорость и в целом скорость держалась +- стабильной, когда как для первичного char(32) ключа она постоянно падала вместе с заполнением таблицы.

    В целом можно сказать, что да, суррогатный первичный ключ действительно сильно ускоряет вставку по сравнению с char(32).
    Ответ написан
    Комментировать
  • Как проверить вхождение даты в определённый диапазон?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Перевести дату в стандартный формат YYYY-MM-DD или в unix timestamp, потом обычным сравнением.
    Ответ написан
    Комментировать
  • Как сравнить два поля VARCHAR и INT?

    @alexalexes
    Как выглядит ваша проблема:
    Таблица новостей:
    ID, CATEGORIES
    1, '1,13,14'

    Как нужно реализовать:
    Добавить еще таблицу Categories_Of_News
    ID, NEWS_ID, CATEGORY_ID
    1, 1, 1
    2, 1, 13
    3, 1, 14

    Тогда запросы не будут содержать никаких костылей с парсингом строк и у вас будут работать индексы (если их создать).
    Например, получить все категории, в которые входит новость :news_id
    select  C.Id
    from News N
    join Categories_Of_News CoN on CoN.News_Id = N.Id
    join Category C on C.Id = CoN.Category_Id 
    where N.Id = :news_id

    PS: Смотрите, как реализовать связь "многим-ко-многим".
    Ответ написан
    Комментировать
  • Как правильно вывести массив php?

    rozhnev
    @rozhnev Куратор тега PHP
    Fullstack programmer, DBA, медленно, дорого
    Вместо отдельных массивов для каждого предмета создайте единый массив:
    $items = [
        'school_table' => [
            'name' => 'School Table',
            'price' => 100
        ],
        'school_chair' => [
            'name' => 'School Chair',
            'price' => 50
        ]
    ];
    
    $item = $items[ 'school_table'];
    
    echo $item['name'] . ' for ' . $item['price'] . ' money';


    Share PHP code online
    Ответ написан
    7 комментариев
  • Как сделать лимит выполнения цикла for?

    Adamos
    @Adamos
    Прописать в модели Message метод limited_attachments и использовать его во всех подобных случаях.
    Ответ написан
    2 комментария
  • Зачем нужны внешние ключи прописанные в структуре БД (MySQL) - они действительно там нужны?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Любая СУБД имеет достаточно мощную систему контроля целостности и непротиворечивости данных. Эта система работает, используя набор правил контроля, описанных в структуре БД, и жёстко следит за тем, чтобы ни одно из правил не было нарушено.

    Внешний ключ - это как раз такое правило. Сформулировано оно так: в данном поле таблицы не может храниться значение, которое не присутствует в той таблице, на которую ссылается внешний ключ (rонечно, в зависимости от конкретного текста ссылки внешнего ключа и самого поля тут возможны варианты - например, в этом поле может храниться не только значение, присутствующее в ссылочной таблице, но и NULL). И, имея такое правило, СУБД ни при каких условиях не позволит его нарушить. Любая попытка вставить запись со значением, которого нет в ссылочной таблице, приведёт к ошибке. Любая попытка изменить существующее значение на такое, которого "там" нет - приведёт к ошибке. То же касается и "второй" стороны, СУБД не позволит изменить значение в ссылочной таблице или удалить его (потому что записи в нашей таблице при этом "потеряют" ссылку) - такая попытка корректировки приведёт к ошибке.
    Ответ написан
    2 комментария
  • Самый короткий способ обработать каждый элемент массива?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Профессионалы, например, понимают, что присвоение $value здесь бессмысленно и не пишут его. И вот я сэкономил вам целых 9 символов - потратьте их с умом.
    Ещё профессоналы понимают, что в коде важна читаемость, а не краткость. И именно умение писать понятный код является показателем квалификации.

    Ну а прям профессиональные профессионалы решают эту задачу исключительно вот так:
    Посмотреть профессиональный код

    <?php
    declare(strict_types=1);
    
    class Ellipsis
    {
        private string $char;
        private int $count;
    
        /**
         * @param string $char
         * @param int $count
         */
        public function __construct(string $char, int $count)
        {
            $this->char = $char;
            $this->count = $count;
        }
    
        /**
         * @return string
         */
        public function getChar(): string
        {
            return $this->char;
        }
    
        /**
         * @return int
         */
        public function getCount(): int
        {
            return $this->count;
        }
    }
    
    class Ellipsisist
    {
        private Ellipsis $ellipsis;
    
        /**
         * @param Ellipsis $ellipsis
         */
        public function __construct(Ellipsis $ellipsis)
        {
            $this->ellipsis = $ellipsis;
        }
    
        /**
         * @param string $value
         * @return string
         */
        public function __invoke(string $value): string
        {
            return str_pad($value, mb_strlen($value) + $this->ellipsis->getCount(), $this->ellipsis->getChar(), STR_PAD_LEFT);
        }
    }
    
    class EllipsisistFactory
    {
        /**
         * @param string $char
         * @param int $count
         * @return Ellipsisist
         */
        public static function make(string $char, int $count): Ellipsisist
        {
            return new Ellipsisist(new Ellipsis($char, $count));
        }
    }
    
    $arr = ['foo', 'bar', 'baz'];
    
    $ellipsisiatedArr = array_map(
        EllipsisistFactory::make('.', 3),
        $arr
    );
    
    var_dump($ellipsisiatedArr);

    Ответ написан
    4 комментария
  • Как подойти к разработке данного проекта?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Можно и с файлами, но тогда надо самому заботиться о состоянии гонки и блокировках.
    Представьте простую ситуацию, практически одновременно приходят два запроса, изменяющих один и тот же файл. Может получиться следующая ситуация:
    - скрипт A читает файл
    - скрипт B читает файл
    - скрипт A записывает изменения в файл
    - скрипт B записывает изменения в файл, изменения, сделанные скриптом A, затёрты.
    В базах данных с этим проще, есть атомарные изменения, транзакции и блокировки строк/таблиц. В файловой системе вы можете только заблокировать файл целиком на время работы с ним скрипта.
    Ответ написан
    3 комментария
  • Возможно ли устроиться джуном на удаленку за рубеж?

    samodum
    @samodum
    Какой вопрос - такой и ответ
    Нет, невозможно
    И вопрос на засыпку, какой вообще является работа на дистанционке за рубежом? Чисто черной? или договор присылают как-то почтой?

    Ну, тебе это не светит, можешь забыть про этот вопрос

    Вообще, если ты задал этот вопрос на тостере, то это уже показатель твоей профнепригодности и особенно за рубежом
    Ответ написан
    3 комментария
  • Как сделать общий сервис во всех контроллерах?

    BoShurik
    @BoShurik Куратор тега Symfony
    Symfony developer
    Абстрактный контроллер реализует Service Subscriber. Вам достаточно туда добавить ваш Setting:

    abstract class Controller extends AbstractController
    {
        public static function getSubscribedServices()
        {
            return array_merge(parent::getSubscribedServices(), [
                'setting' => Setting::class,
            ]);
        }
    
        protected function getSetting(): Setting
        {
            return $this->get('setting');
        }
    }
    Ответ написан
    1 комментарий
  • Как избавиться от бесконечных условий в php?

    @alekcena
    Нелинейный наставник
    Сумма за 99 символов
    У нас есть 205 символов
    За каждые 99 символов прайс 500 рублей
    1) Делаем деление всего символов на 99
    2) Умножаем результат на 500 рублей

    ПС:
    Это даже не программирование.
    Ответ написан
    Комментировать
  • Как в php немедленно выводить данные?

    @Vitsliputsli
    То что вы хотите не нужно делать через http, либо используйте web-socket, либо полностью перетащите этот функционал на фронт. Http предназначен для получения данных, а не отправки команд-сигналов с сервера. Манипуляции с ajax или переполнением буфера - также будут извращением.
    Ответ написан
    1 комментарий
  • Новая система аутентификации теперь не делает редирект?

    @alexrakirov Автор вопроса
    В общем читаю книгу вижу фигу, плохо посмотрел что там в FirewallConfig

    В firewall добавляем entryPointкласс от AuthenticationEntryPointInterface

    $security->firewall('main')
            ->lazy(true)
            ->customAuthenticators([LoginAuthenticator::class])
            ->entryPoint(AuthenticationEntryPoint::class)
            ->logout()
                ->path('logout')
                ->target('login');
    Ответ написан
    Комментировать
  • Где изучить PHP, если ты не полный новичок?

    approximate_solution
    @approximate_solution
    JS Developer. Angular\React\Vue\Ember
    Писать код, много кода, только так.

    По мимо того что писать код, начать с книг -
    PHP 7 | Котеров , Симдянов - как пример.

    Прочитав главу - пописать код, закрепив на практике. Далее по мере погружения писать более сложные проекты - админку, магазин. После того как написали магазин на голом PHP, переходить к фреймворку. По мимо PHP желательно бы погрузиться в базу HTML, CSS, JS, что бы понимать как PHP коммуницирует с фронтом(примем сделать полноценную связку, а не использовать php как шаблонизатор html) Написать бэк на PHP, далее прикрутить к нему SPAшку Если получится всё это - будете гонять вайтишников на рынке. На самом старте и дикой конкуренции среди джунов, чем больше у вас охват по области, тем больше шансов пробиться на позицию джуна.
    Ответ написан
  • Прошу помочь с формой отправки ajax. Форма отправляется, но только первый button. Как исправить?

    @thisuserhatephp
    Офлайн - losers Онлайн - lusers
    id должен быть уникальным.

    <form id="form">
    <div id="dii">
    <input type="hidden" id="login" value="<? echo $login; ?>">
    <button type="submit" id="" class="status"  value="1">1</button>
    <button type="submit" id="" class="status"  value="2">2</button>
    <button type="submit" id="" class="status"  value="3">3</button>
    <button type="submit" id="" class="status"  value="4">4</button>
    </div>
    <div id="app" width="640" ></div>
    </form>


    $("#dii>button").on('click', function(e){
      e.preventDefault();
      var status = $(this).val();
      
      console.log(status);
      var login = document.getElementById('login').value;
        $.ajax({
      type: 'post',
      url: 'preload.php',
      data: {status: status, login: login},
      success: function(data){
      //alert("Ваше сообщение отпрвлено!");
          alert(data);
                $("#app").empty();
                $("#app").append(data);
      }
    });
    });


    оффтоп: вот такое встречается часто

    Скажите пожалуйста, где вы учились этому ? Какие-то курсы может, универ какой-то ? Видео уроки ?

    Как же я устал от этого id в css, от тридцать миллиардов одинаковых id на документ. Постоянно работать вот с этим. Я почему спрашиваю, наконец хочу найти этого преподавателя и попросить его не учить людей этому.

    #button {
      color: green; 
     width: 250px;
     height: 60px;
    }
     #button2 {
      color: green; 
     width: 250px;
     height: 60px;
    }
    
     #button3 {
      color: green; 
     width: 250px;
     height: 60px;
    }
     #button4 {
      color: green; 
     width: 250px;
     height: 60px;
    }


    Что так сложно класс использовать ?
    Ответ написан
    1 комментарий
  • Как правильно сделать Mysql "точный" like запрос?

    @Akina
    Сетевой и системный админ, SQL-программист.
    1. Использовать не LIKE, а функции поиска подстроки (INSTR или LOCATE)
    2. Задать требуемый collation (вплоть до BINARY)
    Ответ написан
    Комментировать
  • Как реализовать создание онлайн анкеты с вопросами и ответами?

    rozhnev
    @rozhnev Куратор тега MySQL
    Fullstack programmer, DBA, медленно, дорого
    1. Правильно спроектированную базу данных потребуется изменять только при изменении логики приложения

    2. Пример структуры таблиц под ваше описание:
    create table questionnaires (
            id int primary key auto_increment,
      	title varchar(255)
    );
    
    create table questios (
            id int primary key auto_increment,
      	questionnaire_id int,
      	title varchar(255),
      	foreign key (questionnaire_id) references questionnaires(id)
    );
    
    create table answers (
            id int primary key auto_increment,
      	question_id int,
      	title varchar(255),
      	rigth bool,
      	foreign key (question_id) references questios(id)
    );


    SQL online fiddle
    Ответ написан
    Комментировать
  • Как реализовать такие хитрые классы на PHP 5.3 и 7?

    1-е задание.
    class SimpleClass
    {
        public function __invoke() 
        {
            return $this;
        }
    
        public function stdout($string) 
        {
            echo $string;
            return $this;
        }
    }


    2-е задание:
    class SimpleClass
    {
        public function __invoke(string $string = PHP_EOL): self
        {
            echo $string;
            return $this;
        }
    }


    Не тестировал. Проверьте правильность сами.
    Ответ написан
    1 комментарий