PHP+MySQL的操作

来源:互联网 发布:苹果免费打电话软件 编辑:程序博客网 时间:2024/05/20 05:07

前言

PHP5以及以上版本建议使用以下的方式来连接MySQL

  • MySQli
  • PDO(PHP Data Objects)

Using MySQLi or PDO

MySQLi和PDO都有自己的优势:
PDO应用在12中不同的数据库上,而MySQLi只针对MySQL数据库。所以,如果你的项目需要在多种数据库中切换,建议使用PDO,这样你只需要修改连接字符串和部门查询语句即可。使用MySQLi,如果不同的数据库,你需要重新写所有的代码,包括查询。
两者都是面向对象,但MySQLi还提供了API接口
两者都支持预处理语句。预处理语句可以防止SQL注入,对于Web项目的安全性非常重要

MySQLi与PHP

a.在访问MySQL数据库之前,我们先要连接数据库

<?php$db_name = "localhost";$db_user = "root";$db_pass = "123456";//创建链接$conn = new mysqli($db_name, $db_user, $db_pass);if ($cone->connect_error) {    die("Connection failed:".$conn->connect_error);}echo "Connected successfully";?>

b.关闭连接

$conn->close();

c.创建数据表

<?php$db_name = "localhost";$db_user = "root";$db_pass = "123456";//创建链接$conn = new mysqli($db_name, $db_user, $db_pass);if ($cone->connect_error) {    die("Connection failed:".$conn->connect_error);}$sql = "CREATE TABLE test(    id INT(16) UNSIGEND AUTO_INCREMENT PRIMARY KEY,    firstname VARCHAR(30) NOT NULL,    lastname VARCHAR(30) NOT NULL,    email VARCHAR(50),    reg_date TIMESTAMP)";if ($conn->query($sql) === true) {    echo "Table MyGuests created successfully";} else {    echo "Error creating table: " . $conn->error;}$conn->close();?>

d.预处理语句
预处理语句对于防止MySQl注入是非常有用的
预处理语句和绑定参数
预处理语句用于执行多个相同的SQL语句,并且执行效率更高
预处理语句的工作原理如下:

  1. 预处理:创建SQL语句模板并发送到数据库。预留的值使用参数”?”标记。例如:INSERT INTO test(firstname, lastname, email) VALUES(?, ?, ?)
  2. 数据库解析:编译,对SQL语句模板执行查询优化,并存储结果不输出
  3. 执行:最后,将应用绑定的值传递给参数(”?” 标记),数据库执行语句。应用可以多次执行语句,如果参数的值不一样。

相比较直接执行SQL语句,预处理主要有以下的优点:

  1. 预处理语句大大减少了分析时间,只做了一次查询(虽然语句多次执行)
  2. 绑定参数减少了服务器带宽,你只需要发送查询的参数,而不是整个语句
  3. 预处理语句针对SQL注入是非常有用的,因为参数值发送后使用不同的协议,保证了数据的合法性
<?php//prepare and bind$stmt = $conn->prepare("INSERT INTO test(firstname, lastname, email) VALUES(?, ?, ?)");$stmt->bind_param("sss",$firstname, $lastname, $email);//设置参数并执行$firstname = "Mary";$lastname = "Moe";$email = "mary@example.com";$stmt->execute();$firstname = "Julie";$lastname = "Dooley";$email = "julie@example.com";$stmt->execute();//关闭$stmt->close();$conn->close();?>

解析以下实例的每行代码:

$stmt = $conn->prepare("INSERT INTO test(firstname, lastname, email) VALUES(?, ?, ?)");

在 SQL 语句中,我们使用了问号 (?),在此我们可以将问号替换为整型,字符串,双精度浮点型和布尔值。
接下来,让我们来看下 bind_param() 函数:

$stmt->bind_param("sss", $firstname, $lastname, $email);

该函数绑定了 SQL 的参数,且告诉数据库参数的值。 “sss” 参数列处理其余参数的数据类型。s 字符告诉数据库该参数为字符串。
参数有以下四种类型:
i - integer(整型)
d - double(双精度浮点型)
s - string(字符串)
b - BLOB(布尔值)
每个参数都需要指定类型。
通过告诉数据库参数的数据类型,可以降低 SQL 注入的风险。

e.读取数据

<?php $arr = array();//最后结果$sql = "SELECT id,firstname,lastname FROM test";$result = $conn->query($sql);if ($result->num_rows > 0) {    while($row = $result->fetch_assoc()) {         $arr[] = $row;           }}?>

PDO与PHP

a.在访问数据库之前,先连接数据库(PDO需要提前安装)

<?php$db_name = "localhost";$db_user = "root";$db_pass = "123456";try {    $conn = new PDO("mysql:host=$db_name;dbname=myDB", $db_user, $db_pass);    echo "Connected successfully";}catch(PDOException $e) {    echo $e->getMessage();}?>

b.关闭连接

$conn = null;

c.创建数据表

<?php$db_name = "localhost";$db_user = "root";$db_pass = "123456";try {    $conn = new PDO("mysql:host=$db_name;dbname=myDB", $db_user, $db_pass);    //set the PDO error mode to exception    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);    $sql = "CREATE TABLE test(        id INT(16) UNSIGEND AUTO_INCREMENT PRIMARY KEY,        firstname VARCHAR(30) NOT NULL,        lastname VARCHAR(30) NOT NULL,        email VARCHAR(50),        reg_date TIMESTAMP    )";    //use exec() because no result are returned    $conn->exec($sql);}catch(PDOException $e) {    echo $e->getMessage();}?>

d.预处理语句

//设置PDO错误模式为异常$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);//预处理SQL并绑定参数$stmt = $conn->prepare(""INSERT INTO MyGuests (firstname, lastname, email)     VALUES (:firstname, :lastname, :email)");$stmt->bindParam(':firstname', $firstname);$stmt->bindParam(':lastname', $lastname);$stmt->bindParam(':email', $email)// 插入其他行$firstname = "Mary";$lastname = "Moe";$email = "mary@example.com";$stmt->execute();// 插入其他行$firstname = "Julie";$lastname = "Dooley";$email = "julie@example.com";$stmt->execute();//关闭连接$conn = null;

e.读取数据

$stmt = $conn->prepare("SELECT * from test");$stmt->excute();//设置结果集为关联数组$result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
0 0