PHP MySQLi
在本教程中,我们将学习与MySQL数据库一起使用的PHP的MySQLi扩展。
什么是MySQLi?
PHP MySQLi扩展是mysql扩展的改进版本,我们使用它来处理MySQL数据库。
不建议使用mysql扩展名访问生产环境中的数据库,因为它不受保护,并且自PHP 5.5.0起已弃用,并且已从PHP 7.0.0中删除。
如何建立MySQLi连接?
我们使用mysqli()构造函数创建一个MySQLi连接。
在下面的示例中,我们将创建一个连接到" mydb"数据库的连接。
//constants
define('DB_HOST', 'localhost');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', 'root123');
define('DB_NAME', 'mydb');
//create a connection
$mysqlicon = new mysqli(DB_HOST, DB_USERNAME, DB_PASSWORD, DB_NAME);
在上面的代码中," DB_HOST"保存了主机字符串,在这种情况下为" localhost"。
" DB_USERNAME"持有数据库的用户名,在上述情况下为" root"。
" DB_PASSWORD"是数据库用户的密码,在上面的示例中是" root123"。
我通常仅将" root123"密码用于演示目的。
始终使用强密码。
" DB_NAME"保存数据库名称。
还有另一种连接数据库的方法。
在下面的示例中,我们连接到数据库,然后选择数据库。
//constants
define('DB_HOST', 'localhost');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', 'root123');
define('DB_NAME', 'mydb');
//create object of mysqli class
$mysqlicon = new mysqli();
//now connect to a database
$mysqlicon->connect(DB_HOST, DB_USERNAME, DB_PASSWORD, DB_NAME);
在本课程中,我们将使用$mysqlicon作为mysqli类的对象。
如何选择一个数据库?
要选择数据库,我们使用" select_db()"方法。
//connect to myblog database
$mysqlicon->select_db('myblog');
始终关闭连接
始终使用close()方法关闭数据库连接是一个好习惯。
//close connection $mysqlicon->close();
MySQLi错误代码
如果最后执行的MySQLi方法失败,我们使用errno获取错误代码。
如果没有错误发生,则返回0。
//check error
if ($mysqlicon->errno !== 0) {
die("Error occured " . $mysqli->errno);
}
在上面的代码中,如果最后执行的MySQLi方法发生错误,则$mysqlicon-> errno不会为0。
因此,我们将通过使用die()函数停止进一步执行并打印出错误码。
MySQLi错误消息
我们使用error打印出错误信息。
//check error
if ($mysqlicon->errno !== 0) {
die("Error Code: " . $mysqli->errno . " Message: " . $mysqli->error);
}
检索结果占用的可用内存
在使用结果后,通过使用free()方法释放内存是一个好习惯。
检索数据
为了从表中检索数据,我们使用" SELECT"查询。
为了使用MySQLi获取数据,我们使用query方法。
在下面的示例中,我们将从'student'表中获取'studentid','name'和'branch'列。
每次查询将总共获取10条记录。
//query
$query = sprintf("SELECT studentid, name, branch FROM student LIMIT 0,10");
//execute query and get result
$result = $mysqlicon->query($query);
//loop through the result and print
foreach ($result as $row) {
printf("ID: " . $row['studentid'] . " Name: " . $row['name'] . " Branch: " . $row['branch'] . "\n");
}
//free the memory taken by query result
$result->free();
//close connection
$mysqlicon->close();
另外,我们可以使用fetch_assoc()方法将数据作为关联数组进行检索。
如果结果集中没有行,它将返回NULL。
//query
$query = sprintf("SELECT studentid, name, branch FROM student LIMIT 0,10");
//execute query and get result
$result = $mysqlicon->query($query);
//get associative array and loop through row-by-row
while ($row = $result->fetch_assoc()) {
printf("ID: " . $row['studentid'] . " Name: " . $row['name'] . " Branch: " . $row['branch'] . "\n");
}
返回多少行?
要知道执行SELECT查询时返回的行数,我们使用num_rows。
//query
$query = sprintf("SELECT studentid, name, branch FROM student LIMIT 0,10");
//execute query and get result
$result = $mysqlicon->query($query);
//display total number of rows returned
printf("Rows: %d", $mysqlicon->num_rows);
有多少行受到影响?
当我们执行INSERT时,UPDATE和DELETE查询行会受到影响,并使用affected_rows来了解被执行的查询影响的行数。
在下面的代码中,我们将打印出受影响的行数。
//execute query
$result = $mysqlicon->query($query);
printf("Affected Rows: %d", $mysqlicon->affected_rows);
插入数据
要插入数据,我们使用INSERT查询和query()方法。
在下面的示例中,我们将学生数据插入到学生表中。
//query
$query = sprintf("INSERT INTO student (`studentid`, `name`, `branch`) VALUES ('%s', '%s', '%s')", 's123-456', 'theitroad', 'CSE');
//execute query
$result = $mysqlicon->query($query);
printf("Inserted Rows: %d", $mysqlicon->affected_rows); //this will print "Inserted Rows: 1"
更新数据
为了更新数据,我们使用UPDATE查询和query方法。
在下面的代码中,我们将更新'student'表,并将Studentid ='123'的名称设置为'Alice'。
//query
$query = sprintf("UPDATE student SET name = '%s' WHERE studentid = '%s'", 'Alice', '123');
//execute query
$result = $mysqlicon->query($query);
printf("Updated Rows: %d", $mysqlicon->affected_rows); //this will print "Updated Rows: 1"
删除数据
要删除数据,我们使用DELETE查询和query方法。
在下面的代码中,我们从学生表中删除studentid ='123'的记录。
//query
$query = sprintf("DELETE FROM student WHERE studentid = '%s'", '123');
//execute query
$result = $mysqlicon->query($query);
printf("Deleted Rows: %d", $mysqlicon->affected_rows); //this will print "Deleted Rows: 1"
prepare语句
当我们想使用相同或者不同的参数多次执行查询时,我们使用prepared语句。
如何创建prepare语句?
为了创建一个准备好的语句,我们使用了" prepare()"方法。
在下面的示例中,我们将创建一个语句对象,然后准备要执行的语句。
//create a statement object $stmt = $mysqlicon->stmt_init(); //prepare statement for execution $stmt->prepare($query);
如何执行prepare语句?
为了执行准备好的语句,我们使用exeute()方法。
//execute a prepared statment $stmt->execute();
释放prepare语句资源
释放使用后准备好的语句所拥有的资源是一个好习惯。
为此,我们使用close()方法。
//release resource $stmt->close();
释放的数据占用的可用内存
我们使用free()方法释放准备好的语句的检索结果所占用的内存。
prepare语句的类型
有两种类型的prepare语句。
- 绑定参数
- 绑定结果
prepare语句-绑定参数
当我们想将查询保存到MySQL服务器时使用绑定参数,然后仅将更改的数据发送到服务器以与查询集成并执行。
一个很好的例子是对学生表的多次INSERT查询。
查询的基本结构保持不变,只有要插入的数据发生变化。
prepare语句-约束结果
这使我们可以将变量与检索到的字段绑定到结果集。
示例:SELECT查询中返回的字段可以与变量绑定。
如何绑定参数?
要将参数绑定到准备好的语句,我们使用bind_param()方法。
传递给该方法的第一个参数是"类型"。
它告诉我们随后的变量的数据类型。
以下是此方法允许的类型。
- i为整数类型
- d用于浮点型和双精度型
- b代表斑点类型
- s用于字符串和所有其他类型
在下面的示例中,我们有一个bind_param()用于整数,浮点数和字符串类型变量。
var1和var2是整数类型。
var3是float类型,而var4是字符串类型。
$stmt->bind_param("iids", $var1, $var2, $var3, $var4);
如何存储结果集?
在执行准备好的语句后,我们使用store_result()方法存储结果集。
$stmt->store_result();
查找返回的行总数
存储结果集后,我们可以使用num_rows通过SELECT查询找到返回的行总数。
$stmt->num_rows;
查找受影响的行总数
为了通过INSERT,UPDATE和DELETE查询找到受影响的行总数,我们使用affected_rows。
$stmt->affected_rows;
使用INSERT查询的绑定参数示例
在下面的示例中,我们将使用bind_param()方法将数据插入到Student表中。
/**
* array of data
*/
$arrdata = array(
array(
"studentid" => "s101",
"name" => "Alice",
"branch" => "CSE"
),
array(
"studentid" => "s102",
"name" => "Bob",
"branch" => "ECE"
),
array(
"studentid" => "s102",
"name" => "Eve",
"branch" => "ME"
)
);
//query
$query = sprintf("INSERT INTO student (`studentid`, `name`, `branch`) VALUES (?, ?, ?)");
//create statement object
$stmt = $mysqlicon->stmt_init();
//prepare the statement for execution
$stmt->prepare($query);
//bind parameters
$stmt->bind_param("sss", $studentid, $name, $branch);
//loop through array of data
foreach ($arrdata as $row) {
$studentid = $row['studentid'];
$name = $row['name'];
$branch = $row['branch'];
//execute the prepared statment
$stmt->execute();
//print affected rows
printf("Affected Rows by Insert Query: %d", $stmt->affected_rows); //this will print "Affected Rows by Insert Query: 1" for every insert query execution
}
//release prepared statment resource
$stmt->close();
//close connection
$mysqlicon->close();
如何绑定结果?
准备并执行查询后,我们使用bind_result()方法将变量附加到返回的字段。
在下面的代码中,我们从一些检索到的查询中有两个变量" var1"和" var2"。
$stmt->bind_result($var1, $var2);
如何使用准备好的语句获取数据?
我们使用fetch()方法从准备好的语句中检索每一行。
$stmt->fetch();
使用SELECT查询的绑定结果示例
在下面的示例中,我们将使用bind_result()方法从学生表中检索数据。
//query
$query = sprintf("SELECT studentid, name, branch FROM student LIMIT 10");
//create statement object
$stmt = $mysqlicon->stmt_init();
//prepare the statement for execution
$stmt->prepare($query);
//execute the prepared statement
$stmt->execute();
//store result set
$stmt->store_result();
//total fetched rows
printf("Retrieved Rows: %d<br>", $stmt->num_rows);
//bind results
$stmt->bind_result($studentid, $name, $branch);
//loop through result and assign retrieved fields to the bind variables
while ($stmt->fetch()) {
//print the data
printf("StudentId: %s Name: %s Branch: %s", $studentid, $name, $branch);
}
//recuperate the prepared statment
$stmt->close();
//close connection
$mysqlicon->close();
如何启用和禁用自动提交?
要启用自动提交选项,我们将TRUE传递给autocommit()方法,而要禁用自动提交,则传递FALSE。
$mysqlicon->autocommit(TRUE); //this will enable $mysqlicon->autocommit(FALSE); //this will disable
如何进行事务?
我们使用commit()方法来提交事务。
$mysqlicon->commit();
如何回滚事务?
为了回滚事务,我们使用rollback()方法。
$mysqlicon->rollback();

