Php 从MySQL迁移到MySQLi

Php 从MySQL迁移到MySQLi,php,mysql,mysqli,Php,Mysql,Mysqli,谁能给我指一下正确的方向吗。我正在从MySql过渡到MySqli。通常我会使用下面的代码从数据库中进行选择,这样我就可以轻松地将列值用作工作变量: $SQLCommand = "SELECT * FROM table WHERE column1 = 'ok'"; $Data = mysql_query($SQLCommand); $DataRow = mysql_fetch_assoc($Data); $var1 = $DataRow["column1"]; $var2 = $DataRow[

谁能给我指一下正确的方向吗。我正在从
MySql
过渡到
MySqli
。通常我会使用下面的代码从数据库中进行选择,这样我就可以轻松地将列值用作工作变量:

$SQLCommand = "SELECT * FROM table WHERE column1 = 'ok'";
$Data = mysql_query($SQLCommand);
$DataRow = mysql_fetch_assoc($Data);

$var1 = $DataRow["column1"];
$var2 = $DataRow["column2"];
$var3 = $DataRow["column3"];
$var4 = $DataRow["column4"];
我已经研究过如何做类似的
MySql
,但是我发现使用循环等有很多不同的方法。有没有类似的方法(因为没有更好的描述)可以做同样的事情?提前谢谢。

他们应该是这样的

$mysqli = new mysqli("localhost", "my_user", "my_password", "my_db");
$SQLCommand = "SELECT * FROM table WHERE column1 = 'ok'";
$Data = $mysqli->query($SQLCommand);   
$DataRow = $mysqli->fetch_assoc($Data);

试试这个

直接转换是:

$Data = mysqli_query($connection, $SQLCommand);
$DataRow = mysqli_fetch_assoc($Data);
i
不同的是
mysqli\u查询
需要连接作为参数(大多数
mysqli\u*
函数也是如此)

MySQLi还具有面向对象的风格:

$Data = $connection->query($SQLCommand); // assuming you created the $connection object
$DataRow = $data->fetch_assoc();

我的建议是,在使用用户输入防止SQL注入时,使用mysqli prepared语句:

请参见下面的代码使用面向对象的方法和准备好的语句

<?php
$mysqli = new mysqli("example.com", "user", "password", "database");
if ($mysqli->connect_errno) {
    echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}

if (!$mysqli->query("DROP TABLE IF EXISTS test") ||
!$mysqli->query("CREATE TABLE test(id INT, label CHAR(1))") ||
!$mysqli->query("INSERT INTO test(id, label) VALUES (1, 'a')")) {
    echo "Table creation failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
/* Prepared statement, stage 1: prepare */
$stmt = $mysqli->prepare("SELECT id, label FROM test WHERE id = ?");

/* Prepared statement, stage 2: bind and execute */    
$id = 1;
//note below "i" is for integer, "s" can be used for string
if (!$stmt->bind_param("i", $id)) {
    echo "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error;
}
$stmt->execute();
$res = $stmt->get_result();
$row = $res->fetch_assoc();

printf("id = %s (%s)\n", $row['id'], gettype($row['id']));
printf("label = %s (%s)\n", $row['label'], gettype($row['label']));
?>

我想建议一种PDO替代方案,而不是随大流

$db = new PDO($dsn, 'username','password'); 
              //$dsn is the connection string to your database.
              //See documentation for examples

//The next two rows are optional, but i personally suggest them to
//ease developing, debugging (the 1st) and fetching results (the 2nd)

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

$stmt = $db->prepare("SELECT * FROM table WHERE column1 = :c1");
$stmt->bindValue(':c1', 'ok'); //This example is trivial and not necessary
                               //but it gains relevance when the bound value 
                               //is a variable
$rows = $stmt->fetchAll(); //if you expect a single row use fetch() instead

//do something with the results
您可以在此处阅读有关PDO的更多信息:

PDO最大的优点是它独立于应用程序使用的实际数据库。如果您想在将来更改数据库,例如SQLITE或PostgreSQL,那么唯一需要做的*更改就是
$dsn
连接字符串


[*]仅当您使用标准SQL查询且没有特定于供应商的内容时才正确。

不要忘记将链接作为参数发送/使用OOP样式-mysqli对象。我衷心建议使用PDO而不是mysqli什么是PDO等价物?OP:请参阅下面的答案。本机准备的语句在mysqli中不可用。有没有尝试过比这个简单的例子更复杂的东西?@YourCommonSense是的,我尝试过并使用了更复杂的语句,我需要实现一个库来处理Mysqli中的多个占位符,但我不知道为什么你否决了我?我是唯一一个使用mysqli的人吗?非常感谢你的回答。它为我指明了正确的方向。由于您在代码中的注释,这一切似乎都非常合理+1没有。实际上已经没有了。开发中的法律问题,因为它包含来自Microsoft和Oracle的代码。mysqli是一个不错的选择。你多久更换一次生产中的数据库?@chris你能为你的说法提供一个引证吗?德国一位最好的PHP顾问告诉我的。听起来像是口耳相传。如果你想相信这个人,那取决于你,对我来说,这是不可能的,因为他们可能是任何人。如果你觉得我的答案不充分,请随意添加你自己的答案。