Please enable java script to visit.
NOTEBOOK
HOMEPHP / MySQLJS / HTMLWXappPythonC++Blender其他
Mysqli 面向对象 操作数据库 - NOTEBOOK
Mysqli 面向对象 操作数据库
PHP / MySQL
Posted on 2022-12-23
摘要 : 原始版的代码,不使用自定义函数。
CREAT TABLE , SELECT , IN , LIKE , BETWEEN AND 等的用法。
❱ 新建表格

$DBConnect = new mysqli($SystemConfig['DB_info']['host'], $SystemConfig['DB_info']['user'], $SystemConfig['DB_info']['psw'], $SystemConfig['DB_info']['database']);
if($DBConnect->connect_errno){echo '数据库连接错误<br/>'. $DBConnect->connect_error.'<br/><br/><a href="ResetAndInstall.php">重新填写数据库信息</a>';exit;
};
mysqli_set_charset($DBConnect, "utf8mb4");


$sql = "CREATE TABLE aaaaa (
id int NOT null AUTO_INCREMENT ,
PRIMARY KEY(id),
login VARCHAR(30),
psw VARCHAR(30),
name VARCHAR(50),
info longtext,
mailhost longtext,
ablility longtext,
status VARCHAR(20),
position VARCHAR(20),
wage VARCHAR(20)
)ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8";

$DBConnect->query($sql);


❱ 插入数据

$DBConnect = new mysqli($SystemConfig['DB_info']['host'], $SystemConfig['DB_info']['user'], $SystemConfig['DB_info']['psw'], $SystemConfig['DB_info']['database']);
if($DBConnect->connect_errno){echo '数据库连接错误<br/>'. $DBConnect->connect_error.'<br/><br/><a href="ResetAndInstall.php">重新填写数据库信息</a>';exit;
};
mysqli_set_charset($DBConnect, "utf8mb4");

// 插入多行数据
$sql = "INSERT INTO user (login,psw,wage)
VALUES
('Petds', 'eew', '35'),
('Peteddar', 'Griferffin', '35'),
('Petsdadar', 'Griffin', '35'),
('aasdadar', 'Grifsfin', '35')
";
$DBConnect->query($sql);


❱ 读取数据

$DBConnect = new mysqli($SystemConfig['DB_info']['host'], $SystemConfig['DB_info']['user'], $SystemConfig['DB_info']['psw'], $SystemConfig['DB_info']['database']);
if($DBConnect->connect_errno){echo '数据库连接错误<br/>'. $DBConnect->connect_error.'<br/><br/><a href="ResetAndInstall.php">重新填写数据库信息</a>';exit;
};
mysqli_set_charset($DBConnect, "utf8mb4");


// $sql = "select * from user";
$sql = "select login,wage,name from user ORDER BY login DESC"; //挑选部分数值,按login 的值逆序排序
$result = $DBConnect->query($sql);
while($row = $result->fetch_row()){
print_r( $row);
echo '<br/>';
}


fetch_row : 得到 0,1,2,3 。。。 的key键
fetch_assoc : 得到 id,name,password,address 。。。 的key键
fetch_array : 得到上面2种合体 的 key 键


❱ 示范

$sql = "select item_no,last_editor from items WHERE item_no = 'D5401' OR content LIKE '%5401%' OR item_no LIKE '%5401%' ORDER BY item_no DESC";
$result = $DBConnect->query($sql);
// print_r($result);
while($row = $result->fetch_assoc()){
print_r( $row);
echo '<br/>';
}



WHERE 表达式中运算符说明:
参数说明:
运算符 说明
= 等于
!= 不等于,某些数据库系统也写作 <>
> 大于
< 小于
>= 大于或等于
<= 小于或等于
BETWEEN … AND … 介于某个范围之内,例:WHERE age BETWEEN 20 AND 30
NOT BETWEEN …AND … 不在某个范围之内
IN(项1,项2,…) 在指定项内,例:WHERE city IN('beijing','shanghai')
NOT IN(项1,项2,…) 不在指定项内
LIKE 搜索匹配,常与模式匹配符配合使用
NOT LIKE LIKE的反义
IS null 空值判断符
IS NOT null 非空判断符
NOT、AND、OR 逻辑运算符,分别表示否、并且、或,用于多个逻辑连接。
优先级:NOT > AND > OR
% 模式匹配符,表示任意字串,例:WHERE username LIKE '%user'


❱ MySQL LIKE 大小写

MySQL LIKE 匹配字符时,默认是不区分大小写的,如果需要在匹配的时候区分大小写,可以加入 BINARY 操作符:
SELECT * FROM user WHERE username LIKE BINARY '%azz%'
SELECT * FROM user WHERE username LIKE BINARY '%aZZ%'

BINARY 操作符表示按照二进制进行比较,因此加上该操作符后,便可以严格区分大小写,因此以上两条 SQL 查询出来的内容是不同的。

❱ MySQL LIKE 中文字符匹配

由于数据存储编码问题,在某些情况下,MySQL 进行 LIKE 搜索返回的数据中除了符合要求的数据外,往往还会返回许多不相干的数据。这时候也需要在 LIKE 后面加上 BINARY 操作符以进行二进制比较:
SELECT * FROM user WHERE username LIKE BINARY '%小%'


❱ 提示

