Задать вопрос
  • Дублирование данных при insert, где ошибка?

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

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

    - доступ к инстансу ПДО должен быть не только изнутри
    - а вот конфиг держать в переменной класса нужно как рыбке зонтик
    - кодировку при соеднинеии с базой надо задавать, чтобы потом не плодить на тостере очередной пост, "у меня в базе вопросики записались"
    - причем сразу правильную
    - самое главное - вежливо попросить РНР сообщать обо всех ошибках в запросах
    - ну и заодно установить разные удобные опции
    - пути всегда должны быть абсолютными
    - сначала надо написать универсальный метод для выполнения запросов, а потом уже использовать его во всех остальных методах
    - ненужный код не нужен

    class DatabaseMysql
    {
        public $pdo;
    
        public function __construct()
        {
            $options = [
                \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION,
                \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
                \PDO::ATTR_EMULATE_PREPARES   => false,
            ];
            $dbc = require(__DIR__.'/core/config/DbConfig.php');
            $this->pdo = new \PDO(
                "mysql:host={$dbc['db_host']};dbname={$dbc['db_name']};charset=utf8mb4",
                $dbc['db_user'],
                $dbc['db_pass'],
                $options,
            );
        }
        public function query(string $query, array $params = [])
        {
            $sth = $this->pdo->prepare($query);
            $sth->execute($params);
            return $sth;
        }
    
        public function insert(string $query, array $params)
        {
            $this->query($query, $params);
            return $this->pdo->lastInsertId();
        }
    }


    Хотя если честно, то я большого смысла в этом классе не вижу.
    Меня бы устроило простое расширение класса PDO типа такого
    class MyPDO extends PDO
    {
        public function run($sql, $bind = NULL)
        {
            $stmt = $this->prepare($sql);
            $stmt->execute($bind);
            return $stmt;
        }
    }

    Да, вставка будет выполняться за две строчки, а не одну,
    $pdo->insert('INSERT INTO test_table (`name`, `age`) VALUES (?,?)', ['Ivan',43]);
    $id = $pdo->lastInsertId();
    но я не уверен что стоит городить целый класс из-за одной строчки.
    Ответ написан
    1 комментарий
  • Автозагрузка классов, посмотрите на ошибки, что не учёл, какие могут возникнуть проблемы?

    dimsog
    @dimsog
    Переносил код с PHP 4 на 7.4...
    Смотрите, какие могут быть проблемы.
    1) Если я хочу два разных автозагрузчика, которые загружают файлы из разных директорий, то упс, это нельзя, так как у нас синглтон.
    2) extends SC, я так и не понял, что такое SC
    3) В качестве обучения отлично, что вы используете spl_autoload_register, но посмотрите на возможности composer по загрузке классов
    4) Очень много проблемных мест в коде, все перечислять очень долго, да и на данном этапе нет смысла, потому что все люди учатся и все делают ошибки, но вот явный косяк:
    exit('Класс ' . $class . ' не зарегистрирован');
    Я бы вам рекомендовал выбрасывать Exception в этом случае, а вы просто останавливаете скрипт.
    5) Вы бы делали дополнительно проверку на class_exists, а то может получиться так, что файл загрузили, а класса то в нем нет.
    Ответ написан
    1 комментарий
  • Почему Notice: Undefined variable при подключении файла через require. хотя переменная точно есть?

    return [
        'Route'   => '/core/system/autoload/',
        'handler' => '/core/system/config/'
    ];

    $a = require_once ('Classes.php');
    
        foreach ($a as $b => $c) {
            echo $b . '->' . $c . '<br>';
        }

    Впрочем, как правильно заметили, что-то там происходит )
    Ответ написан
    Комментировать
  • Почему Notice: Undefined variable при подключении файла через require. хотя переменная точно есть?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Между выводом $a и 19-й строкой происходит что-то ужасное.
    Мы не знаем, что
    Ответ написан
    3 комментария
  • Как получить данные из массива в другом классе?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Предложу свой "кривой" вариант (нормальный - с передачей аргументов в разные методы: проксирование нужно писать в функции __callStatic):
    class UrlParse
    {
        private $uri;
    
        function __construct()
        {
            $this->uri = $_SERVER['REQUEST_URI'];
        }
        
        public static function __callStatic($name, $arguments)
        {
        	switch ($name) {
            	case 'urlSelect':
            		$a = explode('/', parse_url($this->uri, PHP_URL_PATH));
            		$url = array(
                		'app' => $a[1],
                		'action' => $a[2]
            		);
            		return $url;
            		break;
            		
            	default: throw new Exception('Error: '.$name.'-method not found!');
        	}
        }
        
    }
    
    //Вызов метода (и создание экземпляра класса) - выполняется одной строкой
    echo UrlParse::urlSelect()['app'];
    Ответ написан
    2 комментария
  • Как получить данные из массива в другом классе?

    Compolomus
    @Compolomus Куратор тега PHP
    Комполом-быдлокодер
    Ну это может выглядет не красиво, но вполне работать будет, $url свойство лучше сделать приватным, на край можно добавить сахара . Например два метода, которые будут дергать тот или иной ключ с массива. Ещё можно вызывать urlSelect в конструкторе, и записывать эти два ключа в приватные свойства, и сделать два геттера, причём и свойство $url будет не нужно
    Ответ написан
    2 комментария