utf8 consultas conexion con close clase php mysql pdo

consultas - PHP PDO conecta y cierra la conexión en diferentes funciones



pdo utf8 mysql (3)

Tal vez esta es una pregunta tonta, pero soy muy nuevo en PDO y estoy confundido. ¿Es posible instanciar un objeto PDO en una función (abrir una conexión a un servidor / db) y luego cerrar la misma conexión en otra función? ¿Las funciones necesitan pasar el objeto para poder cerrarlo? Quiero hacer esto para poder crear una función ubicua para todo el sitio a la que pueda llamar para iniciar una conexión, ejecutar sql no genérico y luego cerrarla con otra función para todo el sitio. ¿Cómo puedo hacer esto? ¿Debo pasar el objeto a estas funciones como argumentos?


Sí, esto es posible Recomiendo usar un constructor que inicie una conexión a MySQL y un destructor que lo anule. De esta forma, no tendrá que llamar manualmente a la función cada vez que quiera abrir y cerrar la conexión. La conexión se abrirá cada vez que se llame a una nueva instancia del objeto, y cuando no haya más referencias al objeto, la conexión se anulará.

Puede parecerse a esto:

private $l; //MySQL Connection //Called automatically upon initiation function __construct() { try { $this->l = new PDO("mysql:host=".MYSQL_HOST.";dbname=".MYSQL_DATABASE, MYSQL_USER, MYSQL_PASSWORD); //Initiates connection $this->l->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); // Sets error mode } catch (PDOException $e) { file_put_contents("log/dberror.log", "Date: " . date(''M j Y - G:i:s'') . " ---- Error: " . $e->getMessage().PHP_EOL, FILE_APPEND); die($e->getMessage()); // Log and display error in the event that there is an issue connecting } } //Called automatically when there are no further references to object function __destruct() { try { $this->l = null; //Closes connection } catch (PDOException $e) { file_put_contents("log/dberror.log", "Date: " . date(''M j Y - G:i:s'') . " ---- Error: " . $e->getMessage().PHP_EOL, FILE_APPEND); die($e->getMessage()); } }

Puede encontrar útil esta referencia sobre constructores y destructores: http://php.net/manual/en/language.oop5.decon.php


Según tengo entendido, solo tiene que conectarse a la base de datos una vez y no tiene que abrir una conexión para cada función. La conexión de la base de datos se cerrará automáticamente, pero puede cerrarla manualmente asignando el valor nulo al objeto PDO.

La conexión se realiza cuando crea una instancia del objeto PDO.

$dbh = new PDO("mysql:host=$hostname;dbname=mysql", $username, $password);

y se cierra automáticamente al final del script o cuando le asigna un valor nulo

$dbh = null;

Una guía útil aquí


así podría, por ejemplo, tener una clase de trabajador principal en php que crea una instancia de un objeto DBRoutines en su clase. Las referencias a objetos residen como var / object protegido en el trabajador, pero realizan -> llamadas a todas las rutinas DB en la clase DB. y más tarde en su ciclo de vida llama a la función DB :: Close. Tan seguro.

index.php:

class Xcrud { protected static $firephp; protected static $_instance = array();

...

...

$db = Xcrud_db::get_instance($this->connection); $db->query("SELECT `{$field}` FROM `{$this->table}` WHERE `{$this->primary}` = " . $db->escape($this->primary_key) . " LIMIT 1");

xcrud_db.php:

class Xcrud_db { protected static $firephp; private static $_instance = array(); private $connect; private $result; private $dbhost; private $dbuser; private $dbpass; private $dbname; private $dbencoding; public static function get_instance($params = false) { some code } private function __construct($dbuser, $dbpass, $dbname, $dbhost, $dbencoding) { $this->firephp = FirePHP::getInstance(true); $this->firephp->setEnabled(true); //$this->firephp->log(''xcrud_db.php:__construct''); if (strpos($dbhost, '':'') !== false) { list($host, $port) = explode('':'', $dbhost, 2); $this->connect = mysqli_connect($host, $dbuser, $dbpass, $dbname, $port); } else $this->connect = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname); if (!$this->connect) $this->error(''Connection error. Can not connect to database''); $this->connect->set_charset(str_replace(''-'', '''', $dbencoding)); if ($this->connect->error) $this->error($this->connect->error); } public function query($query = '''') { $this->firephp->log(''xcrud_db.php:query=''.$query); $this->result = $this->connect->query($query); //echo $query; if ($this->connect->error) $this->error($this->connect->error); return $this->connect->affected_rows; } etc