注意:从 转换mysql_
为mysqli_
可能不是最佳的。如果您准备将所有代码转换为OOP ,请考虑使用PDO。
尝试替换mysql_
with的所有实例mysqli_
并祈祷它有效可能很诱人。你会很接近,但不是很准确。
连接数据库:
幸运的是,mysqli_connect
它的工作方式足够紧密mysql_query
,您可以换掉它们的函数名称。
mysql_:
$con = mysql_connect($host, $username, $password);
mysqli_:
$con = mysqli_connect($host, $username, $password);
选择数据库
现在,对于库中的大多数其他函数mysqli_
,您需要将mysqli_select_db
数据库连接作为其第一个参数传递。大多数mysqli_
功能首先需要连接对象。
对于此函数,您只需切换传递给函数的参数的顺序即可。如果您之前没有将连接对象传递给它,那么您现在必须将其添加为第一个参数。
mysql_:
mysql_select_db($dbname, $con);
mysqli_:
mysqli_select_db($con, $dbname);
作为奖励,您还可以将数据库名称作为第四个参数传递给mysqli_connect
- 绕过需要调用mysqli_select_db
.
$con = mysqli_connect($host, $username, $password, $dbname);
清理用户输入
使用mysqli_real_escape_string
与mysql_real_escape_string
. 您只需要将连接对象作为第一个参数传递。
mysql_:
$value1 = mysql_real_escape_string($input_string);
mysqli_:
$value1 = mysqli_real_escape_string($con, $input_string);
非常重要:准备和运行查询
mysql_
这些函数一开始就被弃用的原因之一是它们无法处理准备好的语句。如果您只是将代码转换为mysqli_
不采取这一重要步骤,那么您将受到这些mysql_
功能的一些最大弱点的影响。
值得阅读这些关于准备好的陈述及其好处的文章:
维基百科 - 准备好的陈述
PHP.net - MySQLi 准备好的语句
注意:使用准备好的语句时,最好明确列出您尝试查询的每一列,而不是使用*
表示法来查询所有列。通过这种方式,您可以确保您已将调用中的所有列都计算在内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);
}
显示错误
显示错误与mysqli_
. mysqli_error
需要连接对象作为其第一个参数。但是如果连接失败怎么办?mysqli_
引入了一小组不需要连接对象的函数:mysqli_connect_*
函数。
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);
}
}