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);
}
}