php数据库编程

php数据库编程:
目前动态网站都是基于数据库,将网站内容使用数据库管理系统去管理
用户,栏目,图片,文章,评论都是存储在数据库中

php+mysql 黄金搭档
mysql架构:
 c/s  client/server
mysql端口号是3306
mysql DBMS
客户端  服务器--数据库--数据表--(记录,字段)
程序员需要做到的:
    1.为你的项目设计表
    2.使用sql语句(sql编程)
目录结构:
    my.ini bin/  data/

2.创建数据库
SQL(structured Query Language)
DDL
    create database 库名
    create table [库名.]表名  use库名
    drop database 库名
    drop table 表名
DML
    insert into users(id,name) values('1','yanlei');
    update users set name='aa',age='10' where id='1';
    delete from 表名 where id='2';
DQL
    select * from 表名;
DCL

\s 看状态
show databases 看所有库
show tables 看所有表
desc 看表结构
show variables 配置文件中的变量

DDL
    CREATE TABLE [IF NOT EXISTS] 表名称(
        字段名1  列类型 [属性] [索引]
        字段名2  列类型 [属性] [索引]
    )[表类型][表字符集];
需要自己定义名称的 是表名和字段名
SQL语句是不区分大小写的,表名就是一个文件名,windows不区分大小写,linux区分
1.一定要有意义(英文或英文组合和多个单词的缩写)
2.自己定的名称最好都小写
3.SQL都大写
数据值和列类型:
都是按空间大小来区分的
    1.数值型
    2.字符型
        char     空间固定  255
        varchar   可变长度 255
        text  文本数据(文章,日记)
        blob 保存二进制数据 (照片,压缩包)
    3.日期型
    DATE            YYYY-MM-DD
    TIME            hh:mm:ss
    DATETIME        YYYY-MM-DD hh:mm:ss
    TIMESTAMP        YYYYMMDDhhmmss
    YEAR            YYYY

数据字段属性:
    1.unsigned 可以让空间增加一倍,(无符号字段)
        只能用在数值型;(没用负值是可以用)
    2.zerofill
        只能用在数值型字段,前导0
        该字段自动应用unsigned
    3.AUTO_INCREMENT
     只能是整数,数据每增加一条就会自动加一,字段的值是不允许重复
    NULL 0 留空都会在原基础上加一;
    4.NULL和NOT NULL
        默认是空
        NULL值
    尽量在创建表的时候每个字段都不要插入NULL
    5.default缺省值 (默认)
        可以与NOT NULL配合使用 当不插入值时 就用缺省值;
    CREATE TABLE yan(
        id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(30) NOT NULL DEFAULT '',
        height DOUBLE(10,2) NOT NULL DEFAULT 0.00
    );
创建索引:
    1.主键索引
        主要作用是确定数据库表里一条特定数据记录的位置
        最好为每一张数据表定义一个主键
        一个表只能指定一个主键
        主键的值不能为空
    2.唯一索引
        都可以防止创建重复的值
        每一个表都可以有多个唯一索引
        (unique)
    3.常规索引
        最重要的技术
        提升数据库的性能
        可以提高查找的速度,减慢数据列上插入,删除,修改速度
        和表一样是独立的数据对象
        可以单独使用
        也可以再创建表的时候创建
        index与key是同义词;一样的
        index 索引名(字段名)||key 索引名(字段名)
        删除索引:drop index 索引名 on 所在表名;
        多列都可以创建常规索引;
    4.全文索引
        fulltext类型索引,MYISAM表类型使用,只有在char
        varchar,text文本字符串上使用,也可以多个数据列使用
数据表类型及存储位置
    mysql和大多数数据库不同,mysql有一个存储引擎概念;
    mysql可以针对不同的存储引擎需求可以选择最优的存储引擎
    引擎 数据表类型
    12中学的有:myisam和 innodb
    语法:create table ()type= innodb;
          create table() engine= innodb;
    myisam 表类型是默认的;
    注意:在一个mysql库中可以(创建表时)指定不同表类型
    myisam 表类型(强调快速读取操作)
        要用OPTIMIZE TABLE 表名 ,用于整理更新操作产生的碎片;
        有些功能不支持(如不支持外键)
    innodb 表类型
        支持一些myisam所不支持的功能
        占用空间大,
    如何选择:(一个数据库中可以有不同表类型的表存在)
        功能        MYISAM        INNODB
        事务处理      NO               YES
        数据行锁定      NO              YES
        外键约束      NO              YES
        表空间占用      相对小          相对大 最大2倍
        全文索引      YES              NO

