Nota: Convirtiendo desde mysql_
a mysqli_
puede no ser óptimo. Considere PDO
si está preparado para convertir todo su código a OOP
.
Puede ser tentador tratar de reemplazar todas las instancias de mysql_
con mysqli_
y reza para que funcione. Estarías cerca pero no del todo en el punto.
Conectando a la base de datos:
Afortunadamente, mysqli_connect
funciona lo suficientemente cerca de mysql_query
que simplemente puede intercambiar los nombres de sus funciones.
mysql_:
$con = mysql_connect($host, $username, $password);
mysqli_:
$con = mysqli_connect($host, $username, $password);
Seleccionar una base de datos
Ahora, con la mayoría de las otras funciones en mysqli_
biblioteca, deberá pasar mysqli_select_db
la conexión a la base de datos como su primera parámetro. La mayoría de mysqli_
Las funciones requieren primero el objeto de conexión.
Para esta función, puede simplemente cambiar el orden de los argumentos que pasa a la función. Si no le pasó un objeto de conexión antes, debe agregarlo como el primer parámetro ahora.
mysql_:
mysql_select_db($dbname, $con);
mysqli_:
mysqli_select_db($con, $dbname);
Como beneficio adicional, también puede pasar el nombre de la base de datos como cuarto parámetro a mysqli_connect
- saltándose la necesidad de llamar a mysqli_select_db
.
$con = mysqli_connect($host, $username, $password, $dbname);
Desinfectar la entrada del usuario
Usando mysqli_real_escape_string
es muy similar a mysql_real_escape_string
. Solo necesita pasar el objeto de conexión como primer parámetro.
mysql_:
$value1 = mysql_real_escape_string($input_string);
mysqli_:
$value1 = mysqli_real_escape_string($con, $input_string);
Muy importante:preparar y ejecutar una consulta
Una razón por la que mysql_
funciones quedaron en desuso para empezar fue su incapacidad para manejar declaraciones preparadas. Si simplemente convierte su código a mysqli_
sin dar este importante paso, estará sujeto a algunas de las mayores debilidades de mysql_
funciones
Vale la pena leer estos artículos sobre declaraciones preparadas y sus beneficios:
Wikipedia - Declaraciones preparadas
PHP.net:declaraciones preparadas de MySQLi
Nota:cuando se usan declaraciones preparadas, es mejor enumerar explícitamente cada columna que intenta consultar, en lugar de usar el *
notación para consultar todas las columnas. De esta manera, puede asegurarse de haber tenido en cuenta todas las columnas en su llamada a mysqli_stmt_bind_result
.
mysql_:
$query = 'SELECT * FROM table1 WHERE table1.col1=' . $value1 . '';
$result = mysql_query($query, $con);
while($row = mysql_fetch_assoc*$result)
{
$col1 = $row['col1'];
$col2 = $row['col2'];
echo $col1 . ' ' . $col2 . '<br />';
}
mysqli_:
$query = 'SELECT col1,col2 FROM table1 WHERE table1.col1=?';
if ($stmt = mysqli_prepare($link, $query)) {
/* pass parameters to query */
mysqli_stmt_bind_param($stmt, "s", $value1);
/* run the query on the database */
mysqli_stmt_execute($stmt);
/* assign variable for each column to store results in */
mysqli_stmt_bind_result($stmt, $col1, $col2);
/* fetch values */
while (mysqli_stmt_fetch($stmt)) {
/*
on each fetch, the values for each column
in the results are automatically stored in
the variables we assigned using
"mysqli_stmt_bind_result"
*/
echo $col1 . ' ' . $col2 . '<br />';
}
/* close statement */
mysqli_stmt_close($stmt);
}
Mostrando errores
Mostrar errores funciona un poco diferente con mysqli_
. mysqli_error
requiere el objeto de conexión como su primer parámetro. Pero, ¿y si la conexión falla? mysqli_
introduce un pequeño conjunto de funciones que no requieren el objeto de conexión:el mysqli_connect_*
funciones.
mysql_:
if (!$con) {
die('Could not connect: ' . mysql_error());
}
if (!$result) {
die('SQL Error: ' . mysql_error());
}
mysqli_:
/* check connection error*/
if (mysqli_connect_errno()) {
die( 'Could not connect: ' . mysqli_connect_error() );
}
/* check query error */
if ($stmt = mysqli_prepare($link, $query)) {
// ... execute query
if (mysqli_stmt_error($stmt)) {
echo 'SQL Error: ' . mysqli_stmt_error($stmt);
}
}