《php與mysql權威指南》第三部分01

第三部分 mysql篇php

第11章 mysql部署與基本使用
11.1 mysql概述
11.2 登陸與退出mysql
  mysql -h主機地址 -u用戶名 -p用戶密碼
11.3 建立、刪除數據庫和用戶
  建立:create datebase [if not exists] db_name
  刪除:drop database [if not exists] db_name
  建立新用戶:create user user[identified by [password] 'password'][,user2 [identified by [pssword] 'password']]..
11.4 mysql用戶管理及權限分配
  mysql安裝好以後有默認三個數據庫
    mysql:存放用戶及權限相關信息
    test:供用戶測試用的數據庫
    information_schema:提供數據庫其餘信息(字符集,存儲引擎,全局變量,數據庫各表的行數及表的大小統計信息等)
  mysql訪問權限系統:mysql數據庫
    user表:全局級的,存放容許連接故武器的用戶信息
    db表:數據庫級的存放哪一個用戶能夠從哪些主機以哪些權限來操做哪些數據庫
    host表:db表的擴展,提供另一些主機名
    table_priv表:數據表級別的,設置的權限只能做用於給定數據表中的全部列
    columns_priv表;數據列級別的,設置的權限只能做用於給定數據表中的特定列
    procs_priv表:控制存儲過程時使用
    ...
  設置用戶權限:最少權限原則
  設置權限:grant 權限 on 表 to 用戶@主機 identified by 用戶
  收回權限:revoke 權限 from 用戶
  刪除用戶:delete from user where user='用戶名';
  更新從新加載權限表:
    ---
    flush privileges;
    ---
  修改密碼:
    update user set password=password('密碼') where user='用戶名';
    grant usage on *.* to '用戶名' identified by '密碼';
  改密碼後中止mysql進程,開啓進程,刷新內存
    ---
    mysqld --skip_grant_tables
    mysql -u root
    mysql>flush privileges
    ---
  查找mysql的進程id號命令
  ---
  ps aux|grep mysqld
  ---
11.5 mysql優化
  選取最適用的字段屬性
  鏈接負載:back_log參數
  最大併發鏈接數--->查看:max_used_connection或show status
  守護進程用戶:守護進程應當按非root用戶的權限運行
    ---
    .bin/mysqld_safe -user=user1 &
    ---
  權限:常常使用簡化權限來提升查詢速度
  使用json代替子查詢的subqueries
  表的優化
    語句:optimize table tablename:修復數據
    命令:myisamchk -r table
    使用union代替手動建立的臨時表
  使用索引:全部的類類型均可以被索引。explain命令能夠檢索該索引是否正在使用中。索引提升select操做性能,下降插入刪除等性能
  優化的查詢語句:避免查詢中mysql進行自動類型轉換(轉換過程使索引對於優化查詢無效)
  使用默認值,減小insert語句所花的時間
第12章 數據庫操做:PHP+mysql
12.1 mysql擴展
  數據庫鏈接:
    mysql_connect():打開鏈接;mysql_close():關閉鏈接
    mysql_pconnect():打開持久鏈接,mysql_close()不會關閉該鏈接
    mysql_select_db('database');//選擇數據庫
    $result=mysql_query('select * from table');
    while($row=mysql_fetch_array($result,Mysql_assoc)){
      print_r($row);//打印每一行數據
    }
    # mysql_fetch_array()以一個常量表示所返回數組的類型-->mysql_assoc->關聯數組,mysql_num->索引數組,mysql_both->關聯數組與索引數組混合的數組
    # mysql_fetch_object():將每行的數據封裝成一個對象
  插入數據
    建立表:
    -----
    create table 'table'(
      'id' int(11) not null auto_increment primary key,
      'title' varchar(20) not null,
      ...
    )engine=InnoDB
    -----
