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();