update query new mysqli_query mysqli_num_rows mysqli_connect ejemplo php mysql mysqli

php - query - Conversión de mysql a mysqli: cómo obtener un objeto de conexión superglobal.



mysqli_query update (4)

Estoy tratando de convertir el código de mysql a mysqli. El código usa una única mysql_connect en un archivo que está incluido en todos los demás archivos.

mysql_connect devuelve un identificador de enlace MySQL que es superglobal, por lo que puede confiar en tener una conexión de base de datos disponible en cualquiera de sus funciones.

Parece que con mysqli_connect este no es el caso, el objeto devuelto no es global.

¿Esto significa que tengo que agregar: global $ mysqli; en la parte superior de cada función, o hay una manera de hacerlo un superglobal?


Confiar en el hecho de que PHP usará el último recurso de conexión abierto si no especifica uno, probablemente no sea una buena idea.
¿Qué sucede si su aplicación cambia y necesita dos conexiones, o la conexión no está allí?
Entonces parece que necesitas hacer algo de refactorización de todos modos.

Aquí hay una solución similar a la de Karsten que siempre devuelve el mismo objeto mysqli.

class DB { private static $mysqli; private function __construct(){} //no instantiation static function cxn() { if( !self::$mysqli ) { self::$mysqli = new mysqli(...); } return self::$mysqli; } } //use DB::cxn()->prepare(....


Para presentarle algunos detalles y resolver su problema, puede usar una clase como esta:

class MyDatabase { private static $_connection; public static function connect() { $mysqli = new mysqli(...); self::$_connection = $mysqli; } public static function getConnection() { return self::$_connection; } }

En su archivo de conexión de base de datos, cargaría esta clase y ejecutaría MyDatabase::connect(); una vez. Para obtener la conexión $ mysqli en cualquier lugar de su script, solo llame a MyDatabase::getConnection(); .


Usualmente hago una función:

$mysqli = new mysqli(...); function prepare($query) { global $mysqli; $stmt = $msqyli->prepare($query); if ($mysqli->error()) { // do something } return $stmt; } function doStuff() { $stmt = prepare("SELECT id, name, description FROM blah"); // and so on }

y luego llama eso. Habiendo dicho eso, desde entonces he abandonado a mysqli por estar demasiado lleno de errores como para considerarlo utilizable. Vergüenza realmente


Una forma muy simple de hacer esto sería con una clase de base de datos fija, solo para mantener el objeto de conexión mysqli:

class Database { public static $connection; } Database::$connection = new mysqli(HOST, USERNAME, PASSWORD, DATABASE);

Entonces puedes acceder a él de la manera normal:

$sql = ''SELECT * FROM table''; $result = Database::$connection->query($sql); $result = mysqli_query(Database::$connection, $sql); echo ''Server info '' . mysqli_get_server_info(Database::$connection);