u Php数据库编程
说php有三种方式操作mysql数据库
① Mysql扩展库
② Mysqli扩展库
③ Pdo
Mysql扩展库和mysql数据库的区别(库就是一些函数)
1、Mysql数据库用于存放数据的
DBMS(数据库管理系统)
2、mysql数据库的三层结构示意图
3、Mysql扩展库是一堆函数,是用于对mysql数据库的操作。
实例连接数据库及对数据库数据输出
<?php
header("Content-type:text/html;charset=utf-8");
$link=@mysql_connect("localhost","root",""); //连接数据库
if($link){
echo "数据库连接成功</br>";
}else{
echo "数据库连接失败</br>";
}
@mysql_select_db("db_logistics",$link); //$link最好是写上,选择指定的数据库
@mysql_query("set names utf8"); //编码设定 utf-8 中间不要使用“—”
$sql="select * from tb_car_log"; //sql语句
$res=mysql_query($sql); //执行语句获得数据 res结果集(可以表示是一张表)
//$res 是mysql的资源类型
while($fetch=mysql_fetch_array($res)){ //数据循环输出(一次取出数据)$fetch就是一个数组
//print_r($fetch);
echo "</br>";
//echo "$fetch[0]--$fetch[1]"; //取出数据的方式一
foreach($fetch as $key=>$val){ //foreach方式取出数据二
echo "$val--";
}
echo "</br>";
}
//释放资源
@mysql_free_result($res);
@mysql_close($link); //可以没有,建议写上
?>
细节:
1、使用完$res后要释放资源 mysql_free_result($res);
2、关闭数据库(可以有可以没有,建议使用) mysql_close($link);
mysql数据库的关闭不会立即执行,php里mysql数据库会自动过段时间关闭
3、mysql_fetch_row 是取出下一条数据, mysql_fetch_array()是他的扩展类
4、从$res获取行数据时,处理mysql_fetch_row($res)还有三种方式
分别是:
mysql_fetch_row($res); 返回索引数组(推荐使用)
mysql_fetch_assoc($res); 返回关联数组
mysql_fetch_array($res); 返回索引数组和关联数组(两套,建议不要使用,占用内存 太大)
mysql_fetch_object($res); 把一行数据当做对象返回
Mysql_query();执行sql语句时
是dml语句(数据操作语言 update insert alter)返回bool值
是dql语句(select) 返回结果集
Mysql数据库的dml操作
<?php
header("Content-type:text/html;charset=utf-8");
$link=@mysql_connect("localhost","root",""); //连接数据库
if($link){
echo "数据库连接成功</br>";
}else{
echo "数据库连接失败</br>";
}
@mysql_select_db("db_logistics",$link); //$link最好是写上,选择指定的数据库
@mysql_query("set names utf8"); //编码设定 utf-8 中间不要使用“—”
$sql="select * from tb_car_log"; //sql语句
$res=mysql_query($sql); //执行语句获得数据 res结果集(可以表示是一张表)
while($fetch=mysql_fetch_array($res)){ //数据循环输出(一次取出数据)$fetch就是一个数组
//print_r($fetch);
echo "</br>";
//echo "$fetch[0]--$fetch[1]"; //取出数据的方式一
foreach($fetch as $key=>$val){ //foreach方式取出数据二
echo "$val--";
}
echo "</br>";
}
//释放资源
@mysql_free_result($res);
@mysql_close($link); //可以没有,建议写上
?>
从上面可以看出 ,代码的复用率很低,通常我们会编写一个对于数据库的操作类,封装成一个工具类,SqlHelper.class.php(名字自取);
<?php
class SqlHelper{
public $conn;
public $host="localhost";
public $user="root";
public $pwd="";
public $db_name="spdb1";
//构造函数
function __construct(){
$this->conn=mysql_connect($this->host,$this->user,$this->pwd);
if(!$this->conn){
echo "数据库连接失败".mysql_error();
}
mysql_select_db($this->db_name,$this->conn);
mysql_query("set names utf8");
}
//完成dql语句(select)
public function execute_dql($sql){
$res=mysql_query($sql) or die (mysql_error());
return $res;
}
//完成dml数据(update insert delete)
public function execute_dml($sql){
$res=mysql_query($sql,$this->conn);
//echo mysql_insert_id($link); //显示最新的id
if(!$res){
return 0; //表示失败
}else{
if(mysql_affected_rows($res)>0){
return 1; //表示成功
}else{
return 2; //表示没有对行影响
}
}
}
}
?>
Mysql数据库扩展库mysqli
Mysqli扩展库存在两个版本:即“面向对象版”和“面向过程版”
Mysql扩展库和mysqli扩展库的差别:
1、两者都是可以操作mysql的扩展库;
2、Mysqli是对mysql的改进版;
3、Mysqli扩展库比起mysql来更稳定,执行效率更高;
**Mysqli库的面向过程使用和mysql库的使用方法相同,基本的方法相同
**面向对象的方法使用相同。
Mysqli的快速入门
1、面向对象的风格
配置php.ini启用mysqli的扩展库 (方法中不适用参数)
extension=php_mysqli.dll
*******************实例***********************
<?php
//mysqli操作数据库(面向对象)
//创建mysqli对象
header("Content-type:text/html;charset=utf-8");
$mysqli=new MySQLi("localhost","root","","db_logistics");
if($mysqli->connect_error){
die("连接失败".$mysqli->connect_error);
}else{
echo "连接成功</br>";
}
//操作数据库
$sql="select * from tb_car_log";
$res=$mysqli->query($sql); //结果集
//die($res);
//处理结果
while($row=$res->fetch_row()){
foreach($row as $key => $val){
echo "$val";
}
echo "</br>";
}
//关闭资源
$res->free(); //释放资源
$mysqli->close(); //关闭连接
?>
**************实例*******************
2、面向过程的风格
******************************** (方法中使用参数)
<?php
//面向过程
header("Content-type:text/html;charset=utf-8");
$link=mysqli_connect("localhost","root","","db_logistics");
if(mysqli_connect_error($link)){ //或者!$mysqli
die("连接失败");
}else{
echo "连接成功</br>";
}
$sql="select * from tb_car_log";
$res=mysqli_query($link,$sql);
//var_dump($res);
while($row=mysqli_fetch_row($res)){
foreach($row as $key =>$val){
echo "$val";
}
echo "</br>";
}
mysqli_free_result($res);
mysqli_close($link);
?>
*****************************
**mysql的sql 语句特别说明:
如果操作字段的类型是string 我们要使用‘’包括。
字段类型是 数值型 ,则可以用‘’包括,也可以不用。
Mysqli工具类 SqlTool.class.php
<?php
//mysqli的使用
class SqlTool{
private $link;
private static $host="localhost"; //静态的节省资源
private static $user="root";
private static $pwd="";
private static $db=”test_mysql”;
public function __construct(){
//完成初始化
$this->mysqli=new MySQLi(self::$host,self::$user,self::$pwd,self::$db);
if($this->mysqli->connect_error){
die("连接失败".$this->mysqli->connect_error);
}
//使用utf-8格式使用数据库
$this->mysqli->query("set names utf8");
}
//select语句使用
public function execute_dql($sql){
$res=$this->mysqli->query($sql) or die ("操作失败".$this->mysqli->error);
return $res;
}
//update insert delete语句使用
public function execute_dml($sql){
$res=$this->mysqli->query($sql) or die ("操作失败".$this->mysqli->error);
if(!$res){
return 0; //失败
}else {
if($this->mysqli->affected_rows>0){
return 1; //成功
}else{
return 2; //无行数收到影响
}
}
}
}
?>
Mysqli的增强----批量执行sql语句
批量执行dml语句
<?php
header("Content-type:text/html;charset=utf-8");
$mysqli=new MySQLi("localhost","root","","word");
if($mysqli->connect_error){
die(connect_error);
}
$sqls="insert into word (enword,chword) values ('www','万维网')";
$sqls.="insert into word (enword,chword) values ('http','超文本协议')";
$sqls.="insert into word (enword,chword) values ('text','文本文档')";
//$sql.="update";
//$sql.="delete";
$res=$mysqli->multi_query($sqls);
if(!$res){
die("添加失败");
}else{
echo "添加成功";
}
$mysql->free();
$mysql->close();
?>
***批量执行dml语句时可以批量使用dml语句,但是最好不要使用select语句。
$sqls=”sql1语句 ; sql2语句 ; sql3语句”;
Mysqli:multi_query($sqls);
批量执行dql语句
一次性返回多个就结果集
<?php
header("Content-type:text/html;charset=utf-8");
$mysqli=new MySQLi("localhost","root","","word");
if(mysqli_connect_error()){
echo "连接失败".mysqli_connect_error();
}
$mysqli->query("set names utf8");
//批量dql语句
$sqls="select * from word;";
$sqls.="select * from students";
//取得结果集
$res=$mysqli->multi_query($sqls);
if($res){
do{
$result=$mysqli->store_result();
//取出结果集中的一组数据(一个数组)
while($row=$result->fetch_row()){
foreach($row as $key => $val){
echo "---$val";
}
echo "</br>";
}
//释放结果集
$result->free();
if(!$mysqli->more_results()){ //没有结果集后直接跳出
break;
}
echo "</br>*********新的结果集</br>";
}while($mysqli->next_result());
}
//关闭资源
$mysqli->close();
?>
Mysql事务规范
<?php
header("Content-type:text/html;charset=utf-8");
$mysqli=new MySQLi("localhost","root","","word");
if(mysqli_connect_error()){
echo "连接失败".mysqli_connect_error();
}
$mysqli->query("set names utf8");
$sql1="update account set blance=blance-2 where id=1";
$sql2="update account2 set blance=blance+2 where id=2";
$db1=$mysqli->query($sql1) or die($mysqli->error);
$db2=$mysqli->query($sql2) or die($mysqli->error);
if(!$db1 || !$db2){
echo "转账失败";
}else{
echo "转账成功";
}
?>
此代码执行失败,只执行第一个sql语句。在一些地方是错误的。
**事务
事务是用来保证数据的一致性,由一组相关的dml语句组成,该组的dml语句要么全部成功,要么远不失败。如:网上转账就是典型的要使用事务来处理的,来保证数据的一致性。
<?php
header("Content-type:text/html;charset=utf-8");
$mysqli=new MySQLi("localhost","root","","word");
if(mysqli_connect_error()){
echo "连接失败".mysqli_connect_error();
}
//将提交设为假【事务一旦提交,就不能回滚】
$mysqli->autocommit(false);
//相当于在此做了一个保存点;会把当前情况记录下来
$mysqli->query("set names utf8");
$sql1="update account set blance=blance-2 where id=1";
$sql2="update account2 set blance=blance+2 where id=2";
$db1=$mysqli->query($sql1);
$db2=$mysqli->query($sql2);
if(!$db1 || !$db2){
echo "转账失败".$mysqli->error;
$mysqli->rollback(); //回滚
}else{
echo "转账成功";
$mysqli->commit(); //一旦提交就不能再回滚
}
$mysqli->close();
?>
Mysql 控制台操作,使用事务操作。
1、Start transaction; //开启事务 不做保存点是有一个默认的保存点 。
2、Savepoint a; //设置保存点
3、Drop table **; //数据操纵
4、Rollback to a; /回滚a 其他保存点丢失
如果没有问题就提交commit,
有问题就回滚。Rollback to a。
事务的特点(ACID):原子性,一致性,隔离性,持久性。
Mysqli扩展库的预处理技术 mysqli stmt
想数据库中添加100条数据,如何添加
1、for 循环循环100次,添加数据。
2、使用批量添加
$sqls=”insert ***;”;
$sqls.=”insert ***;”;
。。。。
$mysqli->multi_query($sqls);
3、使用预编译技术,该方案还可以防止sql注入攻击
<?php
$mysqli=new mysqli("localhost","root","","word");
if (mysqli_connect_error()) {
die(mysqli_connect_error());
}
$sql="select enword from word where id>?";
$stmt=$mysqli->prepare($sql); //预处理定义
$id=2; //设定值
//绑定参数
$stmt->bind_param("i",$id);
//绑定结果集
$stmt->bind_result($en_word);
$stmt->execute(); //执行语句
while ($stmt->fetch()) {
echo "</br>----".$en_word; //输出结果
}
$stmt->free_result(); //关闭结果集
$stmt->close(); //关闭连接
$mysqli->close(); //关闭数据库连接
?>
dml
<?php
$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'world');
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
//预编译对象
$stmt = $mysqli->prepare("INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
//绑定
$stmt->bind_param('sssd', $code, $language, $official, $percent);
$code = 'DEU';
$language = 'Bavarian';
$official = "F";
$percent = 11.2;
/* execute prepared statement */
$stmt->execute(); //执行 返回bool值
printf("%d Row inserted.\n", $stmt->affected_rows);
/* close statement and connection */
$stmt->close();
/* Clean up table CountryLanguage */
$mysqli->query("DELETE FROM CountryLanguage WHERE Language='Bavarian'");
printf("%d Row deleted.\n", $mysqli->affected_rows);
/* close connection */
$mysqli->close();
?>
Dql语句执行
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT Name, CountryCode FROM City ORDER by ID DESC LIMIT 150,5";
if ($stmt = $mysqli->prepare($query)) {
/* execute statement */
$stmt->execute(); //执行
/* bind result variables */
$stmt->bind_result($name, $code); //对应查询的字段
/* fetch values */
while ($stmt->fetch()) {
printf ("%s (%s)\n", $name, $code);
}
$stmt->free_result(); //释放资源
/* close statement */
$stmt->close(); //关闭预编译
}
/* close connection */
$mysqli->close(); //关闭连接
?>
**sql语句执行原则的
Php发送sql语句,mysql编译命令,执行处理
预编译可以防止sql(结构化查询语句)注入攻击
使用万能密码
Select * from user1 where name=’ls’ and password=’aa’ or ‘1=1’;
If(查到){
Header(“admin.php”);
}else{
Header(“login.php”);
}
数据库注入 解决方式:
1、使用预编译
2、改变验证数据库用户逻辑
Select password from user1 where name=’ls’ ;
If(从数据库查询的密码==用户输入的密码){
Header(***);
}else{
Header(***);
}
其他使用语句:
<?php
header("Content-type:text/html;charset=utf-8");
function ShowTable($table_name){
$mysqli=new mysqli("localhost","root","","word");
if(mysqli_connect_error()){
die("连接失败".mysqli_connect_error());
}
$mysqli->query("set names utf8");
$sql="select * from $table_name";
$res=$mysqli->query($sql);
//显示行数和列数
echo "公用列数".$res->field_count."行数".$res->num_rows;
//取出表头
echo "<table border=1><tr>";
while ($filed=$res->fetch_field()){
echo "<th>{$filed->name}</th>";
}
echo "</tr>";
//循环取出数据
while ($row=$res->fetch_row()){
echo "<tr>";
foreach ($row as $val){
echo "<td>$val</td>";
}
echo "</tr>";
}
echo "</table>";
$res->free();
$mysqli->close();
}
ShowTable("user");
?>
Pdo 数据库抽象层(兼容数据库,方便项目换数据库)