php - mysqli_select_db - Moviéndose desde la conexión mysql a mysqli
mysqli_query php ejemplo (2)
- Tienes todo el tiempo del mundo, ya que nunca dejarán de trabajar por su cuenta.
- Sí, hay varias formas de hacer esto.
- Sí, pero no hay una solución única para todos. Cada situación es diferente y lo que es apropiado para su situación particular puede no ser adecuado para cada situación.
En primer lugar, el antiguo ext / mysql está en desuso a partir de PHP 5.5.0, pero nunca dejará de funcionar por completo, ya que la extensión en sí misma se trasladará al repositorio PHP PECL ( cuando llega el momento de eliminarlo ). Sin embargo, todavía no hemos llegado y solo se verá afectado cuando elija actualizarse a esa versión de PHP. No hay un tiempo exacto determinado para la eliminación de la extensión.
En segundo lugar, puede usar una variable para almacenar la conexión de la base de datos tal como lo hacía la antigua extensión ext / mysql detrás de las escenas. El truco fue que no sabías lo que estaba haciendo (utiliza la última conexión abierta que creaste cuando llamaste a mysql_connect y la usa cada vez que llamas a algo como mysql_query para acceder a la base de datos).
Puede hacer esto con una variable estática en su función utilizando el estilo de procedimiento ....
function openDBConn() {
static $link;
if (!isset($link)) {
$link = mysqli_connect(''localhost'', ''my_user'', ''my_password'', ''my_db'');
}
return $link; // returns the link
}
O puede hacer esto con una variable estática de clase usando OOP ...
Class MyDBConnect {
public static $link;
public function openDBConn() {
if (!isset(static::$link)) {
static::$link = new mysqli(''localhost'', ''my_user'', ''my_password'', ''my_db'');
}
}
}
Quiero alentarlo a que use las nuevas API y lo elogio por ello, pero también quiero advertirle a medida que avanza. Cuando empiece a trasladar sus funciones desde las viejas funciones ext / mysql a la nueva extensión mysqli, tenga cuidado de no pasar también por las malas prácticas de la antigua extensión (como el uso de la antigua concatenación de cadenas SQL y técnicas de escape ext / mysql ofrecido). En cambio, aproveche las declaraciones preparadas de MySQLi y las consultas parametrizadas .
A lo que quiero dirigir su atención son a los beneficios de utilizar las nuevas API para interactuar con su base de datos MySQL (es decir, PDO y MySQLi ).
Tengo una función que solía usar con mis scripts. openDBConn()
y closeDBConn()
Ambos llamaron a la función mysql_connect()
. Usado como se ve a continuación
openDBConn();
$car_model = getCarModel($car_id);
$car_color = getCarColor($car_id);
closeDBConn();
hacerlo de esta manera también me permite hacer lo siguiente
openDBConn();
mysqlStartTranscation();
upgradeCarColor($car_id);
addNewWing($car_id);
mysqlCommit();
closeDBConn();
El dilema ahora es que si me muevo a mysqli, tendré que pasar el enlace de conexión.
También he leído que mysql_ * está en desuso, las preguntas que tengo son:
- ¿Cuánto tiempo tengo antes de que la mayoría de mis funciones dejen de funcionar?
- ¿Hay alguna forma actual o futura de acceder a la conexión mysqli actual ya que agregar parámetros adicionales a mis funciones será un problema?
- ¿Existe alguna forma de codificación adecuada para acceder al enlace de conexión mysqli actual de forma procesal? Si no es de procedimiento, ¿cuál es el mejor en una forma de POO?
Antes que nada le doy +1 a tu pregunta, ya que es algo bueno que comiences tu migración.
OOP y argumento
Acerca de la programación OOP y la aprobación de argumentos, aquí hay una solución que se basa en el patrón de Singleton Factory:
class MysqliConnection{
private static $connection = null;
public static function getConnection(){
if(self::$connection === null){
//Here get some routine to make your configuration extern
self::$connection = new Mysqli(/*args*/);
}
return self::$connection;
}
Cuando desee enviar una consulta, puede usarla así:
function methodWhichSendsAQuery(){
$mysqli = MysqliConnection::getConnection();
$query = $mysqli->prepare(/*your query*/);
/*some param bindings with $query->bindParam()*/
$query->execute();
return $query->fetchAll(); //an array with all results
}
Prefiero esta solución sobre las otras ya que es limpia, legible y no depende de variables globales. El Principio de Responsabilidad Individual es respetado y está bien.
Refactoring mysql_ a mysqli
La refactorización puede ser realmente difícil si se utilizara para manejar mysql_ a la vieja usanza, es decir, sin el argumento de recursos, mysql_escape_string
, etc. y así sucesivamente.
Mysql proporcionó un script que es bueno para migrar de mysql_ a mysqli here y puede obtener más información here .
Lo que puedo decirle es que mysqli brinda una funcionalidad llamada "declaración preparada" que es realmente poderosa y sólida en cuanto a la seguridad. La forma en que mysqli maneja la declaración preparada es menos fácil de usar que la forma en que PDO lo hace, pero las propiedades son las mismas.