Задать вопрос
  • Как вывести что-либо если сейчас от 10 до 20 часов?

    rozhnev
    @rozhnev Куратор тега PHP
    Fullstack programmer, DBA, медленно, дорого
    <?php
    if (10 <= date("G") && date("G") <= 20) {
        echo "сейчас на сервере от 10 до 20 часов.";
    }


    php code online
    Ответ написан
    6 комментариев
  • Как вызвать одну функцию из ассоциативного массива?

    rozhnev
    @rozhnev Куратор тега PHP
    Fullstack programmer, DBA, медленно, дорого
    Можно:
    <?php
    $commands = [
    	'hi' => fn($name) => 'hi, ' . $name, 
    	'hello' => fn($name) => 'hello , ' . $name,
    	'etc' =>fn($name) => 'etc...',
    ];
    
    echo $commands['hi']('John');


    php code online
    Ответ написан
    Комментировать
  • Как лучше всего идентифицировать id отзыва для отправки на сервер?

    Dr_Elvis
    @Dr_Elvis
    В гугле забанен
    на бекэнде дополнительно проверяйте, что этот отзыв принадлежит этому логину.
    Ответ написан
    1 комментарий
  • Как выводить предупреждения в php?

    Adamos
    @Adamos
    PHP не интерактивен, его нельзя прервать, выдав пользователю запрос и продолжить после ответа.
    В РНР вы можете только проанализировать данные и выдать ответ - все прошло или остались вопросы.
    Остальное делается в браузере, в JS: на форму, куда прикрепляется файл, вешается обработчик, который отправляет его по AJAX в PHP и разбирает ответ. Если в ответе есть вопросы, они выдаются пользователю и данные отправляются снова по тому же AJAX, но уже с ответами пользователя, определяющими поведение РНР при обработке файла.
    Ответ написан
    1 комментарий
  • Нужно ли в таких случаях делать защиту от инъекций?

    rozhnev
    @rozhnev Куратор тега PHP
    Fullstack programmer, DBA, медленно, дорого
    Нужно!!!
    Ответ написан
    Комментировать
  • Для чего в проектах принудительно используют use?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Минусы как бы очевидны:
    нет, не очевидны, по крайней мере миллионам разрабов

    1 Код становится трудно читаем. По месту использования не всегда понятно что имеется ввиду под Order::load() - \Framework\Sale\Order::load или \Vendor\Project\Sale\Order::load - приходится проматывать к верху файла.
    Вам как разрабу должно быть в принципе фиолетово, какой из пакетов используется, если они соблюдают один интерфейс. Если не соблюдают, при том что называются одинаково, значит все пошло не так задолго до проблем с определением пакета...

    2 Код становиться длиннее - там где было бы просто:
    \Framework\Main\UI\Extension::load([ 'vendor.module.components.cabinet.personal' ]);
    приходится писать:
    use \Framework\Main\UI\Extension;
    Extension::load([ 'vendor.module.components.cabinet.personal' ]);
    Код становится длиннее в проектах где 2 контроллера и в них по 1 экшену. Там где Extension::load будет вызываться больше одного раза, очевидно экономия на эксплуатации клавиатуры заметно увеличивается. А в больших проектах создание объекта может (и будет) повторяться многократно.

    4 Код становиться замусоренным, так как верхушки файлов запросто превращаются во что-то вроде:
    Если не обращать внимание на отсутствие пункта 3, то... нет, не могу не обращать внимание, вот же торопыга....
    Во первых - данная портянка очень аккуратно прячется любой адекватной ИДЕ,
    Во вторых - это правильно и логично, хранить все импорты в одном месте
    В третьих - если ты пишешь неимпортированный класс в коде - ИДЕ обычно предлагает варианты внесения его в блок импорта, и все выглядит аккуратно.

    И хрен его знает используются импортированные классы ниже ещё или уже нет, ведь никто не убирает этот мусор.
    Хрен не знает, а ИДЕ замечательно знает и даже подсвечивает серым цветом неиспользуемые.
    Ответ написан
    4 комментария
  • PHP Что делать ошибка function foreach() on null?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Очевидно что в переменной $diary ничего нет(NULL), и вы пытаетесь вызвать метод от пустой переменной. Предполагается что для начала нужно создать в ней объект класса Diary.
    Ответ написан
    8 комментариев
  • Как изменить определённый элемент списка в цикле for?

    Vindicar
    @Vindicar
    RTFM!
    Потому что ты не понимаешь итерацию по списку.
    for vote in votes: означает, что переменной по имени vote поочерёдно будут присваиваться ссылки на значения элементов списка votes. ТОЧКА. Это не означает, что присвоив другое значение этой переменной, ты изменишь список. Присвоив что-то vote, ты заменишь ссылку внутри vote на другую, но и только.
    Тем не менее, если само значение является изменяемым (например, это вложенный список или словарь), то его можно по этой ссылке изменить.

    Во втором случае ты с какого-то перепугу решил, что индексы списка - это его значения. Индексы - это индексы. Числа от нуля до N-1, где N - длина списка. Так что для модификации списка нужно знать индекс элемента.
    for index in range(len(votes)):
        vote = votes[index]
        x = vote.split(',')
        votes[index] = x[0]+x[1]

    Или вот так:
    for index, vote in enumerate(votes):
        x = vote.split(',')
        votes[index] = x[0]+x[1]
    Ответ написан
    1 комментарий
  • Как составить план обучения после основ С#?

    Раз у тебя уже есть готовый список, то вот что можно ответить:

    Самое важное, без чего ты вообще никак не сможешь работать:
    ASP NET Core, Postgresql
    Им нужно уделить больше внимания.
    Курсы есть и по тому и по другому, есть и вполне хорошие бесплатные.
    Например у Postgrespro есть бесплатный курс (тебя должен интересовать PostgreSQL для разработчика) и книги.

    Затем то, что точно пригодится в работе, но что сравнительно быстро можно изучить:

    git - ты его не упомянул, но он очень важен. Есть бесплатная книга Pro Git где подробно описаны все его команды + есть немало видео на youtube где в действии показано, как им пользоваться.

    SOLID - можно почитать статьи и книгу "Чистая Архитектура". В любом случае от тебя не ждут знаний на уровне архитектора тут.

    Unit tests - просто попробуй сам писать тесты на каком-нибудь фреймворке. Например на xUnit.
    Ещё можешь почитать книжку Кента Бэка про разработку через тестирование.

    Code review - просто почитай пару статей о том, зачем это нужно, и как не быть мудаком-ревьюером, и как принимать обратную связь на ревью.

    Методологии разработки - просто ознакомься с теми, какие вообще есть.
    Большинство сейчас работают по Scrum или Kanban (либо на чём-то производном от них).
    Можешь ещё agile manifesto почитать
    Опять же - от тебя тут не ждут знаний уровня менеджера проектов, и тебе не придётся с нуля процесс разработки в команде выстраивать.
    Ответ написан
    1 комментарий
  • Объясните на простом примере разницу между ООП и ФП?

    Griboks
    @Griboks
    В чистом ФП будет примерно так:
    releaseSocket(releaseConnection(releaseRouter(json(get('/users',prepareRequest(createRouter(routerParams,connect(createSocket('TCP'),ip, port)))),users))))

    Некоторые приёмы использовать стоит, но не самая лучшая идея - писать в функциональном стиле такие программы.
    Ответ написан
  • Как правильно сделать такой поиск?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Учимся думать:
    $search   = _string($_POST['search_string']);
    $sql = '
    SELECT * 
    FROM `chat` 
    WHERE `user_id` IN (
       SELECT `id` 
       FROM `users` 
       WHERE `login` LIKE "'.$search.'%"
    ) 
    ORDER BY `time` 
    DESC '; // делаем запрос отдельной строкой,
    var_dump($sql);
    //вставив в него переменную убеждаемся что там ерунда
    
    //пишем нормально
    $search   = $_POST['search_string'].'%';
    $sql = '
    SELECT * 
    FROM `chat` 
    WHERE `user_id` IN (
       SELECT `id` 
       FROM `users` 
       WHERE `login` LIKE ?
    ) 
    ORDER BY `time` 
    DESC '; 
    $stmt = $mysqli->prepare($sql);
    $stmt->bind_param('s', $search);
    $chat_result = $stmt->execute();
    while ( $row = $chat_result->fetch_assoc() ) {
        echo $row['user_id'].'<hr>';
    }


    ps: и нет смысла делать серч через пост запрос, лучше через гет, так поисковый запрос можно например переслать или скопировать и переиспользовать.
    Ответ написан
  • Поддерживает ли PHP асинхронность на уровне ядра языка программрования?

    @rPman
    из коробки в php есть асинхронные методы работы с сокетами, метод socket_select позволяет создать event loop и вести асинхронную коммуникацию

    так же библиотека curl позволяет вести загрузку в фоновом режиме с помощью curl_multi_...

    используя штатные механизмы языка созданы библиотеки по типу ReactPHP с помощью которых можно создавать событийно-ориентированные приложения, например асинхронный websocket и http сервер в одном приложении. Если сравнивать с nodejs, где асинхронность 'из каропки' то реализация на php чуть медленнее но так каксам язык в большинстве случаев работает быстрее, в некоторых случаях код будет работать быстрее (например я писал простейший веб сервис, работающий со сжатыми gzip файлами 'построчно', так вот на nodejs было сильно медленнее, но сам event loop там быстрее)

    p.s. чтобы nodejs по скорости был сравним с php приходится осторожно выбирать какими методами пользоваться, например штатные объекты и массивы там медленнее чем класс Map
    Ответ написан
    3 комментария
  • Как проверить на совпадение в бд?

    @alexalexes
    Динамически сформировать текст и список параметров запроса, в зависимости от критериев:
    $sql = "SELECT * FROM `shop` WHERE 1=1 "; // 1=1 - классическая заглушка, чтобы можно было удобно добавлять and.
    $params = []; // заготовка под входные параметры запроса.
    if(isset($_POST['criteria_1']) && $_POST['criteria_1'] == 'on') // выбрали нечто по первому критерию
    {
    // он проверяет только имя чего-то
    $sql .= 'and `name` = :name ' // добавляем условие в текст запроса
    $params['name'] = $_POST['name']; // добавляем параметры
    }
    if(isset($_POST['criteria_2']) && $_POST['criteria_2'] == 'on') // выбрали нечто по второму критерию
    {
    // он проверяет  например, страну и город
    $sql  .= ' and `country` = :country
                 and `city` = :city ' // добавляем условие в текст запроса
    $params['country'] = $_POST['country']; // добавляем параметры
    $params['city'] = $_POST['city']; // добавляем параметры
    }
    $stmt = pdo()->prepare($sql);
    $stmt->execute($params);
    if ($stmt->rowCount() > 0) {
        flash('Этот магазин уже существует.');
        header('Location: addshop.php'); // Возврат на форму регистрации
        die; // Остановка выполнения скрипта
    }
    Ответ написан
    Комментировать
  • Как вывести массив чисел в файл?

    @akonovalov
    Программист на компьютере
    1) RTFM
    2) В Numpy есть методы для записи датасетов в txt.
    Ответ написан
    Комментировать
  • Как грамотно реализовать пагинацию через класс?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Еще раз: Тут нет никакого ооп, у вас получается какой-то процедурный код, засунутый внутрь класса. Это к ооп не имеет никакого отношения. Не пытайтесь сделать деревянную печку, ничего хорошего не получится.
    У вас:
    Код реализует (такой себе) пэйджинг для одного конкретного запроса (нахрена такой пейджинг засовывать в класс?)
    Код ничего не инкапсулирует, тупо выполняется как функция. По сути если мы уберем class Paginate extends Connection{ то ничего не поменяется.
    Внутри методов используются глобальные переменные (GET), что само по себе уже лютый говнокод.
    Много слов про солид и прочие вещи из ооп не пишу, в виду полного их отсутствия в коде, да и смысл?

    По этому решения для вашего случая в контексте ооп просто нет, так как:
    Пэйджинг работает с моделями на основе ОРМ, в пэйджинг в качестве аргумента передается модель, и далее уже пэйджинг работает с моделью, используя ее методы работы с хранилищем, а не просто тупо фигачит запросы. У вас моделей просто нет.
    Модели подразумевают конкретный интерфейс, который позволяет работать с пэйджингом адекватно. Ну и моделей нет ))
    Точкой взаимодействия между моделью и пэйджингом будет контроллер, про который тут вообще у вас никто не в курсе.
    Вывод (view) никогда не пересекается с кодом логики, в него просто передаются готовые данные, после чего они вставляются в нужные точки шаблона.
    Ответ написан
    6 комментариев
  • Будет ли использоваться индекс в запросе вида WHERE `field1` LIKE '_aa_a_'?

    @Akina
    Сетевой и системный админ, SQL-программист.
    будет ли использоваться индекс в запросе вида WHERE `field1` LIKE '_aa_a_'?

    50/50 - или будет, или нет.

    Однако если он будет использоваться, то не как индекс (сортированный список для выполнения index seek), а как компактная копия таблицы (как несортированный список для выполнения index scan).

    Тем не менее профит от использования индекса таким образом может быть, и весьма значительный. Главным образом он определяется соотношением размера записи к размеру поля. И чем это соотношение выше, тем более вероятен профит.
    Ответ написан
    1 комментарий
  • Будет ли использоваться индекс в запросе вида WHERE `field1` LIKE '_aa_a_'?

    rozhnev
    @rozhnev Куратор тега MySQL
    Fullstack programmer, DBA, медленно, дорого
    Вместо сотни вопросов один ответ: попробуйте и узнаете online sql editor
    Ответ написан
    Комментировать
  • Как вычесть число в SQLite?

    @kapp1
    UPDATE users SET grade = (grade + ?) WHERE id = ?”, (-1, 4)
    Ответ написан
    1 комментарий
  • Как вычесть число в SQLite?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    SET - устанавливает значение. Ты какое значение хочешь? То же что было и чтоб минус 1? Ну так может стоит прям так и попробовать написать, нет?
    set grade = grade - 1
    М?

    И при чем тут вообще питон? Убери лишний тег
    Ответ написан
    6 комментариев
  • Как сделать вычисление $cost из баланса?

    rozhnev
    @rozhnev Куратор тега PHP
    Fullstack programmer, DBA, медленно, дорого
    $stmt = $mysqli->prepare("UPDATE req 
    	SET balance = balance - ? 
    	WHERE card =? AND code = ? ;");
    $stmt->bind_param("sss", $cost, $card, $code);
    
    // set parameters and execute
    $cost = $_GET['cost'];
    $card = $_POST['card'];
    $code = $_POST['code'];
    
    $stmt->execute();


    run php online
    Ответ написан
    Комментировать