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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    внутри функции отдельная область видимости переменных
    поэтому

    function guest_single($number, $photo_id, $our_guests_images)

    ну или вызывать acf_photo_gallery внутри
    Ответ написан
  • Почему файл не отправляется на меил?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Первая проверка, которая должна стоять при загрузке файлов - это

    if ($_FILES['profileImage']['error']) {
        $errors = array(
        1 => 'The uploaded file exceeds the upload_max_filesize directive in php.ini',
        2 => 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form',
        3 => 'The uploaded file was only partially uploaded',
        4 => 'No file was uploaded',
        6 => 'Missing a temporary folder',
        7 => 'Failed to write file to disk.',
        8 => 'A PHP extension stopped the file upload.',
        );
       throw new \ErrorException($errors[$_FILES['profileImage']['error']]);
    }
    Ответ написан
  • Как сделать роутинг на чистом php, перенаправляя абсолютно все запросы в index.php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Есть такая пословица, "дурная голова ногам покою не даёт".

    я думаю, что это плохо с точки зрения безопасности.

    С какого перепугу?

    Если есть файлы, которые не надо светить наружу, их просто кладут за document root
    А такой "роутинг" ничего кроме головной боли не даст.
    Ответ написан
    Комментировать
  • Как создать данные в таблице?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    $conn = connect();
    $sql = "INSERT INTO users ( title, body) VALUES(?,?)";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param("ss", $input, $textarea);
    $stmt->execute();
    echo "update";
    Ответ написан
    4 комментария
  • Сброс $_POST после отправки с сохранением сессии?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ну просто проверить, установлена ли, и сбросить
    if (!empty($_SESSION['blabla'])) {
        $blabla = $_SESSION['blabla'];
        unset($_SESSION['blabla']);
    }
    Ответ написан
  • Как мне работать с классом БД в любом файле?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Задумка хорошая, но реализация не очень.

    Начнем с того, что это очень нелогичный класс.
    Как им вообще пользоваться, если функция row() возвращает не одну строку, а все?
    В классе куча лишнего кода, но при этом 90% функциональности ПДО в нем просто недоступно

    Класс надо переписать хотя бы так:

    class Db {
        public $db;
     
        public function __construct() {
            $config = require __DIR__.'/config.php'; 
            $options = [
                PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_EMULATE_PREPARES   => false,
            ];
            $dsn = 'mysql:host='.$config['host'].';charset=utf8;dbname='.$config['name'];
            $this->db = new PDO($dsn, $config['user'], $config['password'], $options);
        }
        public function query($sql, $params = []) {
            $stmt = $this->db->prepare($sql);
            $stmt->execute($params);
            return $stmt;
        }
        public function cell($sql, $params = []) {
            return $this->query($sql, $params)->fetchColumn();
        }
        public function row($sql, $params = [], $mode=PDO::FETCH_ASSOC) {
            return $this->query($sql, $params)->fetch($mode);
        }
        public function all($sql, $params = [], $mode=PDO::FETCH_ASSOC) {
            return $this->query($sql, $params)->fetchAll($mode);
        }
        public function column($sql, $params = []) {
            return $this->query($sql, $params)->fetchAll(PDO::FETCH_COLUMN);
        }
        public function lastInsertId() {
           return $this->db->lastInsertId();
        }
    }

    после того как ВЕСЬ функционал PDO будет добавлен, можно будет сделать db обратно приватной. А до те х пор вызывать через неё недостающие функции ПДО.

    А подключать объект этого класса проще пареной репы: просто предать в функцию

    include 'Db.php';
    $db = new Db;
    
    addUser($db, 123, 111111111);
    
    function addUser($db, $user_id, $date) {
      $params = [
        'user_id' => $user_id,
        'date' => $date,
      ];
      $db->query('INSERT INTO users (user_id, date) VALUES (:name, :date)', $params);
      return $db->lastInsertId();
    }
    Ответ написан
    1 комментарий
  • Есть у кого хороший пример класса пользователя?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Для начала надо ответить себе на вопрос - зачем тебе класс пользователя.
    Если просто "шоб було", то никакой класс тебе не нужен. Обходись массивами.

    Когда ты поймешь, зачем тебе классы вообще - вот тогда будет и понимание как сделать класс user.
    И нет - 5 лет за 5 минут проскочить не получится.
    И кстати есть большая вероятность, что ни через 5, ни через 10 лет понимание не придет. Из ста пользователей похапешечки хорошо если трое осиливают объектно-ориентированное программирование. Это не страшно, пхп - демократичный язык, можно писать ООП, можно кропать процедурщину.

    Только в последнем случае не надо пытаться себя обманывать и лепить классы из навоза и соломы, как делали папуасы после войны (во время войны с неба прилетали большие железные штуки, и привозили кучу ништяков. Потом ни белых людей ни штук не стало, и ништяки кончились. Папуасы стали строить целые аэродромы - с самолетами, ангарами, заправщиками - всё из палок и соломы, в надежде что с неба снова появятся ништяки. нисработало). Потому что если ты делаешь самолет без реального понимания, как он работает, то он не полетит. А будет только внещне напоминать настоящий.
    Ответ написан
    Комментировать
  • Cms или фреймворк?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Стоит ли пытаться все таки найти работу на фреймворке?

    Ну, если ты сам не знаешь, что для тебя лучше, то давай посторонний дядя ответит: стоит
    Ответ написан
    Комментировать
  • Как реализовать доступ к бд в классе пользователя?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Будет ли нормально сделать вот так?

    Конечно нормально.
    Будет, к примеру, в приложении 10 разных классов - и будет 10 соединений с БД. 100 классов - 100 соединений. Что тут такого?

    Как реализовать доступ к бд в классе пользователя?

    По-хорошему, в классе User не должно быть никакого доступа к БД. Но до понимания этого тебе ещё лет пять.

    Поэтому можешь просто подключиться с БД и передать в класс уже готовое соединение
    public static function setup($pdo)
        {
            self::$db = $pdo;
        }


    Но учитывая что у тебя никакой не ООП а голимая процедурщина, то можешь просто писать global $pdo в "методах" своего "класса" и не париться
    Ответ написан
  • Почему не живет $_SESSION?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Если isset($_SESSION), отвечает false, это значит что перед обращением к этой переменной не была вызвана функция session_start();
    Либо была вызвана, но не сработала из за самой известной ошибки. Ошибку гуглить

    session_start(); в начале документа index.php есть

    "Ты бы еще маму вспомнил" (с) анекдот

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    данные из БД в ISO-8859-1.


    не задана кодировка для работы с базой
    Ответ написан
  • Можно ли в PHP указать несколько типов параметру функции?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Как всегда, в заголовке одно, в тексте совсем другое

    "пустая строка" - это не тип.
    То есть задача сводится к строка или null
    то есть банально ?string

    Несколько типов можно будет задать в РНР8, через палочку
    Ответ написан
    Комментировать
  • Как отображать изображения на тестовом сайте, если они лежат на основном?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    можно наладить редирект в оппаче, Redirect /uploads http://main.site/uploads
    но я бы просто перенес картинки на тестовый.
    Ответ написан
    Комментировать
  • Как узнать название папки в которой лежит php файл?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Пробывал команду __DIR__ но она выводить полный путь к файлу php,

    Мама не говорила в детстве что врать нехорошо?
    Ответ написан
  • Можно ли менять куки?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Может
    Ответ написан
    Комментировать
  • Правильно ли считать static методы глобальными вместе с их классами?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Тогда не понятно, для чего нужен singleton, если класс уже уникальный используя только static методы

    Очень старнный вопрос.

    Синглтон не имеет отношения к состоянию класса, а только к количеству инстансов. У синглтона может быть только один. Это такой костыль для процедурного программирования, для тех кто не умеет в ООП.

    При нормальном ООП синглтон не нужен, поскольку программист в состоянии контролировать, сколько и каких объектов у него создаётся, и не пытаться создавать новый объект если нужный уже создан.

    Правильно ли считать static методы глобальными вместе с их классами?


    Правильно. Это говнокод, за очень редкими исключениями.
    Ответ написан
  • Почему данные не добавляются в бд?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ошибок не возникает потому что ты не сказал ПДО, чтобы он тебе о них сообщал.
    А не добавляется потому что ты всё делаешь неправильно. Переменные никогда не добавляются прямо в запрос. Плюс в коде коде куча всего ненужного.

    Вот здесь можно посмотреть нормальный пример
    Сначала запрос надо подготовить , поставив вместо переменных знаки вопроса, а потом выполнить, передав переменные отдельно
    <?php
    $login = $_POST['login'];
    $email = $_POST['email'];
    $password = $_POST['pass'];
    $conn = new PDO('mysql:host=localhost; dbname=testbd', 'root', '', [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
    
    $sql = "INSERT INTO users (login, email, password) VALUES (?,?,?)";
    $stmt= $pdo->prepare($sql);
    $stmt->execute([$login, $email, $password]);


    И все всегда будет работать
    Ответ написан
    Комментировать
  • IN AND NOT IN в одном запросе?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    По сслыке есть все ответы.

    Если использовать позиционные "псевдопеременные", то просто смержить два массива - один для in, второй для not in.
    Если использовать именованные "псевдопеременные", то сначала приготовить два массива, с разными именами переменных, а потом просто их смержит.
    Ответ написан
    Комментировать
  • Вывод данных из mysql php в json?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    $user = 'andrey';
    $stmt = $conn->prepare("SELECT * FROM table WHERE user=?");
    $stmt->bind_param("s", $user);
    $stmt->execute();
    $result = $stmt->get_result();
    $data = $result->fetch_all(MYSQLI_ASSOC);
    echo json_encode($data);
    Ответ написан
    Комментировать
  • Как проверить поле на пустоту?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Учитывая твоя предыдущий вопрос, ты вряд ли осилишь, но вообще поиск по необязательным условиям делается так:
    $conditions = [];
    $parameters = [];
    
    // conditional statements
    if (!empty($_GET['name']))
    {
        // here we are using LIKE with wildcard search
        // use it ONLY if really need it
        $conditions[] = 'name LIKE ?';
        $parameters[] = '%'.$_GET['name']."%";
    }
    
    if (!empty($_GET['age']))
    {
        // here we are using equality
        $conditions[] = 'age = ?';
        $parameters[] = $_GET['age'];
    }
    
    $sql = "SELECT * FROM users";
    
    // a smart code to add all conditions, if any
    if ($conditions)
    {
        $sql .= " WHERE ".implode(" AND ", $conditions);
    }
    
    // the usual prepare/bind/execute/fetch routine
    $stmt = $mysqli->prepare($sql);
    $stmt->bind_param(str_repeat("s", count($parameters)), ...$parameters);
    $stmt->execute();
    $b = $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
    if($b) {
        print_r($b);
    } else {
      echo "0 results";
    }
    Ответ написан
    5 комментариев