MYSQL默认字符集:
    ACSII,ISO-8859-1/latin1
    汉字:gb2312-80(不推荐使用),gb13000(不推荐)
    GBK(可以用),GB18030(数据库支持还比较少见)
    支持用的:
    UTF-32,UTF-2,UTF-16,UTF-16,UTF-8(强烈推荐)
    GBK 2字节 UTF8 3字节
    name varchar(12) 6个汉字   GBK
    name varchar(12)    4个汉字  UTF-8
    数据库中的UTF-8,没有- ,是utf8;
    客户端与服务器交互时:
        set names 字符集    修改字符集
修改表
    alter table 表名 动作
    如:alter table yan add name varchar(12) not null;
    更改:alter table yan modify sex char(3);(类型)
         alter table yan change name username varchar(30);(能改列名)
         alter table yan rename as lei;(改表名)
插入表数据insert
    语法:insert into 表名 values ("","",);
    所有需要写字段名的地方都不加单引号或者双引号,但所有值建议都要以字符
        形式使用
    update 表名 set 字段=‘值’[条件] 条件是确定要更改的记录,可以通过
        条件指定一条也可以指定多条
    delete from 表名 [条件]
                where
    select
        都可以使用 各种运算符号(可以把字段当做一个变量)
        语法:
    SELECT [ALL][DISTINCT]  //distinct 作用整个查询列表取消重复的数据
            {*|table.*|[table.]field1[as alias1].....}
        FROM 表名[]
        [WHERE.....]
        [GROUP BY...]
        [HAVING....]//分组后给的条件
        ORDER BY
        LIMIT
        使用SELECT查询语句,目的就是可以按你的想法将数据查出来,将结果
        返回给你;
        在SQL语句中使用表达式的列(算术运算符号,可以使用条件,逻辑运算符)
        WHERE可以再SELECT UPDATE DELETE 使用
        &&(AND)   ||(OR)    !(NOT)
        =,!= <>,<,<=,IS NULL,IS NOT NULL,
        BETWEEN AND,(包括边界)
        LIKE,NOT LIKE(模糊查询,_(任意一个字符)和%(任意多个字符)
                    两个通配符号)
        IN,(一个范围列表)
         REGEXP RLIKE;
        <=>(和=作用一样,可以比较出NULL值,=不可以)
    多表查询(连接查询 起别名,简化):
    order by 字段 [asc正序]desc倒序    (排序);
    limit 0,n;取查询结果的个数 从0开始取,取到第n个;
    count() 总数,sum()总和,avg()平均值,max()最大值,mix()最小值;
    

 
php有三种方式来操作我们的mysql数据库
    1.mysql扩展库
    2.mysqli扩展库
    3.pdo
    mysql_insert_id();id的最后值;
    mysql_affected_rows();影响行数;
    mysql_close;关闭数据库连接;
mysql扩展库与mysql数据库的区别:
    1.mysql数据库是用于存放数据
    2.mysql数据库的三层结构    客服端—>dbms->数据对象
使用php的mysql扩展库完成对mysql 操作;
 启用mysql扩展库
    创建一张用户表,
<?php

    $conn=mysql_connect("localhost","root","") or die ('数据库连接失败');

    mysql_select_db("yanlei",$conn);
    mysql_query("set name utf8");

    $sql="select * from user1";
    
    $rel=mysql_query($sql,$conn);

    //var_dump($rel);
    
    while($row=mysql_fetch_row($rel)){
    
        foreach ($row as $key => $val){
        
            echo "$key = $val"."<br/>";
        }
    
    }
      //释放资源,关闭连接
      mysql_free_result($rel);
      mysql_close($conn);

?>
细节:
1.使用完$rel结果集后,一定要及时释放资源
2.mysql_close($conn)没有的话,也系统也会自动关闭
$row =mysql_fetch_row($rel);二维数组,指向返回的的数组的下一行;
mysql_fetch_row($rel),返回的是一个索引数组(推荐使用)[0=>$val]
mysql_fetch_assoc($res),返回一个关联数组 ['id'=>$val]
mysql_fetch_array($res),返回索引数组和关联数组()两套
mysql_fetch_object($res),返回一行数据,当做一个对象返回;
将数据库的操作,封装成一个工具类,名字:sqltool.class.php

mysqli扩展库:
有俩套风格,面向对象   面向过程(照顾老程序员)
在php.ini文件中启用mysqli扩展库

    //mysqli操作mysql数据库(面向对象风格)

    //创建mysqli对象
    $mysqli=new MYSQLI("localhost","root","","yanlei");
    //验证是否OK
    if($mysqli->connect_error){
    
        die("连接失败".$mysqli->connect_error);
    
    }
    //操作数据库(发送sql)
    $sql="select * from user1 where id=5";
    //$res 是结果集 .mysqli result
    $res=$mysqli->query($sql);
    
    //var_dump($res);
    //处理结果 mysql_fetch_row()
    while ($row=$res->fetch_row()){
    
        foreach($row as $key=>$val){
        
            echo "--$val";
        
        }
        echo "<br/>";
    
    }

    //关闭资源
    $res->free();
    $mysqli->close();
