Probablemente estoy haciendo algo realmente estúpido, pero este es el trato. He creado una clase llamada Base de datos, es muy simple y tiene solo 2 funciones. Solo por abrir y cerrar la conexión mysqli.
<?php
error_reporting(E_ALL);
require_once("sdl_config.php");
class Database {
/* Open the connection with the database */
public function OpenConnection() {
$mysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
if($mysqli->connect_error) {
die("Connection Error (" . $mysqli->connect_errno . ") " . $mysqli->connect_error );
} else {
echo "Connection Succeeded";
}
}
/* Close the connection with the database */
public function CloseConnection() {
if($mysqli) {
$mysqli->close();
echo "Connection Closed";
} else {
echo "Connection does not exist";
}
}
}
Para probar esto, he creado otra página simplemente llamando a las 2 funciones.
<?php
require_once("include/class.database.php");
Database::OpenConnection();
Database::CloseConnection();
La apertura de la conexión funciona perfectamente, pero el problema se presenta en la función CloseConnection. Nunca encontrará la variable $ mysqli, ¿cómo es esto posible cuando la he abierto la línea antes?
También, he leído que algunas personas dicen que el cierrela conexión manualmente es algo obsoleta y otros dicen que es mejor hacerlo. Entonces, ¿cuál es la mejor práctica aquí y CUÁNDO se debe cerrar la conexión?
Gracias de antemano.
Respuestas
3 para la respuesta № 1Las variables definidas dentro de las funciones son locales y visibles solo dentro de esa función.
Debe usar lo que OOP nos permite hacer y convertir esa variable en una propiedad de clase:
class Database {
private $mysqli;
/* Open the connection with the database */
public function OpenConnection() {
$this->mysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
if($this->mysqli->connect_error) {
die("Connection Error (" . $this->mysqli->connect_errno . ") " . $this->mysqli->connect_error );
} else {
echo "Connection Succeeded";
}
}
/* Close the connection with the database */
public function CloseConnection() {
if($this->mysqli) {
$this->mysqli->close();
echo "Connection Closed";
} else {
echo "Connection does not exist";
}
}
}
Pero ahora necesitas usar el objeto de una clase:
<?php
require_once("include/class.database.php");
$db = new Database;
$db->OpenConnection();
$db->CloseConnection();
Referencia: