Задать вопрос
  • Как к масиву подключить подгружать через file_get_contents файлы из папки?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    include.
    РНР файлы в РНР подключаются с помощью конструкции include.
    Ответ написан
  • Почему выскакивает эта ошибка при INSERT INTO?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Потому что одинарные кавычки имеют в программировании определенный смысл, и их надо писать только там, где надо, а не просто добавлять от балды в код?
    Ответ написан
    8 комментариев
  • Как декодировать текст?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Правильный ответ
    print(base64.b64decode(text + '=' * (-len(text) % 4)))

    Все же написано в сообщении об ошибке. Строка не добита символами = до нужной длины, чтобы быть кратной 4
    Ответ написан
    Комментировать
  • Как прочитать webhook?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Загадочный webhook - это самый обычный РНР скрипт, который самым обычным образом принимает GET или POST запрос, точно так же, как если бы он был отправлен из браузера.
    То есть "проверить, что данные действительно приходят" точно так же: если это JSON POST, то через php://input, если обычный POST - то в $_POST
    Ответ написан
  • Как убрать повторяющиеся элементы из двумерного массива php?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    В цикле.
    Все операции над массивами производятся в цикле.

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    insert into odna (col1, col2) select col1, col2 from drugaya;
    insert into odna (col1, col2) select col1, col2 from tretya;
    Ответ написан
    Комментировать
  • Как запустить python через php?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Главная проблема музыки в России начинающих программистов в том, что они "перерывают интернет" в поисках решения своей задачи. А надо - в поисках того, как разобраться, в чем проблема.
    Потому что само решение и так уже есть.

    Как минимум - в начало пхп скрипта и смотреть на ошибки
    ini_set('display_errors',1);
    error_reporting(E_ALL);
    Ответ написан
    4 комментария
  • Как узнать наличие записи в базе данных и получить нужные значения?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Весь код у вас уже есть.
    Вам только надо самому решить, чего вы хотите - проверить наличие записей, или выполнить дальнейшие действия.

    Код у вас - для второго.
    А пытаетесь вы его использовать для первого.

    Чтобы проверить, цикл не нужен. Чтобы обработать - КАК вы обойдетесь без цикла?

    В принципе, я тут не вижу нужды проверять. Просто запросить, да обработать.
    Но если прям жить не можете без проверки, то можно например использовать переменную
    $found = false;
    foreach($result as $row){
        $found = true;
        $orderId = $row["orderId"];
        // делаете что хотите
    }
    if(!$found) {
        print 'нет';
    }


    Если запись может быть только одна, то еще проще

    $result = mysqli_query($mysqli, "SELECT * FROM `Order` WHERE status='NEW'");
    $row = $result->fetch_assoc();
    if ($row) {
        $orderId = $row["orderId"];
    } else {
        print 'нет';
    }
    Ответ написан
  • Что означает длина поля int?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Размер, указываемый для поля типа int, не влияет на значения. И - как следствие - не влияет и на занимаемую память. Непонятно, с чего вы решили обратное.
    Если поле типа int(1) позволяет сохранить значение 4294967295, то естественно, что и памяти оно будет занимать те же 4 байта, что и int(10)

    Цифра эта ни на что не влияет, и имеет скорее декоративное значение.
    Если хотите сократить память/предельное значение, то используйте другой тип поля -
    TINYINT занимает 1 байт, до 255
    SMALLINT занимает 2 байта, до 65535
    MEDIUMINT - 3 байта, до 16777215
    Ответ написан
    1 комментарий
  • Как решить задачу?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Во-первых, непонятно, при чем тут insert
    Во-вторых, колонка status в данном случае вообще не имеет смысла, если ее значение можно вычислить на лету.
    Ответ написан
    5 комментариев
  • Может кто-нибудь дать реальную задачу на которой можно применить ООП?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Это хороший вопрос, но однозначного ответа на него нет.

    Во-первых, надо понимать, что писать свои классы и использовать готовые - это две очень большие разницы.
    От современного программиста чаще всего требуется второе. И это не требует особого понимания ООП.

    Во-вторых, учить ООП как сухую теорию, не осознавая реальной потребности в улучшении существующего кода, будет гораздо труднее. Я убежден в том, что программист должен дорасти до ООП (я сейчас говорю не про синтаксис, а про написание своих классов и того как они взаимодействуют друг с другом). Он должен увидеть несовершенство процедурных простыней, чтобы прийти к пониманию необходимости оптимизации существующего подхода.

    В-третьих, все реальные примеры настолько замороченные, что по ним разобраться совершенно нереально. А упрощенные ничего толком не показывают. Только синтаксис.

    Я задумывался над всеми этими проблемами, но пока не смог сделать хороший наглядный пример. Только фрагменты. Вот например, как небольшой класс, который я привел в соседнем ответе. Он, будучи совсем примитивным, тем не менее показывает пример правильного наследования, использования внедрения зависимостей, и в целом показывает, как классы помогают экономить код и время программиста.

    Это пример самой базовой и очень распространенной задачи - как сделать работу с SQL менее занудной и гарантированно безопасной. И начинать надо именно с таких задач, не замахиваясь на приложения целиком.

    Если говорить о приложении целиком, то стоит попробовать написать что-то примере фреймворка Symfony - это как раз даст понимание того, как ООП применяется на уровне приложения.
    Ответ написан
  • Call to undefined function checkFields(), как исправить?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Возможно, речь идет о коде, который я как-то на ходу сочинял здесь для кого-то.
    Только понятное дело, весь смысл давно улетучился, и остался голимый, эталонный карго-культ, самолеты из соломы.

    Там шла речь о примитивном ORM по паттерну Table Gateway, чтобы упростить и обезопасить базовые CRUD операции.

    abstract class BasicTableGateway
    {
        protected $db;
        protected $table;
        protected $fields;
        protected $primary = 'id';
    
        public function __construct(\PDO $db)
        {
            $this->db = $db;
        }
        public function read($id): ?array
        {
            $stmt = $this->db->prepare("SELECT * FROM `$this->table` WHERE `$this->primary`=?");
            $stmt->execute([$id]);
            return $stmt->fetcn();
        }
        public function insert($data): int
        {
            $this->checkFields($data);
    
            $fields = '`'.implode("`,`", array_keys($data)).'`';
            $placeholders = str_repeat('?,', count($data) - 1) . '?';
    
            $sql = "INSERT INTO `$this->table` ($fields) VALUES ($placeholders)";
            $this->db->prepare($sql)->execute(array_values($data));
    
            return $this->db->lastInsertId();
    
        }
        // и так далее
        protected function checkFields($data)
        {
            $diff = array_diff(array_keys($data), $this->fields);
            if ($diff) {
                throw new \InvalidArgumentException("Unknown field(s): ". implode($diff));
            }
        }
    }


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

    class UserGateway extends BasicTableGateway {
        protected $table = 'gw_users';
        protected $fields = ['email', 'password', 'name', 'birthday'];
    }
    $userGateway = new UserGateway($pdo);
    
    $data = [
        'email' => 'foo@bar.com',
        'password' => 123,
        'name' => 'Fooster',
    ];
    $id = $userGateway->insert($data);


    Получается быстро удобно и безопасно.

    Но в текущем варианте удобство, осмысленность и безопасность улетучились, остались только какие-то невнятные идеи.
    Ответ написан
    2 комментария
  • Как при работе с MongoDB стандартизировать коллекции?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Да, принято. Без этого, фактически, с Монгой вообще работать невозможно.
    Больше того, учитывая, что (в отличие от нормальных баз данных) имена ячеек всегда хранятся вместе с данными (то есть дублируются столько раз, сколько документов хранится базе), то у монгеров принято давать ключам имена из одной-двух букв для экономии памяти. И эти сокращения тоже надо потом транслировать в человеческие имена. То есть база данных для работы с базой данных становится не прихотью, а жизненной необходимостью.

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

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

    Флаг в руки и барабан на шею. Безумству храбрых поем мы песню.
    Ответ написан
    Комментировать
  • Функции хелперы, что это и зачем они нужны если и без них всё работает?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Пользовательские функции в языках программирования служат для двух целей:
    - для того чтобы избежать дублирования кода при частом повторении одних и тех же операций
    - для того чтобы код был лучше структурирован, и как следствие - легче читался и его было удобно поддерживать. Когда у нас внутри условия if написано 50 строк кода, это неудобно читать и сложно редактировать. Когда внутри этого же условия всего один вызов функции, то это легко читается, и легко можно заменить на другую функцию.

    Функции-хелперы обычно относятся к первой категории. Их традиционно пишут в отдельном файле, который подключается к коду проекта.
    Ответ написан
    Комментировать
  • Как бороться с рекламой в письмах при отправке формы?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Голова дана человеку не только для того, чтобы в неё есть.
    А код рекаптчи надо не просто добавить в файл, но ещё и как-то использовать

    В своем коде вы получаете $response, но никак не используете. Не останавливаете отправку письма при неверном вводе капчи. А просто продолжаете выполнение кода, который отправляет письмо в любом случае.
    Ответ написан
    Комментировать
  • Как изменить названия файлов на нормальные после распаковки архива?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    В общем если я правильно понимаю, вам приходят как архивы, как сделанные под виндоус, с именами файлов в кодировке 1251 - и они распаковываются под виндоус правильно, так и сделанные под нормальными операционными системами, и в них имена закодированы в утф-8
    Если у вас есть возможность определять, где был сделан файл, то можно использовать эту информацию при перекодировании.

    Ну или тупо в лоб - искать в имени файлов русские буквы в той или иной кодировке, например 1251. То есть символы с кодами B0-EF. Если не встретились - перекодировать из утф в 1251
    Ответ написан
  • Как устранить Undefined array key после назначения переменных через explode()?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    На "западном аналогичном этому сайте" только что случайно наткнулся на красивое решение.
    $arrdata = array_pad(explode('|', $file[0]), 666, '');

    где 666 - это количество колонок, которое должно быть после explode.
    array_pad добьёт их пустыми строками. можно поставить нули при желании.
    Ответ написан
    22 комментария
  • Генератор случайного числа с отправкой на почту?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    У вас вопрос буквально уровня
    "Надо в понедельник пойти на алгебру, во вторник на литературу, а по пятницам на обж. Может кто сталкивался с таким???"
    Никаких "вариантов" тут встречать не надо. Если человек в принципе умеет ходить, и знает что такое алгебра с литературой.

    Вы вообще в состоянии понять, что это три разных действия, а не одно?
    Сгенерировать число, отправить письмо, и наладить регулярный запуск. Все три совершенно примитивные, и по каждому есть миллиарды примеров в интернете.
    Какая проблема взять пример для каждого и соединить?
    Ответ написан
    Комментировать
  • Как исправить Fatal error: Uncaught Error: Call to undefined function mysql_fetch_assoc()?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    поменять на mysqli_fetch_assoc
    а, не
    поменять на какое-то $obj_sql->FetchAssoc()
    Ответ написан
    Комментировать
  • Как сформировать запрос?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    У меня получилось как-то так
    select sum(o.sum), sum(fsum) from orders o left join 
    (select order_id, sum(price) fsum from foodcost where order_id in (1,2) group by order_id) t
    on o.id=t.order_id 
    where o.id in (1,2);

    То есть группировать продукты перед джойном.
    Ответ написан
    Комментировать