编辑: 是否使用mysqli_不在此问题的范围内。考虑使用PDO。
mysqli_
需要采取什么步骤将脚本从使用不赞成使用的mysql_功能转换为mysqli_?
mysql_
使用mysqli_代替时,是否需要采取其他不同的措施mysql?
mysql
这是使用mysql_函数的基本脚本:
<?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); ?>
从转换mysql_到mysqli_可能不是最佳的。如果您准备将所有代码转换为OOP,请考虑使用 PDO 。
这是很有诱惑力的尝试更换的所有实例mysql_与mysqli_祈祷它的工作原理。您会很亲密,但不是很准。
幸运的是,该方法与您可以交换它们的功能名称mysqli_connect足够接近mysql_query。
mysqli_connect
mysql_query
mysql_:
$con = mysql_connect($host, $username, $password);
mysqli_:
$con = mysqli_connect($host, $username, $password);
现在,利用mysqli_库中的大多数其他功能,您需要mysqli_select_db将数据库连接作为其 第一个 参数传递。大多数mysqli_功能首先需要连接对象。
mysqli_select_db
对于此函数,您只需切换传递给该函数的参数的顺序即可。如果您之前未将其传递给连接对象,则 必须立即将其添加为第一个参数。
mysql_select_db($dbname, $con);
mysqli_select_db($con, $dbname);
另外,您还可以将数据库名称作为第四个参数传递,从而mysqli_connect绕过了call的需要mysqli_select_db。
$con = mysqli_connect($host, $username, $password, $dbname);
使用mysqli_real_escape_string与十分相似mysql_real_escape_string。您只需要传递连接对象作为第一个参数。
mysqli_real_escape_string
mysql_real_escape_string
$value1 = mysql_real_escape_string($input_string);
$value1 = mysqli_real_escape_string($con, $input_string);
mysql_不建议使用功能的原因之一是它们无法处理预准备的语句。如果您只是简单地将代码转换为,mysqli_而没有采取此重要步骤,则可能会遇到一些功能上的最大弱点mysql_。
值得阅读有关准备好的语句及其好处的这些文章:
维基百科-预备陈述
PHP.net-MySQLi准备的语句
注意:使用准备好的语句时,最好显式列出要尝试查询的每一列,而不是使用*表示法查询所有列。这样,您可以确保已计入对的调用中的所有列mysqli_stmt_bind_result。
*
mysqli_stmt_bind_result
$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 />'; }
$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_*函数:函数。
mysqli_error
mysqli_connect_*
if (!$con) { die('Could not connect: ' . mysql_error()); } if (!$result) { die('SQL Error: ' . mysql_error()); }
/* 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); } }