Mysql


每日一记

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'");

PHP中有关MySQL数据库的内容暂时告一段落,若想了解MySQLi - 面向过程和PDO请前往此处

每日一句

我们生而破碎,用活着来修修补补。

评论
  目录