基本概念
php有三种方式来操作mysql数据库
- mysql扩展库
- mysqli扩展库
- pdo
mysql扩展库和mysql数据库的区别
- mysql数据库是用来存放数据的
- mysql扩展库是一堆函数,是php设计者提供给程序员用于完成对mysql数据库的各种操作 (CRUD)
mysql数据库的三层结构
快速入门案例
首先要在php.ini中启动mysql扩展库,通过phpinfo()函数可以查看php支持哪些扩展库
创建user表
mysql> create table user(
-> id int primary key auto_increment,
-> name varchar(32) not null,
-> password varchar(64) not null,
-> email varchar(128) not null,
-> age tinyint unsigned not null
-> );
Query OK, 0 rows affected (0.10 sec)
insert into user(name,password,email,age) values('zs',md5(12345),'zs@qq.com',30);
insert into user(name,password,email,age) values('ls',md5(12345),'ls@qq.com',20);
insert into user(name,password,email,age) values('王五',md5(12345),'ww@qq.com',10);
Query OK, 3 row affected (0.04 sec)
mysql> select * from user;
+----+------+----------------------------------+-----------+-----+
| id | name | password | email | age |
+----+------+----------------------------------+-----------+-----+
| 1 | zs | 827ccb0eea8a706c4c34a16891f84e7b | zs@qq.com | 30 |
| 2 | ls | 827ccb0eea8a706c4c34a16891f84e7b | ls@qq.com | 20 |
| 3 | 王五 | 827ccb0eea8a706c4c34a16891f84e7b | ww@qq.com | 10 |
+----+------+----------------------------------+-----------+-----+
3 rows in set (0.00 sec)
查询操作(dql)
//mysql扩展库操作mysql
//1.连接数据库
$conn = @mysql_connect('localhost','root','');
if (!$conn){
die('链接失败'.mysql_error($conn));
}else{
echo '链接成功';
}
//2.选择数据库
mysql_select_db('test',$conn) or die(mysql_error($conn));
//3.设置字符集
mysql_query('set names utf8',$conn);
//4.查询数据
$sql = 'select * from user';
//$res是资源类型,表示结果集,可以简单理解为他是一张表
$res = mysql_query($sql,$conn);
if (!$res){
die('无法读取数据<br>'.mysql_error($conn));
}
echo '数据读取成功','<br>';
//5.处理结果集,显示数据
while ($row = mysql_fetch_object($res)){
//echo "$row[0]--$row[1]--$row[2]<br>";
foreach ($row as $k=>$v){
echo "$v--";
}
echo '<br>';
}
//6.释放资源,关闭连接
//释放取到的$res资源,这句话必须有,不写的话脚本结束也会自动释放,但是如果取很多资源的话会占用大量内存
mysql_free_result($res);
//关闭mysql连接(就算写,也不会立马关闭),一般不写,因为会在脚本执行完毕后自动关闭
mysql_close($conn);
增删改操作(dml)
//1.连接数据库
$conn = @mysql_connect('localhost','root','');
if (!$conn){
die('链接失败'.mysql_error($conn));
}
//2.选择数据库
mysql_select_db('test',$conn) or die(mysql_error($conn));
//3.设置字符集
mysql_query('set names utf8', $conn);
//4.操作数据库 (增删改)
//$sql = "insert into user(id,name,password,email,age) values(4,'小明',md5(12345),'xm@qq.com',35)";
//$sql = 'delete from user where id=10';
$sql = "update user set age=18 where id=4";
//如果是dml操作,则返回bool
$res = mysql_query($sql,$conn);
if (!$res){
die('操作失败'.mysql_error($conn));
}
//删除操作即使删除不存在的数据,也不会报错,需要用下面函数查看操作了几行数据
if (mysql_affected_rows($conn)>0){
echo '操作成功';
}else{
echo '未进行数据操作';
}
//5.释放资源,关闭连接
//增删改操作得到的结果是bool,关闭资源操作会报错
//mysql_free_result($res);
//关闭mysql连接(就算写,也不会立马关闭),一般不写,因为会在脚本执行完毕后自动关闭
mysql_close($conn);
细节说明
大多数函数的 link_identifier 参数规定 SQL 连接标识符。如果未规定,则使用上一个打开的连接
资源相关
- mysql数据库在取到资源$res后,立马关闭mysql连接,仍然可以正常读取数据,因为它将取到的资源放进了内存,此时和mysql连接已经没有关系了,但此时如果立马释放资源,就报错了
- mysql_query()的dql操作,成功返回 resource,出错返回 false,dml操作,返回bool
- dql操作需要关闭资源,dml操作不用关闭资源 (因为没有)
连接数据库
- mysql_connect() 成功返回一个 mysql 连接标识,失败返回 false
- mysql_error() 的参数是一个连接标识,但是如果连接数据库失败会返回false,导致错误处理失效
函数详解
成功返回一个 mysql 连接标识 link_identifier,失败返回 false
本函数返回上一个 MySQL 函数的错误文本,如果没有出错则返回 ''(空字符串)
link_identifier 参数规定 SQL 连接标识符。如果未规定,则使用上一个打开的连接
如果执行的是dml 语句,则返回bool
如果执行的是 dql 语句,则返回一个资源标识符,如果查询执行不正确则返回 false
创建 / 删除数据库,设置字符集等有专用函数,但是可以用mysql_query()函数代替,返回bool
取得最近一次与 link_identifier 关联的 INSERT,UPDATE 或 DELETE 查询所影响的记录行数
删除操作即使删除不存在的数据,也不会报错,需要用该函数查看操作了几行数据
取得上一步 insert 操作产生的 ID
处理资源$res的几种函数
mysqli_fetch_row(),从结果集中取得一行,并作为索引数组返回
Array ( [0] => 1 [1] => zs [2] => ** [3] => zs@qq.com [4] => 30 )
mysqli_fetch_assoc(),从结果集中取得一行,并作为关联数组返回
Array ( [id] => 1 [name] => zs [password] => ** [email] => zs@qq.com [age] => 30 )
mysqli_fetch_array() ,从结果集中取得一行,并作为索引数组和关联数组返回
Array ( [0] => 1 [id] => 1 [1] => zs [name] => zs [2] => ** [password] => ** [3] => zs@qq.com [email] => zs@qq.com [4] => 30 [age] => 30 )
mysqli_fetch_object() ,从结果集中取得一行,并作为对象返回
stdClass Object ( [id] => 1 [name] => zs [password] => ** [email] => zs@qq.com [age] => 30 )
更多函数 link
mysql_field_name(),成功返回指定字段的名称,失败返回 false
mysql_num_fields(),返回结果集中字段的数目
mysql_num_rows(),返回结果集中行的数目
//5.处理结果集,打印成表格
//查看行数和列数
echo $rows = mysql_num_rows($res);
echo $columns = mysql_num_fields($res);
//打印成表格
echo '<table border="1px">';
echo '<tr>';
for ($i=0;$i<$columns;$i++){
$file_name = mysql_field_name($res,$i);
echo "<th>$file_name</th>";
}
echo '</tr>';
while ($row = mysql_fetch_row($res)){
echo '<tr>';
foreach ($row as $k=>$v){
echo "<td>$v</td>";
}
echo '</tr>';
}
echo '</table>';
mysql 增删改查工具类
<?php
class myDB{
private $conn;
private $host;
private $user;
private $password;
private $dbname;
private $charset;
function __construct($host,$user,$password,$dbname,$charset){
$this->host = $host;
$this->user = $user;
$this->password = $password;
$this->dbname = $dbname;
$this->charset = $charset;
}
//1.连接数据库
public function connect(){
$this->conn = @mysql_connect($this->host,$this->user,$this->password);
if (!$this->conn){
die('链接失败'.mysql_error($this->conn));
}
}
//2.选择数据库,设置编码
public function set(){
mysql_select_db($this->dbname,$this->conn) or die(mysql_error($this->conn));
mysql_query($this->charset,$this->conn);
}
//3.操作数据(查)
public function execute_dql($sql){
$res = mysql_query($sql,$this->conn);
if (!$res){
echo '操作失败'.die(mysql_error($this->conn));
}
while ($row = mysql_fetch_row($res)){
foreach ($row as $k=>$v){
echo "$v--";
}
echo '<br>';
}
//4.关闭资源,关闭连接
mysql_free_result($res);
}
//3.操作数据(增删改)
public function execute_dml($sql){
$res = mysql_query($sql,$this->conn);
if (!$res){
echo '操作失败'.die(mysql_error($this->conn));
}
if(mysql_affected_rows($this->conn)>0){
echo '操作成功';
}else{
echo '未进行数据操作';
}
//4.关闭连接
mysql_close($this->conn);
}
}
$a = new myDB('localhost','root','','test','utf8');
$a->connect();
$a->set();
//$a->execute_dql('select * from user');
$a->execute_dml('delete from user where id=8');