当在 LIKE 匹配时加上 BINARY 操作符后,则会严格区分英文大小写。因此当检索的内容是中英文混合且需要忽略英文大小写的时候,就会遇到麻烦。为解决此问题,需要引入 MySQL 中的 UPPER() 与 CONCAT() 函数:
UPPER():将英文字符串变大写,同UCASE()
CONCAT():将多个字符串连接成一个字符串
语法如下:
UPPER(str)
CONCAT(str1,str2,...)
因此当我们要进行中英文混合匹配检索且要忽略英文大小写时,可以使用如下例所示的 SQL 语句:
SELECT * FROM username WHERE UPPER(username) LIKE BINARY CONCATt('%',UPPER('a中文b'),'%')
在该 SQL 中,将搜索的字段及检索的内容都进行大写转换后,再进行二进制匹配。

❱ 当只要一行数据时使用 LIMIT 1

当你查询表的有些时候,你已经知道结果只会有一条结果,但因为你可能需要去fetch游标,或是你也许会去检查返回的记录数。
在这种情况下,加上 LIMIT 1 可以增加性能。这样一样,MySQL数据库引擎会在找到一条数据后停止搜索,而不是继续往后查少下一条符合记录的数据。
下面的示例,只是为了找一下是否有"中国"的用户,很明显,后面的会比前面的更有效率。(请注意,第一条中是Select *,第二条是Select 1)
limit 0, 1; // 限制从第一条开始,显示1条
limit 1; // 同上面的一个效果
limit 4, 1; // 显示从第五条开始,显示1条


// 没有效率的:
$r = mysql_query("SELECT * FROM user WHERE country = 'China'");
if (mysql_num_rows($r) > 0) {// ...
}
// 有效率的:
$r = mysql_query("SELECT 1 FROM user WHERE country = 'China' LIMIT 1");
if (mysql_num_rows($r) > 0) {// ...
}


❱ IN 使用实例

// 选取 uid 为 2、3、5 的用户数据:
SELECT * FROM user WHERE uid IN (2,3,5)


❱ IN 子查询

更多情况下,IN 列表项的值是不明确的,而可能是通过一个子查询得到的:
SELECT * FROM article WHERE uid IN(SELECT uid FROM user WHERE status=0)



❱ IN 运算符补充说明

IN 列表项不仅支持数字,也支持字符甚至时间日期类型等,并且可以将这些不同类型的数据项混合排列而无须跟 column 的类型保持一致:
SELECT * FROM user WHERE uid IN(1,2,'3','c')



一个 IN 只能对一个字段进行范围比对,如果要指定更多字段,可以使用 AND 或 OR 逻辑运算符:
SELECT * FROM user WHERE uid IN(1,2) OR username IN('admin','5idev')



使用 AND 或 OR 逻辑运算符后,IN 还可以和其他如 LIKE、>=、= 等运算符一起使用。
关于 IN 运算符的效率问题
如果 IN 的列表项是确定的,那么可以用多个 OR 来代替:
SELECT * FROM user WHERE uid IN (2,3,5)

// 等效为:
SELECT * FROM user WHERE (uid=2 OR aid=3 OR aid=5)



一般认为,如果是对索引字段进行操作,使用 OR 效率高于 IN,但对于列表项不确定的时候(如需要子查询得到结果),就必须使用 IN 运算符。另外,对于子查询表数据小于主查询的时候,也是适用 IN 运算符的。


❱ MySQL BETWEEN 语法

BETWEEN 运算符用于 WHERE 表达式中,选取介于两个值之间的数据范围。
BETWEEN 同 AND 一起搭配使用,语法如下:
WHERE column BETWEEN value1 AND value2
WHERE column NOT BETWEEN value1 AND value2

通常 value1 应该小于 value2。当 BETWEEN 前面加上 NOT 运算符时,表示与 BETWEEN 相反的意思,即选取这个范围之外的值。
BETWEEN 实例
选取 uid 在 2 到 5 之间的用户数据:
SELECT * FROM user WHERE uid BETWEEN 2 AND 5


❱ BETWEEN 也支持字符串范围

除了数值类型外,BETWEEN 也支持字符串范围,如下选择出所有 username 介于 a 至 j 之间的用户(并包括单字母k/K):
SELECT * FROM user WHERE username BETWEEN 'a' AND 'k'
字符范围也支持汉字,但通常来说没什么意义。


❱ MySQL BETWEEN 时间日期

BETWEEN AND 常用于检索时间或日期段内的内容,下面是一些常见的 BETWEEN 时间日期例子:
// int 时间戳格式,查询 2008-08-08 20:00:00 到 2009-01-01 零点之前的数据
SELECT * FROM table WHERE column_time BETWEEN 1218196800 AND 1230739199

// DATE 格式,查询 2008-08-08 到 2009-01-01 零点之前的数据
SELECT * FROM table WHERE column_time BETWEEN '2008-08-08' AND '2009-01-01'

// DATETIME 格式,查询 2008-08-08 20:00:00 到 2009-01-01 零点之前的数据
SELECT * FROM table WHERE column_time BETWEEN '2008-08-08 20:00:00' AND '2008-12-31 23:59:59'


但对于查询到当前时间的数据,建议使用 >= 运算符:
// DATETIME 格式,查询 2008-08-08 20:00:00 到当前时刻的数据
SELECT * FROM table WHERE column_time >= '2008-08-08 20:00:00'



可见,同样的需求,不同的字段类型,写法可能就不一样。从效率上来讲,int 时间戳格式效率最优。
以上 BETWEEN 的各个例子,虽然都是 SELECT 查询,但 BETWEEN 也可以用于 UPDATE、DELETE 等适用 WHERE 表达式的 SQL 中。