PHP MySQLi

时间:2020-02-23 14:42:01  来源:igfitidea点击:

在本教程中,我们将学习与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();