query mysqli_select_db mysqli_real_escape_string mysqli_connect mysql_query mysql_connect ejemplos php mysql function mysqli

php - mysqli_select_db - mysqli_real_escape_string



PHP cambiando a mysqli ¿Mysqli_connection no es global? (3)

Necesita configurar su variable $ mysqli para que sea global si lo necesita en funciones.

Algo como esto:

... function name (){ global $mysqli; ...

Acabo de comenzar un nuevo proyecto de PHP y estaba pensando que es hora de seguir la sugerencia de php y dejar de usar mysql y swith a mysqli. Pero esto me dio un problema.

Normalmente mi configuración es así

Archivo Index.php y dentro de este archivo tengo un 2 requieren declaraciones. Uno que pide el archivo db.php y otro para llamar a un archivo functions.php. Hasta aquí todo bien.

En el archivo functions.php a tiene muchas funciones diferentes que se usan en toda la página principal y muchas de ellas usan SQL. Con php old mysql API esto no fue un problema, pero parece que las nuevas aplicaciones mysqli no permiten que las conexiones se utilicen desde los archivos incluidos ???

Por ejemplo, en mi db.php tengo la declaración de conexión. $db = mysql_connect(*******); Y en mi function.php tengo mysql_query(******) y funciona perfecto.

Pero si cambio el db.php a $db = mysqli_connect(*****); Luego, en mi archivo function.php no puedo llamar a mysqli_query(***) . (También probé orientado a objetos, pero me da el mismo problema).

Entonces, ¿cómo evitar este problema? ¿Está php esperando que coloque la instrucción mysqli_connect al comienzo de cada archivo que usa sentencias sql?


Sí, MySQLi está orientado a objetos y necesita pasar el objeto $db a las funciones que necesitan una conexión de base de datos. Las alternativas de procedimiento también requieren que el objeto $db funcione. Esto es por su propio bien, ya que las conexiones globales implícitas (en realidad: estado global en cualquier forma) son malas prácticas. Que la extensión mysql permitiera conexiones implícitas no era bueno para empezar.


Aquí hay una opción: crear una clase estática puramente para mantener el objeto mysqli como una variable pública estática:

class DBi { public static $conn; } DBi::$conn = new mysqli(HOST, USER, PASS, DB);

... en un archivo de inclusión, ayudante de base de datos o lo que sea.

Entonces, donde sea que quieras hacer una llamada mysqli, hazlo

DBi::$conn->query(...)

Lo hace tan global como podrías desear. Y puede comenzar fácilmente a mostrar sus propias funciones (métodos) personalizados allí si siente la necesidad - DBi :: custom_method ()

Esto es una especie de refinamiento de la respuesta dada en Conversión de mysql a mysqli - ¿cómo obtener un objeto de conexión superglobal?