12.2 mysqli擴展
  PHP.ini開啓mysqli擴展:extension=php_mysqli.dll,
  開啓mysqli擴展的好處:更好的兼容性,全面支持面向對象,更快的速度,更好的安全性,支持預準備語句,改進調試功能
  mysqli面向對象和麪向過程編程方式
    面向過程就是分析出解決問題所須要的步驟而後一步一步去實現,使用時只要一個一個一次調用便可
    面向對象是以功能來劃分的
    1.面向對象示例代碼:
      -----
      <?php
      $mysqli=new mysqli('localhost','root','root','exer');
      $query='select * from messages';
      $mysqli->quert('set names utf8');
      $result=$msyqli->query($query);
      if($result){
        while($obj=$result->fetch_object()){
          var_dump($obj);
        }
      }else{
        echo '失敗';
      }
      $result->free();
      $mysqli->close();
      ?>
      -----
    2.面向過程示例代碼:
      -----
      <?php
      $conn=mysqli_connect('localhost','root','root','exer');
      if($conn){
        mysqli_query($conn,'set names utf8');
        $query='select * from messages';
        $result=mysqli_quert($conn,$query);
        while($obj=mysqli_fetch_object($result)){
          var_dump($obj);
        }
      }else{
        echo '連接失敗';
      }
      myslqi_free_result($result);
      mysqli_close($conn);
      ?>
      -----
  預準備語句:prepare-->提升語句重複使用的性能,提升數據庫安全性
    prepare()->進行預準備語句查詢;execute()->執行該語句
    1.綁定結果
      -----
      <?php
      $mysqli=new mysqli('localhost','root','root','exer');
      $mysql->set_charset('utf8');
      $query='select * from messages';
      $result=$mysqli->prepare($sql);
      $result->execute();
      $result->bind_result($id,$title,$name,$message,$date);
      while($result->fetch()){
      print_r($id.$title.$name.$message.$date);
      }
      
      $result->close();
      $mysqli->close();
      ?>
      -----
    2.綁定參數:bind_param($format,$types,$v1,$v2...)
      -----
      <?php
      $mysqli=new mysqli('localhost','root','root','exer');
      $mysql->set_charset('utf8');
      $query='insert into message values(?,?,?,?,?)';
      $result=$mysqli->prepare($sql);
      $id=null;$title='標題';$message='信息';$name='名字';$date=null;
      $result->bind_param('issss',$id,$title,$name,$message,$date);//綁定參數
      $result->execute();
      $result->close();
      $mysqli->close();
      ?>
      -----
      # 其中issss爲後面參數的類型,id爲i->int類型,s->string,D->double,b->bool
  多查詢:multi_query()->多個之間用;鏈接,
    用use_result()|store_result()讀取,其中use_result()更快
    用more_result()查詢是否還有其餘結果集
    用next_result()獲取下一個結果集
12.3 數據庫抽象層:PDO|ADODB->爲解決數據庫從一個數據庫系統一直到另外一個數據庫系統的麻煩而產生的API
  關係型數據庫->mssql,mysql,oracle
  PDO:編碼一致性、靈活性、面向對象特性、高性能
    開啓:extension=php_pdo_mysql.dll
    1.鏈接並查詢數據庫:構造函數中只須要三個參數就能夠創建鏈接
      -----
      <?php
      $dsn="mysql:dbname=exer;host=localhost";
      try{
        $pdo=new PDO($dsn,'root','root');
        $sql='select * from message';
        $pdo->query('set names utf8');
        foreach($pdo->query($sql) as $row){
          var_dump($row);
        }
      }catch(PDOException $e){
        echo '鏈接失敗';
        var_dump($e);
      }
      ?>
      -----
      # 增刪改操做用exer()方法
    2.取得返回結果
      -----
      <?php
      $dsn="mysql:dbname=exer;host=localhost";
      try{
        $pdo=new PDO($dsn,'root','root');
        $sql='select * from message';
        $pdo->query('set names utf8');
        $result=$pdo->query($sql);
        while($row=$result->fetch(PDO::FETCH_ASSOC)){
          var_dump($row);
        }
      }catch(PDOException $e){
        echo '鏈接失敗';
        var_dump($e);
      }
      ?>
      -----
      # fetch()經過參數來控制數組輸出的方式,默認參數爲FETCH_BOTH
      # fetchAll()獲取一個包含全部結果的數組
      # fetchColumn()獲取結果集指定列的值
    3.PDO錯誤處理:
      errorCode();錯誤碼
      errorInfo();錯誤信息
  ADODB
    1.安裝
    2.鏈接數據庫
      $conn=NewADOConnection('mysql');
      $conn->Connect($db_host,$db_user,$db_pwd,$db_name);
      # 用Close()關閉數據庫的鏈接
    3.使用ADODB執行查詢
      -----
      <?php
      require_once 'adodb5/adodb.inc.php';
      $conn=NewADOConnection('mysql');
      $conn->Connect($db_host,$db_user,$db_pwd,$db_name);
      $conn->Execute('set names utf8');
      $result=$conn->GetArray('select * from message');
      while(!result->EOF){
        var_dump($result);
        $result->MoveNext();//移動到下一條記錄
      }
      ?>
      -----
      # 跟蹤和調試:$conn->debug=true;
    4.執行增刪改查:
      -----
      <?php
      require_once 'adodb5/adodb.inc.php';
      $conn=NewADOConnection('mysql');
      $conn->debug=true;
      $conn->Connect($db_host,$db_user,$db_pwd,$db_name);
      $name='name';
      $title='title';
      $message='message';
      $sql='insert into message values(null,...)';
      $rs=$conn->Execute('set names utf8');
      $rs=$conn->Execute($sql);
      var_dump($rs)
      ?>
      -----
    5.公用變量
      $ADODB_COUNTERCS
      $ADODB_CACHE_DIR:存儲的數據保存在指定的文件夾中
      $ADODB_GETCH_MODE:結果集以哪一種方式將數據傳給數組
    6.有用函數
      GetMenu():創建下拉菜單
      Render():分頁
