Приветствую. У меня трабл. Я использую PDO и столкнулся с проблемой экранирования у меня бывают записи с кавычками " или ' или ` Так вот я читал где-то что PDO экранирует сразу текст но как показывает практика нет. Я пишу текст с кавычками и он текст просто обрубает и все. Есть идеи ? Методы с mysql_escape_string не работают.
это лишнее. откройте документацию по PDO и посмотрите примеры кода. плейсхолдеры помогут. и ненадо будет ручками эскейпить
Мне видимо легче свой код показать чтоб всем все понятно было, я давно писал класс с PDO Код (Text): class Database{ private $host = DB_HOST; private $user = DB_USER; private $pass = DB_PASS; private $dbname = DB_NAME; private $charset = CHARSET; private $dbh; public $error; private $stmt; public function __construct(){ // Установить DSN $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname . ';charset=' . $this->charset; // Настройка параметров $options = array( PDO::ATTR_PERSISTENT => true, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION //PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8" ); // Создает новый объект PDO try{$this->dbh = new PDO($dsn, $this->user, $this->pass, $options);} // Ловим ошибки catch(PDOException $e){$this->error = $e->getMessage()."\r\n";} } public function query($query){ $this->stmt = $this->dbh->prepare($query); } public function bind($param, $value, $type = null){ try{ if (is_null($type)) { switch (true) { case is_int($value): $type = PDO::PARAM_INT; break; case is_bool($value): $type = PDO::PARAM_BOOL; break; case is_null($value): $type = PDO::PARAM_NULL; break; default: $type = PDO::PARAM_STR; } } $this->stmt->bindValue($param, $value, $type); }catch(PDOException $e){$this->error = $e->getMessage()."\r\n";} } public function execute(){//Запускает подготовленный запрос на выполнение try{ return $this->stmt->execute(); }catch(PDOException $e){$this->error = $e->getMessage()."\r\n";} } public function resultset(){//Возвращает массив, содержащий все строки результирующего набора try{ $this->execute(); return $this->stmt->fetchAll(PDO::FETCH_BOTH); }catch(PDOException $e){$this->error = $e->getMessage()."\r\n";} } public function single(){//Извлечение следующей строки из результирующего набора try{ $this->execute(); return $this->stmt->fetch(PDO::FETCH_BOTH); }catch(PDOException $e){$this->error = $e->getMessage()."\r\n";} } public function rowCount(){//Возвращает количество строк, модифицированных последним SQL запросом return $this->stmt->rowCount(); } public function lastInsertId(){//возвращает последним добавленным идентификатором в виде строки return $this->dbh->lastInsertId(); } public function beginTransaction(){//начать транзакцию return $this->dbh->beginTransaction(); } public function endTransaction(){//Для завершения транзакции и зафиксировать изменения return $this->dbh->commit(); } public function cancelTransaction(){//Чтобы отменить транзакцию и выполнить откат изменений return $this->dbh->rollBack(); } public function debugDumpParams(){//Параметры , методы Дебютный Dump сбрасывает информацию , которая содержится в подготовленном заявлении. return $this->stmt->debugDumpParams(); } } Может так сможете подсказать что подредактировать И еще бывает что надо несколько подключений на сайте можете подсказать как это сделать я вот сейчас делаю так $database = new Database(); А чтобы разные подключения типа такого $database = new Database(1); $database = new Database(2);
Всё намного проще PHP: <?php class MySQL { protected static $connection = null; public static function connection() { if (self::$connection === null) { try { $dsn = 'mysql:host=' . DB_HOST . ';dbname=' . DB_NAME . ';charset=' . DB_CHAR; $opt = [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]; self::$connection = new PDO($dsn, DB_USER, DB_PASS, $opt); } catch (PDOException $error) { die($error->getMessage()); } } return self::$connection; } public static function run($sql, $params = []) { $query = self::connection()->prepare($sql); if (array_key_exists(0, $params)) { $i = 1; foreach ($params as $value) { $query->bindValue($i++, $value, self::type($value)); } } else { foreach ($params as $key => $value) { $query->bindValue($key, $value, self::type($value)); } } $query->execute(); return $query; } public static function type($value) { if (is_int($value)) { $type = PDO::PARAM_INT; } elseif (is_string($value) || is_float($value)) { $type = PDO::PARAM_STR; } elseif (is_bool($value)) { $type = PDO::PARAM_BOOL; } elseif (is_null($value)) { $type = PDO::PARAM_NULL; } else { $type = false; } return $type; } } Несколько подключений не нужно, нужно сделать просто вызов класса для PDO в любом месте и в любое время PHP: define('DB_HOST', 'localhost'); define('DB_NAME', 'database'); define('DB_CHAR', 'utf8'); define('DB_USER', 'root'); define('DB_PASS', ''); spl_autoload_register(function ($class) { require_once "{$class}.php"; });
Вы меня немного не поняли у меня бывает необходимость работать с 2-5 подключениями в моей админки и я на каждое подключение дублирую класс PDO но это детский сад я понимаю и надо как то по профисиональней сделать чтоб было переключение при вызове класса --- Добавлено --- Интересное у вас представление о новичках если у вас в понимании новички работают с классами и функциями то я удивлен. не думаю что вы сразу начали писать через классы не зная основы.
А по точнее, ведь параметры подключения надо чтоб дергались при вызове класса, а каждый раз их передовать это не безопасно лучше их хранить в классе через "private "
нет ничего опасного в том чтобы передать логин и пароль в конструктор объекта. хранить настройки надо не "зашитыми" в класс, а в отдельном файле - конфиге. при старте приложения читать их оттуда и передавать в нужные места для инициализации зависимых компонентов.
у вас одновременно несколько серверов баз данных что нужны разные подключения? --- Добавлено --- почти все движки отдельно хранят данные для подключения. . я вообще у себя все настройки приложения храню в отдельном файле а потом загружаю их в реестр)