在mysqli 释放结果集有3种方式,
 mysqli_result::free()
mysqli_result::close()
mysqli_result::free_result()

批量处理DML
$sqls="sql语句1;sql语句2";
myslqi::multi_query($sqli)
批量处理DQL
$sqls="sql语句1;sql语句2";
myslqi::multi_query($sqli)
$result=$mysqli->store_result();
事务处理:
我们有时需要一组数据同时成功或同时失败,一保持事物的一致性;
如:网上转账,
//将提交设为false
$mysqli->autocommit(false);
.....//处理程序

if(!$b1||!$b2){
    //回滚
    $mysqli->rollback();
}else{
//提交
$mysqli->commit();
}
$mysqli->close();

在mysql控制台可以使用事务来操作,如:
1.开启一个事务
start transaction
2.做保存点
savepiont 保存点名称
3.操作。。。。。
4.可以回滚,可以提交
   没有问题
    commit
   有问题
    rollback to 保存点名称
事务的acrd
    原子性,一致性,持久性,隔离性

mysqli扩展库的 预处理技术 mysqli stmt:
<?php

    //预编译
    //1.创建mysqli 对象

    $mysqli=new MYSQLi("localhost","root","","yanlei");

    //2.创建预编译对象
    $sql="insert into user1 (name,password,email,age) values(?,?,?,?)";
    $mysqli_stmt=$mysqli->prepare($sql);
    
    //参数绑定->给?赋值这里类型和顺序都要对应;
    $mysqli_stmt->bind_param("sssi",$name,$password,$email,$age);
    
    //绑定参数
    $name="小倩";
    $password="xiaoqian";
    $email="yanell@qq.com";
    $age="200";
    //执行
    $b=$mysqli_stmt->execute();

    //继续添加
    $name="妖怪";
    $password="yaoguai";
    $email="yjlj@qq.com";
    $age="1010";
    //执行
    $b=$mysqli_stmt->execute();
    
    if(!$b){
        die("操作失败".$mysqli_stmt->error);
    }else{
        echo "操作OK";
    }
    //释放资源
    $mysqli->close();
?>
DQL预编译:
<?php

    //预编译演示
    //需求:请使用预处理的方式,从数据库查询
    //使用预处理的方式,查询所有id>5的用户的id,name,email

    $mysqli=new MYSQLi("localhost","root","","yanlei");

    if(mysqli_connect_error()){
    
        die(mysqli_connect_error());
    
    }
    //创建一个预定义的对象,?占位
    $sql="select id,name,email from user1 where id>?";
    $mysqli_stmt=$mysqli->prepare($sql);
    //绑定参数
    $mysqli_stmt->bind_param("i",$id);
    //绑定结果集
    $mysqli_stmt->bind_result($id,$name,$email);
    
    $id=5;
    //执行
    $mysqli_stmt->execute();
    //取出绑定值
    while($mysqli_stmt->fetch()){
    
        echo"<br/>-----$id----$name----$email";
    }

    echo "<br/>**********************";

    $id=10;
    //执行
    $mysqli_stmt->execute();

    //取出绑定值
    while($mysqli_stmt->fetch()){
    
        echo"<br/>-----$id----$name----$email";
    }

    //关闭资源
    //释放结果
    $mysqli_stmt->free_result();
    //关闭预编译语句
    $mysqli_stmt->close();
    //关闭连接
    $mysqli->close();

?>
预编译可以防止SQL注入攻击;
mysqli中的方法和属性:
<?php

    function showtable($table_name){
    
        $mysqli=new MYSQLi("localhost","root","","yanlei");

        if(mysqli_connect_error()){
        
            die(mysqli_connect_error());
        
        }
        $sql="select * from $table_name";
        $res=$mysqli->query($sql);
        
        //如何获取总行数和列数
        echo "有行数".$res->num_rows."-列=".$res->field_count."<br/>";

        echo "<table border='1'><tr>";
        while($head=$res->fetch_field()){
        
            echo "<th>{$head->name}</th>";
        }
        echo "<tr/>";
        
        //循环取出数据
        while($row=$res->fetch_row()){
            echo "<tr>";
            foreach($row as $key=>$val){
            
                echo "<td>{$val}</td>";
            }
            echo "</tr>";
        
        }
        echo "</table>";

        $res->free();
        $mysqli->close();
    }
    showtable("user1");

?>

posted on 2012-12-21 00:48  磊W磊  阅读(256)  评论(0)    收藏  举报

导航