Pregunta

Estoy tratando de convertir el código de mysql a mysqli. El código usa un solo mysql_connect en un archivo que está incluido en cualquier otro archivo.

mysql_connect devuelve un identificador de enlace MySQL que es un superglobal para que pueda confiar en tener una conexión de base de datos disponible en cualquiera de sus propias 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 alguna manera de convertirlo en un superglobal?

¿Fue útil?

Solución

Confiar en el hecho de que PHP usará el último recurso de conexión abierto si no especifica uno, probablemente no sea una muy buena idea.
¿Qué sucede si su aplicación cambia y necesita dos conexiones, o si la conexión no está allí?
Por lo tanto, parece que necesita refactorizar 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(....

Otros consejos

Normalmente 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 llamar a eso. Dicho esto, desde entonces he abandonado mysqli por estar demasiado lleno de errores para ser considerado utilizable. Vergüenza de verdad.

Para presentarte un poco de oop y resolver tu problema, puedes 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 parte de su script, simplemente llame al MyDatabase::getConnection();.

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

class Database {
    public static $connection;
}

Database::$connection = new mysqli(HOST, USERNAME, PASSWORD, DATABASE);

Entonces puede 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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top