每日一记
php7之前是mysql链接(硬链接)
php7之后是mysqli链接(i链接/improved链接)
PHP连接数据库(MySQLi - 面向对象)
<?php
$servername = "localhost";
$username = "username";
$password = "password";
// 创建连接
$conn = new mysqli($servername, $username, $password);
// 检测连接
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
echo "Connected successfully";
?>
关闭连接(MySQLi - 面向对象)
连接在脚本执行完后会自动关闭,也可以手动关闭
$conn->close();
创建数据库(MySQLi - 面向对象)
需要 CREATE 权限来创建或删除 MySQL 数据库。
<?php
$servername = "localhost";
$username = "username";
$password = "password";
// 创建连接
$conn = new mysqli($servername, $username, $password);
// 检测连接
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// Create database
$sql = "CREATE DATABASE myDB"; //库名叫做myDB
if ($conn->query($sql) === TRUE) {
echo "Database created successfully";
} else {
echo "Error creating database: " . $conn->error;
}
$conn->close();
?>
创建表(MySQLi - 面向对象)
在 PHP 中创建完数据库之后,我们需要在数据库中创建一个或者多个的数据表。
一个数据表有一个唯一名称,并有行和列组成。
创建表前,我们需要使用use myDB;来选择要操作的数据库
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);
// 检测连接
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// sql to create table
$sql = "CREATE TABLE MyGuests (
id INT(6) UNSIGNED 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();
?>
其中表内数据类型有规定
同时可以为每个列指定其他选项的属性:
NOT NULL - 每一行都必须含有值(不能为空),null 值是不允许的。
DEFAULT value - 设置默认值
UNSIGNED - 使用无符号数值类型,0 及正数
AUTO INCREMENT - 设置 MySQL 字段的值在新增记录时每次自动增长 1
PRIMARY KEY - 设置数据表中每条记录的唯一标识。 通常列的 PRIMARY KEY 设置为 ID 数值,与AUTO_INCREMENT 一起使用。
每个表都应该有一个主键(本列为 “id” 列),主键必须包含唯一的值。
插入数据(MySQLi - 面向对象)
语法规则:
1.PHP 中 SQL 查询语句必须使用引号
2.在 SQL 查询语句中的字符串值必须加引号
3.数值的值不需要引号
4.NULL 值不需要引号
向 MySQL 表添加新的记录:
INSERT INTO table_name (column1, column2, column3,…)
VALUES (value1, value2, value3,…)
在连接检测和关闭数据库中间加入
$sql = "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('John', 'Doe', 'john@example.com')"; //向 "MyGuests" 表添加新的记录
if ($conn->query($sql) === TRUE) {
echo "New record created successfully";
} else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
插入多条数据(MySQLi - 面向对象)
【方法一:使用函数】
mysqli_multi_query() 函数可用来执行多条SQL语句。
$sql = "INSERT INTO
MyGuests (firstname, lastname, email)
VALUES ('John', 'Doe', 'john@example.com');";
$sql .= "INSERT INTO
MyGuests (firstname, lastname, email)
VALUES ('Mary', 'Moe', 'mary@example.com');";
$sql .= "INSERT INTO
MyGuests (firstname, lastname, email)
VALUES ('Julie', 'Dooley', 'julie@example.com')";
if ($conn->multi_query($sql) === TRUE) {
echo "New
records created successfully";
} else {
echo
"Error: " . $sql . "
" . $conn->error;
}
注意:每个SQL语句必须用分号隔开。
【方法二:MySQLi 使用预处理语句】
// 为 mysqli_stmt_prepare() 初始化
statement 对象
$stmt =
mysqli_stmt_init($conn);
//预处理语句
if (mysqli_stmt_prepare($stmt, $sql)) {
// 绑定参数
mysqli_stmt_bind_param($stmt, 'sss', $firstname, $lastname, $email);
// 设置参数并执行
$firstname = 'John';
$lastname
= 'Doe';
$email =
'john@example.com';
mysqli_stmt_execute($stmt);
$firstname = 'Mary';
$lastname
= 'Moe';
$email =
'mary@example.com';
mysqli_stmt_execute($stmt);
$firstname = 'Julie';
$lastname = 'Dooley';
$email =
'julie@example.com';
mysqli_stmt_execute($stmt);
}
每个参数必须指定类型,来保证数据的安全性。通过类型的判断可以减少SQL注入漏洞带来的风险。
参数类型:
i - integer
d - double
s - string
b - BLOB
MySQLi使用预处理语句(包括面向对象和面向过程)
流程:
1.预处理:创建 SQL 语句模板并发送到数据库。预留的值使用参数 “?” 标记
2.数据库解析并编译(内部处理):对SQL语句模板执行查询优化,并存储结果(不输出)
3.执行:将应用绑定的值传递给参数(?标记),数据库执行语句。(如果参数的值不一样,可以多次执行语句)
优点:
1.减少了分析时间,只做了一次查询(虽然语句多次执行)
2.绑定参数减少了服务器带宽,你只需要发送查询的参数,而不是整个语句
3.预处理语句针对SQL注入是非常有用的,因为参数值发送后使用不同的协议,保证了数据的合法性。
// 步骤一,prepare and bind
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)");
$stmt->bind_param("sss", $firstname, $lastname, $email);
// 步骤三,设置参数并执行
$firstname = "John";
$lastname = "Doe";
$email = "john@example.com";
$stmt->execute();
$firstname = "Mary";
$lastname = "Moe";
$email = "mary@example.com";
$stmt->execute();
$firstname = "Julie";
$lastname = "Dooley";
$email = "julie@example.com";
$stmt->execute();
echo "New records created successfully";
$stmt->close();
语句中如果有?就转换为其他类型的数据
读取数据(MySQLi - 面向对象)
SELECT 语句用于从数据表中读取数据:
SELECT column_name(s) FROM table_name
我们可以使用 * 号来读取所有数据表中的字段:
SELECT * FROM table_name
用 WHERE 命令来筛选出满足条件的结果:
SELECT column_name(s)
FROM table_name
WHERE column_name operator value
——————————————————————————————————————————————————————————————————————————————
【SELECT】
$sql = "SELECT id, firstname, lastname FROM MyGuests";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// 输出每行数据
while($row = $result->fetch_assoc()) {
echo "id: ". $row["id"]. " - Name: ". $row["firstname"]. " " . $row["lastname"]. "<br>";
}
} else {
echo "0 results";
}
——————————————————————————————————————————————————————————————————————————————
【WHERE】
$result = mysqli_query($con,"SELECT * FROM Persons
WHERE FirstName='Peter'");
while($row = mysqli_fetch_array($result))
{
echo $row['FirstName'] . " " . $row['LastName'];
echo "<br>";
}
处理数据
ORDER BY 关键词用于对记录集中的数据进行排序。
SELECT column_name(s)
FROM table_name
ORDER BY column1, column2... ASC|DESC 默认是升序ASC,DESC改为降序
$result = mysqli_query($con,"SELECT * FROM Persons ORDER BY age");
while($row = mysqli_fetch_array($result))
{
echo $row['FirstName'];
echo " " . $row['LastName'];
echo " " . $row['Age'];
echo "<br>";
}
可以根据多个列进行排序(第一列的值相同时才使用第二列)
更新数据
UPDATE 语句用于更新数据库表中已存在的记录。
WHERE 子句规定了哪些记录需要更新。
如果您想省去 WHERE 子句,所有的记录都会被更新!
PHP执行该语句,必须使用mysqli_query()函数(该函数用于向 MySQL 连接发送查询或命令)
语法:
UPDATE table_name
SET column1=value, column2=value2,...
WHERE some_column=some_value
操作:
mysqli_query($con,"UPDATE Persons SET Age=36
WHERE FirstName='Peter' AND LastName='Griffin'");
删除数据
DELETE FROM 语句用于从数据库表中删除记录。
WHERE 子句规定了哪些记录需要更新。
如果您想省去 WHERE 子句,所有的记录都会被更新!
PHP执行该语句,必须使用mysqli_query()函数(该函数用于向 MySQL 连接发送查询或命令)
语法:
DELETE FROM table_name
WHERE some_column = some_value
操作:
mysqli_query($con,"DELETE FROM Persons WHERE LastName='Griffin'");