第13章 mysql中sql語句的應用
13.1 slq語句基本應用:增刪改查
13.2 Max():
  常數列的最大值:select max(price) as price from shop;
  擁有某列最大值的行:select article,price from shop where price=(select max(price) from shop);
  按組排列最大值:select article,max(price) as price from shop group by article;
  提取某列在組間最大值:select articel,dealer,price from shop s1 where price=(select Max(s2.price) from shop s2 where s1.article=s2.article);
13.3 使用用戶變量:清空用戶變量來記錄結果,而沒必要將它們保存到客戶端的臨時變量中
  select @min_price:=min(price),@max_price:=Max(price) from shop;
13.4 使用AUTO_INCREMENT
13.5 經常使用字符串函數
  1.concat(str1,str2...);//返回參數鏈接的字符串,參數能夠是字段名|格式化字段表達式|普通字符串等
  2.concat_ws(分隔符,str1,str2..);//返回用分隔符分隔的參數鏈接的字符串,參數能夠是字段名|格式化字段表達式|普通字符串等
  3.length(str);//返回字符串的字符長度,1個漢字算3個字符--->char_length(str);//多字節字符僅計算一次
  4.left(str,len);//返回字符串str最左邊的len個字符(漢字算一個)
  5.right(str,pos);//返回字符串str最右邊的len個字符(漢字算一個)
  6.substring(str,pos);//返回從字符串str的pos位置開始到最後的子串
  7.replace(str,from_str,to_str);//替換str
  8.repeat(str,count);//重複字符串
  9.reverse(str);//字符串翻轉
13.6 日期和時間函數
  1.to_days(date);//返回從0年到date的天數
  2.current_date()|current_time();//取得當前的日期和時間
  3.from_unixtime()|unit_timestamp();//時間戳轉換
  4.utc_date(),utc_time(),utc_timestamp();//獲取當前utc的日期時間
  5.year(),month(),day(),hour(),minite(),second();//返回所需的時間
  6.adddate(time字段,num);//起始時間加上num天
  7.subdate(time字段,num);//起始時間減去num天
  8.datediff(d1,d2);//d1-d2的天數
13.7 導入數據
  1.load date infile;//將定界文本文件導入到mysql表中
    使用時設置local-infile=0選項啓動mysql守護進程
    示例:LOAD DATA LOCAL INFILE 'shp.txt' INTO TABLE shop FILELDS TERMINATEA BY ',' ENCLOSED BY '\' ECSAPED BY '\\' LINES TERMINATED BY '\n';
  2.mysqlimport
    ---
    mysqlinmport [options] database textfile [textfile2,...]
    ---
13.8 導出數據
  1.select into outfile;//將查詢導出到文本文件中
  2.mysqldump命令:mysqldump -h host -uroot -ppass dbname table>table.sql;mysql

相關文章
相關標籤/搜索