php操作数据库的三种方法
1.mysql扩展库 (最早的);2.mysqli扩展库;3.pdo
php
数据类型
1.基本数据类型;2.符合数据类型;3.特殊数据类型 null
和资源数据类型
mysql扩展库和mysql数据库的区别
1.mysql扩展库包含操作mysql数据库的函数(CRUD)
2.数据库三层结构:sql指令(来自客户端或者服务器)-->dbms(二次编译成二进制命令)-->操作数据库
1.环境搭建
1.1.启用mysql扩展库
php.ini
---extension =php_mysql.dll
可以通过 <?php phpinfo();?>
查看使用了那些扩展库
create table
users{ //
大写执行效率高,不过无所谓
id int primary key auto_increment, //unsigned
无符号,范围大一倍
name varchar(32) not null, //char varchar的区别
password
varchar(64) not null, //空间按32的倍数来给,标准习惯
email varchar(128) not
null,
age tinyint unsigned not null
}
insert into
users(name,password,email,age)
values(‘zs‘,md5(‘123456‘),‘123@163.com‘,30);
insert into
users(name,password,email,age)
values(‘伟‘,md5(‘123456‘),‘123@163.com‘,30);
题外话:md5,不可逆
php代码
//1.获取连接
$conn
=mysql_connect("127.0.0.1","root","root");
if(!$conn){
die("连接表".mysql_error());
}
//2.选择数据库
mysql_select_db("test");
//3.设置操作编码(建议有)
mysql_query("set
names utf8")
//4.sql指令(ddl数据定义语句,dml数据操作语句(增,改删),dql数据查询语句(查),dtl数据管理语句
rollback commit)
$sql="select * from users";
$res
=mysql_query($sql,$conn);
//指定$conn,执行效率高
//var_dump($res);
//mysql result 资源类型
//5.接受结果,处理
while($row=mysql_fetch_row($res)){
//取出下一行
//第一种取法
echo"<br/>".row[0]."--".row[1];
//第二种取法
foreach($row
as
$key=>$val)
{
echo"--$val";
}
echo"<bt/>";
}
//6.释放资源,关闭连接
mysql_free_result($res);
mysql_close($conn);
//通常不需要写,反正不会及时关闭,而且有系统关闭
题外话:cmd命令 netstat -an
//查看当前的网络连接
mysql_query($sql,$conn);返回的结果类型
1. dql ---
返回数据库资源
2.dml---返回bool
mysql_fetch_row($res); 返回索引数组
效率最高
mysql_fetch_assoc($res); 返回关联数组
mysql_fetch_array($res);
返回索引数组和关联数组
mysql_fetch_object($res); 把一行数据,当做一个对象
$row->email;
mysql command client 的使用
MySql Command Line Client mysql数据库客户端-- 使用方法
密码--回车
show
databases;--回车
use test; --回车
show tables; -- 回车
//查看表结构和所在数据库
\s //查看当前表所在数据库
drop table
users;
show variables like ‘%char%‘; //不能插入中文数据
set
character_set_client=gbk; //该客户端的编码识别问题
set
character_set_results=gbk;
或者使用
set names gbk; //取代上面两行
mysql扩展库其他操作函数
public function show_table($table_name){
$sql="select * from
$table_name"; //"des
$table_name";
require_once("sqlhelper.class.php");
$sqlhelper =new
sqlhelper();
$res =$sqlhelper->Execute_dql($sql);
echo"<table
border=1><tr>";
$rowcount
=mysql_affected_rows($conn);
$fieldcount=mysql_num_fields($res);
for($i
=0;$i<$fieldcount;$i++){
$field_name=mysql_field_name($res,$i);
echo"<th>$field_name</th>";
}
echo"</tr></table>";
while($row
=mysql_fetch_row($res))
echo"</tr>";
for($i=0;$i<$fieldcount;$i++){
echo"<td>$row[$i]</td>";
}
echo"<tr>";
/*//循环获取列名
while(mysql_fetch_field($res)){
echo"<th>".$field_name.</th>;
}
*/
}
mysql扩展库--sqlhelper创建
mysql_query($sql,$conn);返回的结果类型
1. dql ---
返回数据库资源
2.dml---返回bool
if(!$res){
die("operate
fail".mysql_error());
}
if(mysql_affected_rows($conn)>0){
echo"
operate success";
}
else{
echo"no affected
row";
}
创建sqlhelper.class.php 类
public class sqlhelper { private $host="localhost"; private $username="root"; private $password ="root"; private $db="test"; public function sqlhelper() { $conn=mysql_connect($host,$username,$password); if(!$conn) { die("connect fail".mysql_error()); } mysql_select_db($this->db,$this->conn) or die(mysql_error()); mysql_query("set names utf8"); } public function Execute_dql($sql) { $res=mysql_query($sql,$this->conn); return $res; } mysql_free_result($res); mysql_close($this->conn) or die(mysql_error()); } public function Execute_dml($sql) { $res=mysql_query($sql,$this->conn); if(!$res) { return 0; //失败 } else { if(mysql_affected_rows($this->conn)>0) { return 1; } else { return 2; } } }
调用sqlhelper使用
$sql="select * from users";
$exe_table =new
mysql();
$res =$exe_table->execute_dql($sql);
while($row
=mysql_fetch_row($res)){
foreach($row as
$key=>$value){
echo $value;
}
echo"<br/>"
}
mysql_free_result($res);
$sql="delete from
users";
$exe_table =new mysql();
$exe_table->execute_dml($sql);
mysql扩展库---字典查询示例
查询示例中sql语句的优化
mysql limit 0,1 指令
select *
//开销较大
while 单查开销比 if 大一点
<?php require_once‘SqlHelper.class.php‘; if(isset($_REQUEST[‘Enname‘])){ $en_word=$_REQUEST[‘Ename‘]; }else{ echo"input null"; echo"<a href=‘mainView.php‘>return</a>" } $sql="select chword from words where enword=‘".$en_word."‘limit 0,1"; /// $sql="select enword from words where chword like ‘%".$en_word."%‘ limit 0,1"; if(mysql_num_rows($res)){ while($row=mysql_fetch_assoc($res)){ }else{ } mysql_free_result($res); mysql_close($conn); } ?>
中查英,英查中各一个form,用hidden的值来区分,在同一处理页里进行处理。
mysqli 特性,sqlhelper封装类
1.mysql扩展库和mysqli扩展库的区别
1.1.mysql---面向过程编程
mysqli---面向对象编程(主流)同时提供面向过程编程(过渡)
(语法上的特征:mysqli将mysql中使用的参数封装成相应的对象)
1.2.mysqli更安全更高效。
2.
<?php header("Content_type:text/html;charset=utf-8") public class SqlHelper { private static $host="localhost"; private static $username="root"; private static $password="root"; private static $db="test"; private mysqli=""; public __construct {//self::$host $this->mysqli=new MySQLi(self::$host,self::$username,self::$password,self::$db) //MySQLi中大小无所谓 if(!$this->mysqli->conncet_error) { die("connect error".$this->mysqli->connect_error); } } public Execute_dql($sql) {//des select show explain 返回mysqli result $res=$this->mysqli->query($sql) or die("Query error".$this->mysqli->error); if($res) while($row=$res->fetch-assoic()) { foreach($row as $key=>$value) echo"$value"; } echo"<br/>"; //$res->free();资源的释放应该在调用后释放 //$this->mysqli->close(); } public Execute_dml($sql) { $res=$this->mysqli->query($sql) die("Query error".$this->mysqli->error);; if($res) { $counts=$this->mysqli->affeced_rows(); if($counts>0) {//echo"affected rows".$counts; return 0 ; } else {//echo"no rows affected" return 1; } } else { return 2; //echo"opreate fail"; } $this->mysqli->close(); } public Execute_Batch_dql($sql) {//批量查询 $res=$this->mysqli->multi_query($sql); if(!$res) { echo"operate error".$this->mysqli->error; } else { do{ $result=$res->store_result(); //每执行一次取出一个结果集 while($row =$result->fetch_row()) { foreach($row as $key=>$val) { echo"--$val"; } echo"</br>"; } $result->free(); if(!$res->more_results()) { break; } }while($res->next_result();) } $this->mysqli->close(); } //批量dml public Execute_Batch_dml($sql) { $res=$this->mysqli->multi_query($sql); //批量执行,返回true,false。 if(!$res) { echo"operate error".$this->mysqli->error; } else { } $this->mysqli->close(); } } ?>
mysqli面向过程编程
<?php $mysqli=mysqli_connect("localhost","root","root","db") or die("conncet error".mysqli_connect_error($mysqli)); mysqli_query(set names utf8); $sql="select * from users"; $res =mysqli_query($mysqli,$sql); if(!$res) { echo"operate error".mysqli_error($mysqli); } else { while(mysqli_fetch_row($res)) { foreach($row as $key=>$value) { echo"--$value"; } echo"</br>"; } mysqli_free_result($res); mysqli_close($mysqli); } ?>
mysqli--批量dql,dml,事务,预处理
批量dql,dml的好处---提高性能速度。
1.批量执行中dml最好不要和dql一起使用,可能会不稳定。
2.批量执行sql语句的不同操作必须用;隔开。
2.sql语句中如果字段为string类型,必须加‘‘;
如果字段为数字类型,可以加‘‘,也可以不加‘‘;
<?php requrie_once"SqlHelper.class.php"; $sql="update test set name =‘cao‘where id=1;"; $sql.="delete from test where id>1;"; $sql.="insert into test (name,age,score) values(‘piliang‘,10,100)" $mysqli=new SqlHelper(); $mysqli->Execute_Batch_dml($sql); ?>
3.事务的应用---转账(dml)
1.acid 原子性,一致性,隔离性,持久性。
2.事务的sql操作
2.1. start transcation;
2.2. savepoint a;
2.3. sql操作;
2.4.
rollback to a;或者 commit;
3.一旦执行commit就无法再rollback。(持久性)
4.事务的php操作
<?php require_once("SqlHelper.class.php"); $mysqli =new SqlHelper(); $mysqli->autocommit(false); $dml1=$mysqli->query("update user set age=age-2 where id=1"); $dml2=$mysqli->query("update user set age=age+2 where id=2"); if(!$dml1||!$dml2)
{ $mysqli->rollback(); }
else
{ $mysqli->commit(); } $mysqli->close(); ?>
4.预处理
从数据库请求资源时,造成性能消耗的几个部分
1.数据库连接的建立(使用批量处理);2.数据库编译语句的消耗(使用预处理)
从数据库请求资源时的安全问题
1.预处理可以防止sql注入(语法上);2.事务的使用(逻辑上)
小知识:access
本地数据库,不用监听,(感觉上有点像xml)
cmd netstat -an
查看数据监听
预处理的应用----向数据库插入1000条用户信息(不同参数下的相同操作)
<?php .... $id=1; $name="cao"; $age=100; $sql="insert into users values(?,?,?)"; $mysqli=new MySQLi("localhost","root","root","test"); $mysqli_stmt->prepare($sql); $mysqli_stmt->bindparam("isi",$id,$name,$age); //s代表字符型,i代表数值型 $mysqli_stmt->execute() or die("execute error".$mysqli_stmt->error); $id=2; $name="hua"; $age=50; $mysqli_stmt->bindparam("isi",$id,$name,$age) ; $mysqli_stmt->execute() or die("execute error".$mysqli_stmt->error); $mysqli_stmt->free(); .... ?>
知识点:预处理中如果发生处理错误,预处理会跳过该条数据的处理,继续执行下一条数据的处理。
预处理发生在dbms。
预处理stmt---dql,打印表
<?php .... $sql="select id ,name ,age from users where id>?"; $mysqli=new MySQLi("localhost","root","root","test"); if($mysqli->connect_error) { die($mysqli->connect_error); } $mysqli_stmt->prepare($sql); $id=5; $mysqli_stmt->bindparam("i",$id); //参数需要多次绑定 $mysqli_stmt->bindresult($id,$name,$age);//此处是按传址绑定。结果集只需要绑定一次。 $mysqli_stmt->execute() or die("execute error".$mysqli_stmt->error); while($mysqli_stmt->fetch()) { echo"<br/>--$id--$name--$age"; } $mysqli_stmt->free_result(); $mysqli_stmt->close(); //关闭预编译指令 $mysqli->close(); .... ?>
小知识:错误日志 error_log
sql :结构化查询语言(所有数据库的基础)
sql万能密码:aa‘ or
1=‘1
密码比对,预处理
mysqli 打印表,
<?php .... echo"has rows".$res->num_rows()."and columns".field_count(); echo"<table border=‘1‘><tr>"; //从表结构表中获取对应列。 foreach($field=$res->fetch_field();) { echo"<th>{$field->name}</th>"; } </tr> while($row=$res->fetch_row()) { echo"<tr>"; foreach($row as $key=>$value) { echo"<td>{$value}</td>" } echo"</tr>"; } echo"</table>"; $res->result(); .... ?>
小知识:pdo提供一个抽象层。