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);
?>
To migrate it to MySQLi, we use the mysqli_select_db method to select the database and then the mysqli_query method to run the query and return the result. This statement is replaced with the mysqli_query method using the DROP DATABASE sql... This is a simple name change.
Return Values ¶ For successful queries which produce a result set, such as SELECT, SHOW, DESCRIBE or EXPLAIN , mysqli_query() will return a mysqli_result object. For other successful queries, mysqli_query() will return true .
It is possible to include both MySQL and MySQLi when connecting to a single database, but it is incredibly delicate and with large amounts of data being passed through it can get very messy and hard to control. it is best to use MySQLi in general in my opinion because it is much more secure and up to date.
There are several important differences between the two libraries: Mysqli supports charsets, mysql does not. Mysqli supports prepared statements, mysql does not. Mysql does not support multiple statements, mysqli does.
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.
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);
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);
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);
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 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);
}
}
EXAMPLE.
This is your dbc class
<?php
class dbc {
public $dbserver = 'server';
public $dbusername = 'user';
public $dbpassword = 'pass';
public $dbname = 'db';
function openDb() {
try {
$db = new PDO('mysql:host=' . $this->dbserver . ';dbname=' . $this->dbname . ';charset=utf8', '' . $this->dbusername . '', '' . $this->dbpassword . '');
} catch (PDOException $e) {
die("error, please try again");
}
return $db;
}
function getAllData($qty) {
//prepared query to prevent SQL injections
$query = "select * from TABLE where qty = ?";
$stmt = $this->openDb()->prepare($query);
$stmt->bindValue(1, $qty, PDO::PARAM_INT);
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
return $rows;
}
?>
your PHP page:
<?php
require "dbc.php";
$getList = $db->getAllData(25);
foreach ($getList as $key=> $row) {
echo $row['columnName'] .' key: '. $key;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With