1. 程式人生 > >php操作MySQL資料庫的方法和解析

php操作MySQL資料庫的方法和解析

對於許多web應用程式而言,資料庫都是其核心所在。資料庫幾乎可以用來儲存所有你想要檢索和更新的任何資訊

下面介紹兩種資料庫的訪問方式:

①. MySQLi 訪問MySQLi (面向物件)資料庫,其中MYSQLi又分為 面向物件 和 面向過程兩種形式

②. PDO訪問MYSQL資料庫

MySQLi 和 PDO那個更好???

MySQLi 和 PDO 各有優勢
1.MySQLi只針對MySQL資料庫,PDO支援12種資料庫
2.兩者都是面向物件, 但 MySQLi 還提供了 API 介面
3.兩者都支援預處理語句。 預處理語句可以防止 SQL 注入,對於 web 專案的安全性是非常重要的。

下面例項來展示一下它們的不同之處:

先建立資料庫和表

create database regist;

use database

CREATE TABLE `user` (
  `name` varchar(255) NOT NULL,
  `pass` varchar(255) NOT NULL,
  PRIMARY KEY (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

 

定義資料庫連線所需的引數

<meta charset="utf-8">
<?php

    $dbtype="mysql";//
使用的資料庫型別 $servername="localhost";//資料庫伺服器主機名 $user="root";//資料庫連線使用者名稱 $pass="root";//資料庫連線密碼 $dbname="regist";//選用的資料庫名 ?>

 

1.MySQLi (面向物件) 連線

<?php
    //連線時指定資料庫名
    //$conn=new mysqli($servername,$user,$pass,$dbname);
    //連線時不指定資料庫名
    $conn=new mysqli($servername,$user
,$pass); if(!$conn){ die("資料庫連線失敗" . mysqli_connect_error()); }else{ //彈出訊息提示框 echo "<script>alert('資料庫連線成功')</script>"; } //注:執行query()方法返回的是一個Statement物件,表示執行成功或執行失敗 //設定資料庫輸出為utf8編碼 // mysqli_query($conn,"set names 'utf8'"); $conn->query("set names 'utf8'"); //選擇資料庫 $conn->select_db($dbname); //增加 $sql="insert into user(name,pass) values('aa','1234')"; // $stmt=mysqli_query($conn,$sql); $stmt=$conn->query($sql); if($stmt){ echo "插入成功"."<br>"; } //修改 $sql="update user set pass='123456' where name='aa'"; // $stmt=mysqli_query($conn,$sql); $stmt=$conn->query($sql); if($stmt){ echo "修改成功"."<br>"; } //查詢 $sql="select*from user"; // $stmt=mysqli_query($conn,$sql); $result=$conn->query($sql); if($result->num_rows>0){ while($row=$result->fetch_assoc()){ echo "查詢結果:"."name: " . $row["name"]. ", pass: " . $row["pass"]."<br>"; } } echo "結果集行數為:".$result->num_rows."<br>"; //刪除 $sql="delete from user where name='aa'"; // $stmt=mysqli_query($conn,$sql); $stmt=$conn->query($sql); if($stmt){ echo "刪除成功"."<br>"; } //關閉資料庫 // mysqli_close($conn); $conn->close(); echo "已關閉!!"; ?> 瀏覽器顯示結果: 插入成功 修改成功 查詢結果:name: aa, pass: 123456 結果集行數為:1 刪除成功 已關閉!!

 

2.MySQLi (面向過程) 連線

<?php
    //連線時指定資料庫名
    //$conn=mysqli_connect($servername,$user,$pass,$dbname);
    //連線時不指定資料庫名
    $conn=mysqli_connect($servername,$user,$pass);
    if(!$conn){
        die("資料庫連線失敗" . mysqli_connect_error());
    }else{
        //彈出訊息提示框
        echo "<script>alert('資料庫連線成功')</script>";
    }

    //執行query()方法返回的是一個Statement物件,表示執行成功或執行失敗

    //設定資料庫輸出為utf8編碼
    mysqli_query($conn,"set names 'utf8'");
    // $conn->query("set names 'utf8'");
    //選擇資料庫
    $conn->select_db($dbname);

    //增加
    $sql="insert into user(name,pass) values('aa','1234')";
    $stmt=mysqli_query($conn,$sql);
    // $stmt=$conn->query($sql);
    if($stmt){
        echo "插入成功"."<br>";
    }

    //修改
    $sql="update user set pass='123456' where name='aa'";
    $stmt=mysqli_query($conn,$sql);
    // $stmt=$conn->query($sql);
    if($stmt){
        echo "修改成功"."<br>";
    }

    //查詢
    $sql="select*from user";
    $result=mysqli_query($conn,$sql);
    // $result=$conn->query($sql);
    //判斷結果集行數是否大於0
    if($result->num_rows>0){
        //檢索結果集的下一行,將檢索的結果放到關聯陣列中,並通過while()迴圈輸出結果集
        while($row=$result->fetch_assoc()){
            echo "查詢結果:"."name: " . $row["name"]. ",    pass: " . $row["pass"]."<br>";
        }
    }
    echo "結果集行數為:".$result->num_rows."<br>";

    //刪除
    $sql="delete from user where name='aa'";
    $stmt=mysqli_query($conn,$sql);
    // $stmt=$conn->query($sql);
    if($stmt){
        echo "刪除成功"."<br>";
    }

    //關閉資料庫
    mysqli_close($conn);
    // $conn->close();
    echo "已關閉!!";
?>
瀏覽器顯示結果:
插入成功
修改成功
查詢結果:name: aa, pass: 123456
結果集行數為:1
刪除成功
已關閉!!

 

3.PDO連線

<?php
    try{
        //這裡注意: 等號兩邊不能存在空格,不然會報錯,如:dbname = $dbname這樣寫就會報錯
        $conn=new PDO("$dbtype:host=$servername;dbname=$dbname",$user,$pass);
        
        //彈出訊息提示框
        echo "<script>alert('資料庫連線成功')</script>";
    
        //注:執行exec()方法PDOStatement物件,表示執行成功或執行失敗
    
        //設定資料庫輸出為utf8編碼
        $conn->exec("set names 'utf8'");

        //增加
        $sql="insert into user(name,pass) values('aa','1234')";
        $stmt=$conn->exec($sql);
        if($stmt){
            echo "插入成功!"."<br>";
        }

        //修改
        $sql="update user set pass='123456' where name='aa'";
        $stmt=$conn->exec($sql);
        if($stmt){
            echo "修改成功!"."<br>";
        }

        //查詢
        $sql="select*from user";
        $result=$conn->query($sql);
        if($result->rowCount()>0){
            while($row=$result->fetch()){
                echo "查詢結果:"."name: " . $row["name"]. ",    pass: " . $row["pass"]."<br>";
            }
        }
        echo "結果集行數為:".$result->rowCount()."<br>";

        //刪除
        $sql="delete from user where name='aa'";
        $stmt=$conn->exec($sql);
        if($stmt){
            echo "刪除成功!"."<br>";
        }

        //關閉資料庫
        $stmt=$conn = null;
        if($stmt){
            echo "已關閉!"."<br>";
        }
    }catch(PDOException $e){
        print "error!".$e->getMeddage();
    }
?>
瀏覽器顯示結果:
插入成功
修改成功
查詢結果:name: aa, pass: 123456
結果集行數為:1
刪除成功
已關閉!

 


MySQLi和PDO在連線資料庫上的不同

一.
①.MySQLi僅針對MYSQL資料庫,所以在連線資料庫時無需指定資料庫型別(就一種資料庫,哪還有什麼型別可選,直接就預設為MySQL啦!)
②.PDO支援多種資料庫的訪問,所以在連線資料庫時必須指定資料庫型別,不然會報錯(PDO可以訪問那麼多種資料庫,你不指定鬼知道你要訪問哪種型別的資料庫呀!)

二.
①.MySQLi連線資料庫時,可以指定資料庫名,也可以不指定資料庫名
②.PDO連線資料庫時,必須指定資料庫名,不然會報錯


MySQLi面向物件和麵向過程方式的異同

一.

MySQLi面向物件:$conn=new mysqli($servername,$user,$pass);
MySQLi面向過程:$conn=mysqli_connect($servername,$user,$pass);

 

我也剛開始學PHP訪問資料庫,所以我除了它們的連線上有明顯區別之外,還沒發現MySQLi面向物件 和 MySQLi面向過程的其他不同之處!!!

剛開始的時候,我發現別人在
使用MySQLi面向物件方式連線資料庫時,都是使用$conn->query($sql)來執行sql語句的;
使用$conn->close()來關閉資料庫。
使用MySQLi面向過程方式連線資料庫時,都是用mysqli_query($conn,$sql)來執行sql語句的;
使用mysqli_close($conn)來關閉資料庫。

但是在嘗試上面的例項時,我發現
不管是MySQLi面向物件還是MySQLi面向過程都可以使用$conn->query($sql)或mysqli_query($conn,$sql)來執行sql語句; 
使用$conn->close()或mysqli_close($conn)來關閉資料庫

 

一直以來都以為$conn->query($sql)是MySQLi面向物件專用的,mysqli_close($conn)是MySQLi面向過程專用的,沒想到不是!
我想了解這其中的區別?希望有那位瞭解的大佬能告訴我,謝謝!


PDO執行sql語句所用方法解析

一.
①.當執行insert,update,delete等沒有返回結果集的查詢時,用PDO物件中的exec()方法來執行,執行成功後會返回受影響的行數
注意:exec()方法不能用於執行select查詢,因為執行select查詢會返回結果集

如:
    $sql="update user set pass='123456' where name='aa'";
    $stmt=$conn->exec($sql);
    print_r($stmt);
瀏覽器顯示:
    PDOStatement Object ( [queryString] => update user set pass='123456' where name='aa' ) 

 

二.
①. 當執行返回結果集的select查詢,則使用PDO物件中的query()方法來執行;
該方法成功執行後,會返回一個結果集,並且可以通過PDOStatement物件中的rowCount()方法來獲取返回結果集的行數

如:
    $sql="select*from user";
    $result=$conn->query($sql);
    if($result->rowCount()>0){
        while($row=$result->fetch()){
            echo "查詢結果:"."name: " . $row["name"]. ",    pass: " . $row["pass"]."<br>";
            }
        }
    echo "結果集行數為:".$result->rowCount()."<br>";
瀏覽器顯示:
    查詢結果:name: aa, pass: 123456
    結果集行數為:1

 

②. MYSQLi訪問資料庫時,可以通過num_rows來獲取返回結果集的行數

如:
    $sql="select*from user";
    $result=$conn->query($sql);
    //判斷結果集行數是否大於0
    if($result->num_rows>0){
        //檢索結果集的下一行,將檢索的結果放到關聯陣列中,並通過while()迴圈輸出結果集
        while($row=$result->fetch_assoc()){
            echo "查詢結果:"."name: " . $row["name"]. ",    pass: " . $row["pass"]."<br>";
        }
    }
    echo "結果集行數為:".$result->num_rows."<br>";

 

三.
①. execute()用於執行prepare預處理語句。
在執行prepare預處理語句時,可以使用bindParam()方法來繫結引數,並對引數進行編碼,然後給execute()執行。
也可以在執行execute()方法繫結引數

②.1.MySQLi 執行prepare()預處理語句時,使用bind_param()方法來繫結引數

如:
    //預處理sql語句
    $stmt=$conn->prepare("insert into user(username,password) values(?,?)");
    //使用bind_param()方法繫結引數
    $stmt->bind_param("ss",$username,$password); 
    //(編輯引數)為繫結的引數賦值
    $username='馬雲';
    $password='123456';
    //執行
    $stmt->execute();

 

2.PDO執行prepare()預處理語句時,使用bindParam()方法來繫結資料庫

    //預處理sql語句
    $stmt=$conn->prepare("insert into user(name,pass) values(:name,:pass)");
    //使用bind_param()函式繫結引數
    $stmt->bindParam(':name',$name); 
    $stmt->bindParam(':pass',$pass);   
    //(編輯引數)為繫結的引數賦值
    $name='王健林';
    $pass='1234ab';
    //執行
    $result=$stmt->execute();

 

3.直接在執行execute()方法時繫結引數

如:
    //預處理sql語句
    $stmt=$dbh->prepare("select * from user where name=?");
    ////執行execute()方法返回的是一個Statement物件,表示執行成功或執行失敗
    if($stmt->execute(['馬雲'])){
        //使用fetch()獲取結果集並放到關聯陣列中
        while($row=$stmt->fetch()){
            echo $row['name']."<br>";
        }
        echo "行數為:".$count=$stmt->rowcount()."<br>";
    }

 

PDO獲取結果集的方法

①. 獲取結果集的的方法。fetch() ,fetchAll() , . . .
1.fetch()
fetch()用於獲取結果集的下一行,一次檢索一行,然後將獲取的資料放到關聯的陣列中。

2.fetchAll()
fetchAll()方法用於獲取結果集中的所有行,其返回值是一個包含結果集中所有資料的二進位制陣列。

②.結果集的返回方式
眾所周知,我們平時獲取陣列的值時,一般都是通過數字索引或者是其字串鍵來獲取的
fetch()方法返回結果集的方式是由其引數控制,
引數為為PDO::FETCH_ASSOC,即通過列名作為陣列索引來獲取
引數為PDO::FETCH_NUM時,通過列號作為索引來獲取
引數為PDO::FETCH_BOTH時,即可通過列名來獲取也可通過列號來獲取,不寫引數時,預設為PDO::FETCH_BOTH

引數為PDO::FETCH_BOTH時

如:
    //預處理sql語句
    $stmt=$conn->prepare("select*from user");
    //執行execute()函式返回的是一個PDOStatement物件,表示執行成功或失敗
    $result=$stmt->execute();
    if($result){
        //fetch()方法用於獲取結果集的下一行,並放入到關聯陣列,通過while()迴圈輸出結果集
        while($row=$stmt->fetch()){
            // echo $row['name'].", " .$row['pass']."<br>";
            echo $row['0'].", " .$row['1']."<br>";
        }
        //輸出結果集中的行數
    echo "行數為:".$count=$stmt->rowcount()."<br>";
    
不寫引數時預設為PDO::FETCH_BOTH, 此時可通過列名$row['name']來獲取結果集, 也可通過列號$row['0']來獲取結果集

 

引數為PDO::FETCH_ASSOC

如:
    //預處理sql語句
    $stmt=$conn->prepare("select*from user");
    //執行execute()函式返回的是一個PDOStatement物件,表示執行成功或失敗
    $result=$stmt->execute();
    if($result){
        //fetch()方法用於獲取結果集的下一行,並放入到關聯陣列,通過while()迴圈輸出結果集
        while($row=$stmt->fetch(PDO::FETCH_ASSOC)){
            echo $row['name'].", " .$row['pass']."<br>";
        }
        //輸出結果集中的行數
    echo "行數為:".$count=$stmt->rowcount()."<br>";
    
引數為PDO::FETCH_ASSOC時,僅可以通過列名$row['name']來獲取結果集, 不可以通過列號$row['0']來獲取結果集

 

引數為PDO::FETCH_NUM

如:
    //預處理sql語句
    $stmt=$conn->prepare("select*from user");
    //執行execute()函式返回的是一個PDOStatement物件,表示執行成功或失敗
    $result=$stmt->execute();
    if($result){
        //fetch()方法用於獲取結果集的下一行,並放入到關聯陣列,通過while()迴圈輸出結果集
        while($row=$stmt->fetch(PDO::FETCH_NUM)){
            echo $row['0'].", " .$row['1']."<br>";
        }
        //輸出結果集中的行數
    echo "行數為:".$count=$stmt->rowcount()."<br>";
    
引數為PDO::FETCH_NUM時,僅可以通過列號$row['0']來獲取結果集, 不可以通過列名$row['name']來獲取結果集

 

參考資料
http://www.runoob.com/php/php-mysql-connect.html
http://blog.okbase.net/phpchina/archive/731.html
https://blog.csdn.net/sck0088/article/details/45674193
https://www.cnblogs.com/dee0912/p/4093014.html
https://www.jb51.net/article/105797.htm