• Как произвести проверку строки с помощью preg_match?

    @66demon666
    По навыкам джун - по факту безработный
    На всякий случай, мож пригодится Полезный ресурс
    Ответ написан
    1 комментарий
  • Класс для работы с определенной таблицой?

    @sidni
    Php Developer
    То что вы пытаетесь реализовать, является паттерном ActiveRecord гуглите реализации.
    А нюансы
    • почему класс называется Account и при этом вы используете магические гет и сет тут в принципе все ясно и вы знаете какие поля вам нужно сететить поэтому можно их просто объявить паблик полями
    • метод сохранения довольно странный как вы будете различать апдейт от инсерта (можно сделать флаг isInsert) и если модель получили через ваши методы поиска то выставить его false что означает апдейт
    • Для поиска сделайте свои методы статическими, и всегда возвращайте новый экзепляр (коллецию, массив) своего класса, тогда вы решите проблему с циклом
    • По современным правилам проектирования данный паттерн является антипаттерном тк берет на себя слишком много функциональности и привязан к конкретной бд

    Хорошие реализации этого паттерна смотрите фреймверки Yii2 и Laravel
    Ответ написан
    Комментировать
  • Возможно ли размещение на Google Cloud Functions скрипта написанного PHP?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Ответ написан
    Комментировать
  • Запрос mysql (PDO) php, как исправить?

    flapflapjack
    @flapflapjack
    на треть я прав
    $sql = "SELECT * FROM applications_brokers WHERE id_account = ? LIMIT 6 OFFSET ?";


    А зачем в запрос вставлять $_COOKIE['user_login_id'], $quality - не понятно.

    Кроме того строки в PHP соединяются точкой, а не запятой.

    Предполагаю, что вы хотели сделать что-то типа:
    $sql = "SELECT * FROM applications_brokers WHERE id_account = ? LIMIT 6 OFFSET ?";
    $stmt=$dbn->prepare($sql);
    $result=$stmt->execute(array($_COOKIE['user_login_id'], $quality));
    Ответ написан
    8 комментариев
  • Почему не получается записать в базу данных?

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

    Поэтому сначала учимся правильно соединяться.
    Весь этот детский лепет "не могу соединиться с БД" выкидываем и пишем нормальный код, который сам, без всяких проверок, сообщит нам об ошибках.
    В случае mysqli это
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $link = mysqli_connect($host, $user, $pass, $db_name);
    $link->set_charset("utf8mb4");

    Здесь первая строчка отвечает как раз за информирование об ошибках

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

    После этого переписываем запрос. Причем так, чтобы данные в БД всегда попадали отдельно от самого запроса. Это непреложное правило, которое надо соблюдать всегда.
    Для этого надо
    • Заменить все переменные в запросе на специальные маркеры, которые называются плейсхолдеры или параметры, а по сути - просто знаки вопроса
    • Подготовить запрос к исполнению с помощью функции 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".

    И тогда никаких ошибок запроса уже никогда не будет. Не говоря уже о том что при любых других вариантах твой сайт поломает любой пятиклассник

    Но по-хорошему для работы с БД в РНР лучше использовать PDO, Тем более что там колупаться с bind_param не нужно, а можно сразу отправить все данные в execute

    Подключение
    $host = '127.0.0.1';
    $db   = 'test';
    $user = 'root';
    $pass = '';
    $port = "3306";
    $charset = 'utf8mb4';
    $options = [
        \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION,
        \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
        \PDO::ATTR_EMULATE_PREPARES   => false,
    ];
    $dsn = "mysql:host=$host;dbname=$db;charset=$charset;port=$port";
    $pdo = new \PDO($dsn, $user, $pass, $options);

    Здесь за информирование об ошибках отвечает параметр PDO::ERRMODE_EXCEPTION, а остальные просто для удобства/корректности.

    Выполнение запроса
    $sql = "INSERT INTO `events` (`title`, `discription`, `date`, `img`) VALUES (?,?,?,?)";
    $stmt = $link->prepare($sql);
    $stmt->execute([$title, $discription, $date, $path]);
    Ответ написан
    2 комментария
  • Задачи на ООП, SOLID, и просто толковые задачники онлайн PHP?

    saboteur_kiev
    @saboteur_kiev Куратор тега IT-образование
    software engineer
    Вся суть ООП - чтобы данные лежали вместе с функциями в одном объекте.
    Что позволяет инкапулировать и разделять разработку объектов разным программистам.
    Довольно сложно придумать ООП задачу для маленького проекта, с которым справится один человек.
    Придумывая задачу, предположите что вас несколько и вы независимо друг от друга пишете разные объекты, заранее договорившись только об интерфейсах (публичных методах)
    Ответ написан
    Комментировать
  • Как правильно сформировать запрос на вывод из нескольких таблиц в один формат?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    (SELECT ...
      FROM `products`
      WHERE `category_id` = :categoryId
    )
      UNION
    (SELECT ...
      FROM `newproducts`
      WHERE `new_category_id` IN (
        SELECT `id`
          FROM `newcategories`
          WHERE `join_category` = :categoryId
      )
    )
    Ответ написан
    3 комментария
  • Как сделать одно действие с несколькими значениями?

    @alexalexes
    Если нужно присвоить одно и то же значение атрибутам у нескольких определенных строк, то это делается элементарно.
    update `table` set атрибут_не_первичный_ключ = 1
    where id in (1, 2, 4, 10);

    Другое дело, если это касается атрибутов с уникальным свойством.
    Если нужно сделать рокировку значений, то поскольку первичный ключ имеет свойство уникального значения, то нужно действовать в два этапа.
    1. Переписать id-шники интересуемых строк так, чтобы новый id был за диапазоном присваиваемых id.
    Можно переписать в большую сторону, если у вас максимальное число записей пару тысяч, то воспользоваться новыми значениями, например, от миллиона.
    Но проблема в том, что если система не остановлена во время этой рокировки, то вероятно, вставка новых строк будет происходить с присвоением макс. последнего значения +1, тогда новые строки окажутся с миллионными id-шками.
    Нужно взять диапазон отрицательных чисел в качестве промежуточного состояния рокировки id.
    update table
    set id = case
       when id = 1 then -1
       when id = 2 then -2
       when id = 4 then -4
       when id = 10 then -10
       else id -- страховка от дурака, если неправильно описан in 
    end
    where id in (1, 2, 4, 10)

    2. Второй шаг заключается в том, чтобы переписать нашим отрицательным id новые положительные значения, чтобы каждая строка получила новые значения 1,2,4,10. Например, можно поменять местами id соседей.
    update table
    set id = case
       when id = -1 then 2
       when id = -2 then 4
       when id = -4 then 10
       when id = -10 then 1
       else id -- страховка от дурака, если неправильно описан in 
    end
    where id in (-1, -2, -4, -10)

    В итоге, такую операцию можно делать на работающей системе, не мешая созданию новых записей.
    Чтобы вообще исключить коллизии, то лучше оба запроса делать в одной транзакции, при этом можно использовать положительные значения не используемого диапазона значений id.
    Ответ написан
    3 комментария
  • Быть ли демонам на PHP для обмена пакетами со сторонним ресурсом или смотреть в сторону Python?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    Первый простейший вариант: запихнуть запуск PHP-скрипта в cron. Но там максимальная частота запуска - раз в минуту.

    Второй простейший вариант: сделать скрипт, работающий 24*7. Просто отключить лимит времени в скрипте через set_time_limit(0); и сделать в коде бесконечный цикл. А для паузы использовать sleep внутри цикла. И запускать, например, из командной строки. Но на виртуальном хостинге работать не будет.
    Ответ написан
    Комментировать
  • Как это можно порефакторить?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    Например, так:
    <?php for ($i = 0; $i < 5; ++$i) { ?>
      <li<?php if ($i < $countStart) { ?> class="start-fill"<?php } ?>></li>
    <?php } ?>

    Или так:
    <?php
    for ($i = 0; $i < 5; ++$i) {
      echo $i < $countStart ? '<li class="star-fill"></li>' : '<li></li>';
    }
    ?>
    Ответ написан
    Комментировать
  • Как на PHP создать свой сервер, чтобы получать данные с Andriod приложения?

    @rPman
    index.php
    <?php
    file_put_contents('mydatabase.serialized',serialized($_POST).nl,FILE_APPEND);
    ?>

    вот тебе готовый сервер из одного файла, ничего не проверяет, просто сохраняет все что к нему приходит

    Все дальнейшие правки делайте в нем чтобы контролировать корректность параметров данных, сохранять для удобного использования, выдавать данные по запросу и прочее прочее

    Использование фреймворков оправдано только если задача, которую они решают совпадает с вашей.
    Ответ написан
    Комментировать
  • Хочу зпомнить данные с моего андроид приложение в таблицу Postgresql но выдает ошибку в чём дело?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Скажу заранее это плохая идея.
    вам не нужно напрямую обращаться к БД из андроид.
    Для этого пишут бекенд (Rest сервис) и через api обращаются к бд
    Ответ написан
    1 комментарий
  • В чём заключается ошибка?

    BorLaze
    @BorLaze
    Java developer
    Привет, SQL injection!

    Надо так:
    String GPS = "kdlg";
    
    String sql = "INSERT INTO gps_coordinat (class) VALUES (?)";
    PreparedStatement preparedStatement = conn.prepareStatement(sql);
    preparedStatement.setString(1, GPS);
    
    int rows = preparedStatement.executeUpdate();
    
    if(rows == 1) {
        System.out.println("УСПЕХ");
    } else {
        System.out.println("что-то пошло не так...");
    }
    Ответ написан
    1 комментарий
  • В чём ошибка при создании таблицы?

    @galaxy
    У вас CREATE TABLE... - это вторая строка запроса. Что на первой? Не закрыли предыдущий запрос? Мусор из непечатных символов?
    Ответ написан
    Комментировать
  • Почему с бд может возвращаться False?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    Потому, что запрос завершился с ошибкой на стороне MySQL. А причину ошибки можно узнать, выполнив:
    var_dump(mysqli_error($db));
    Ответ написан
    Комментировать
  • Какие классы должны быть в тестовом задании на CRUD новостей?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Должны быть классы, показывающие ваши знания ООП и способность задание выполнить.
    Ответ написан
    3 комментария
  • Как разложить число в PHP?

    @eandr_67
    web-программист (*AMP, Go, JavaScript, вёрстка).
    Можно без перебора всех вариантов стразу получать искомые IP-адреса - если идти не от чисел, а от суммы цифр каждого числа.
    В результате скрипт, в котором echo было заменено на ++$count, проработал менее 14 секунд и насчитал 112279695 адресов.
    $tbl = array_fill(0, 20, []);
    for ($i = 0; $i < 256; ++$i) { $tbl[intdiv($i, 100) + intdiv($i, 10) % 10 + $i % 10][] = $i; }
    for ($i = 0; $i <= 19; ++$i) {
        for ($j = 0; $j <= min(19, 28 - $i); ++$j) {
            for ($k = max(0, 28 - 19 - $i - $j); $k <= min(19, 28 - $i - $j); ++$k) {
                foreach($tbl[$i] as $v1) {
                    foreach($tbl[$j] as $v2) {
                        foreach($tbl[$k] as $v3) {
                            foreach($tbl[28 - $i - $j - $k] as $v4) {
                                echo $v1, '.', $v2, '.', $v3, '.', $v4, "\n";
                            }
                        }
                    }
                }
            }
        }
    }

    Сумма цифр числа в диапазоне 0..255 имеет диапазон значений от 0 (0) до 19 (199).
    $tbl - массив списков чисел в диапазоне 0..255, имеющих одинаковую сумму цифр.
    Ответ написан
    1 комментарий
  • Как оставить в таблице не больше N последних записей определенного типа?

    BorLaze
    @BorLaze
    Java developer
    И попутный вопрос, MySQL же не умеет delete from ... where ..order by .... limit OFFSET ? Как удалить одним запросом?

    а что мешает сделать подзапрос?

    delete from ...
    where id in (select id from ... where ... order by ... limit ...)


    а уже в скобках - любой сложности условия
    Ответ написан
    1 комментарий
  • Как в PHP подставить результат функции в строку?

    @sl0
    1. echo 'Hello, ' . myFunction(). '!';
    2. echo sprintf('Hello %s', myFunction());
    Ответ написан
    Комментировать