第5课:PHP与Mysql增删改查

先来点心灵鸡汤....学会了PHP对数据库的增删改查操作,你就能做大部分的项目了!!

mysql是一个关系型数据库,用来存储项目中的数据,PHP对mysql中数据的主要操作,无非就是增删改查4种

PHP操作mysql数据库的方式有很多种,但是这里只介绍最经典的一种,PDO方式

要操作数据库,必须先要连接数据库
1.PHP用PDO连接Mysql
$connect = new PDO('mysql:host=机器IP;port=机器端口;dbname=要查询数据库', '用户名', '密码');
当然,编码也要注意,如果项目中用的UTF8编码,数据库也要保证是UTF8
$connect->exec('SET NAMES utf8');

2.增删改查[基于本页附件给出的封装好的基类]
先引入基类并初始化
<?php
include_once 'Mysql.php';
$mysql = Mysql::getInstance();//初始化,连接上mysql

//增
$sql = 'insert into test (name, time) values (:name, :time)';
$mysql->execute($sql, array(':name'=> 'Godeye', ':time' => date('Y-m-d H:i:s')));
echo $mysql->lastInsertid();//返回插入数据的主键ID

//改
$sql = 'update test set name = :name where id = :id';
$mysql->execute($sql, array(':name'=> '大音希声', ':id' => 3));
echo $mysql->getRowCount();//返回update操作影响的行数

//删
$sql = 'delete from test where id = :id';
$mysql->execute($sql, array(':id' => 3));
echo $mysql->getRowCount();//返回delete操作影响的行数

//查1  根据字段查询
$sql = 'select name from test where id = :id';
print_r($mysql->fetchRow($sql, array(':id' => 4)));//fetchRow返回一行

//查2  模糊查询
$sql = 'select name from test where name like :name';
print_r($mysql->fetchAll($sql, array(':name' => '%godeye.org%')));//fetchAll返回所有数据

//查3  分页查询
$currPage = 3;
$perPage = 1;
$sql = 'select name from test limit ' . $perPage  . ' offset ' . ($currPage - 1) * $perPage;
print_r($mysql->fetchAll($sql));

//获取数量
$sql = 'select count(*) from test';
print_r($mysql->fetchColumn($sql));
?>

可能看过附件中基类,还有些不明了的地方,这里做个总结阐述:
PHP用PDO方式操作MYSQL是现在主流的方法,其流程无非就是先prepare一条SQL语句,然后用bindParam把SQL语句中用到的传入字段值绑定,最后根据是读操作还是写操作调用对应的读写方法,比如fetchAll execute

3.mysql函数
mysql函数比较多,如果能灵活运用,可以直接用SQL实现很复杂的功能
操作时间的: CURDATE()返回当前日期 NOW()返回当前时期和时间  DATE_FORMAT(date, format)格式化日期
操作字符串的:LENGTH(str)返回字符串str的长度
这里举个例子,是针对in操作
SELECT col_id,col_name,col_3
FROM table_t
WHERE col_id IN ('2', '5', '9')

一般情况下 IN 运算符所需要匹配的集合是动态的,在直接拼接 sql 语句的时候很简单。
但是在使用 PDO 并将其作为参数的时候就比较麻烦。按照一般的想法,我们这样做
	
$sSQL = 'SELECT col_id,col_name,col_3
FROM table_t
WHERE col_id IN (:ids)';
$oStatemet = $oPDO->prepare($sSQL);
$sIds = '1,3,4,5';
$oStatemet->bindParam(':ids', $sIds, PDO::PARAM_STR);

但是这样不能得到正确的结果,最终执行效果和一下语句一样
	
SELECT col_id,col_name,col_3
FROM table_t
WHERE col_id IN ('1,3,4,5')

那么我们怎么如何正确地完成这项任务呢?
find_in_set 法
SELECT col_id,col_name,col_3
FROM table_t
WHERE col_id find_in_set(cast(col_id as char), :ids)
但是这样有个弊端,就是不走索引了,可能导致sql很慢,还有一种方式是用
array_walk_recursive函数对数组进行处理,然后拼入sql,还用in语句,这样sql效率会好点
有时候效率和安全真是一个矛盾的话题

点击下载