How do I convert a script using mysql_ functions to use mysqli_ functions?
mysql, mysqli, pdo, php
Solution
Note: Converting from `mysql_` to `mysqli_` may not be optimal. Consider PDO if you're prepared to convert all of your code to OOP.
It can be tempting to try to replace all instances of `mysql_` with `mysqli_` and pray it works. You'd be close but not quite on point.
Connecting to the database:
Fortunately, `mysqli_connect` works closely enough to `mysql_query` that you can just swap out their function names.
mysql_:
$con = mysql_connect($host, $username, $password);
mysqli_:
$con = mysqli_connect($host, $username, $password);
Selecting a database
Now, with most of the other functions in the `mysqli_` library, you'll need to pass `mysqli_select_db` the database connection as its first parameter. Most of the `mysqli_` functions require the connection object first.
For this function, you can just switch the order of the arguments you pass to the function. If you didn't pass it a connection object before, you have to add it as the first parameter now.
mysql_:
mysql_select_db($dbname, $con);
mysqli_:
mysqli_select_db($con, $dbname);
As a bonus, you can also pass the database name as the fourth parameter to `mysqli_connect` - bypassing the need to call `mysqli_select_db`.
$con = mysqli_connect($host, $username, $password, $dbname);
Sanitize user input
Using `mysqli_real_escape_string` is very similar to `mysql_real_escape_string`. You just need to pass the connection object as the first parameter.
mysql_:
$value1 = mysql_real_escape_string($input_string);
mysqli_:
$value1 = mysqli_real_escape_string($con, $input_string);
Very Important: Preparing and Running a Query
One reason the `mysql_` functions were deprecated to begin with was their inability to handle prepared statements. If you simply convert your code to `mysqli_` without taking this important step, you are subject to some of the largest weaknesses of the `mysql_` functions.
It's worth reading these articles on prepared statements and their benefits:
Wikipedia - Prepared Statements
PHP.net - MySQLi Prepared Statements
Note: When using prepared statements, it's best to explicitly list each column you're attempting to query, rather than using the `*` notation to query all columns. This way you can ensure you've accounted for all of the columns in your call to `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);
}
Showing errors
Showing errors works a little differently with `mysqli_`. `mysqli_error` requires the connection object as its first parameter. But what if the connection failed? `mysqli_` introduces a small set of functions that don't require the connection object: the `mysqli_connect_*` functions.
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);
}
}
Problem
EDIT: Whether or not to use `mysqli_` is outside the scope of this question. Consider using PDO. What steps need to be taken to convert a script from using the deprecated `mysql_` functions to `mysqli_`? Is there anything that needs to be done differently when using `mysqli_` instead of `mysql`? Here's a basic script using `mysql_` functions: ``` <?php //define host, username and password $con = mysql_connect($host,$username,$password); if (!$con) { die('Could not connect: ' . mysql_error()); } $db_name ="db1"; mysql_select_db($dbname, $con); $value1 = mysql_real_escape_string($input_string); $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 />'; } mysql_close($con); ?> ```