1. 程式人生 > >PDO進行sql語句預處理和操作結果集詳細介紹(二)

PDO進行sql語句預處理和操作結果集詳細介紹(二)

<span style="font-size:18px;">一:預處理語句及其繫結引數執行insert

try {
        $pdo=new PDO("mysql:host=localhost;dbname=xsphpdb", "root", "123456");
    }catch(PDOException $e){
        echo $e->getMessage();
    }
    
    /* pdo中有兩種佔位符號
     *  
     *  ? 引數             --- 索引陣列, 按索引順序使用
     *  名字引數           ----關聯陣列, 按名稱使用,和順序無關
     */
    
    $stmt=$pdo->prepare("insert into shops(name, price, num, desn) values(?, ?, ?, ?)"); //所有SQL都可執行
    
    //準備好了一條語句,併入到伺服器端,也已經編譯過來了,就差為它分配資料過來
//    $stmt=$pdo->prepare("insert into shops(name, price, num, desn) values(:name,:price, :num, :desn)");
    
    //繫結名字引數   順序可以不一致和名字對應即可
/*    $stmt->bindParam(":name", $name);
    $stmt->bindParam(":num", $num);
    $stmt->bindParam(":desn", $desn);
    $stmt->bindParam(":price", $p);
 */
    ////繫結  問好?引數---得按順序繫結
    $stmt->bindParam(1, $name, PDO::PARAM_STR);//第3個引數是資料型別可不用寫,會自動找型別
    $stmt->bindParam(3, $num, PDO::PARAM_INT);
    $stmt->bindParam(4, $desn, PDO::PARAM_STR);
    $stmt->bindParam(2, $p, PDO::PARAM_STR);

    $name="wwww1";
    $num=101;
    $desn="hello1";
    $p=34.51;

    if($stmt->execute()){
        echo "執行成功";
        echo "最後插入的ID:".$pdo->lastInsertId();
    }else{
        echo "執行失敗!";
    }
    
    //多次插入------------想執行多次。。。N次,傳值即可
    $name="wwww1";
    $num=101;
    $desn="hello1";
    $p=34.51;

    if($stmt->execute()){
        echo "執行成功";
        echo "最後插入的ID:".$pdo->lastInsertId();
    }else{
        echo "執行失敗!";

    }

二:預處理語句UPDATE

try {
        $pdo=new PDO("mysql:host=localhost;dbname=xsphpdb", "root", "123456");
    }catch(PDOException $e){
        echo $e->getMessage();
    }
    
    /* pdo中有兩種佔位符號
     *  
     *  ? 引數             --- 索引陣列, 按索引順序使用
     *  名字引數           ----關聯陣列, 按名稱使用,和順序無關
     */
    
    //準備好了一條語句,併入到伺服器端,也已經編譯過來了,就差為它分配資料過來
    //$stmt=$pdo->prepare("insert into shops(name, price, num, desn) values(?, ?, ?, ?)"); //所有SQL都可執行
    
    //update和insert一樣
    $stmt=$pdo->prepare("update shop set name=:name,num=:num,price=:price,desn=:desn where id=:id"); //所有SQL都可執行
    
    
    //繫結名字引數   順序可以不一致和名字對應即可
    $stmt->bindParam(":name", $name);
    $stmt->bindParam(":num", $num);
    $stmt->bindParam(":desn", $desn);
    $stmt->bindParam(":price", $p);//變數名字隨便寫
    $stmt->bindParam(":id", $id);
 


    $name="nnn";
    $num=101;
    $desn="hello1";
    $p=34.51;
    $id=108;

    if($stmt->execute()){
        echo "執行成功";
        //echo "最後插入的ID:".$pdo->lastInsertId();
    }else{
        echo "執行失敗!";
    }
    
    //接著傳值執行第二次-----N次,這就是PDO預處理,只會編譯一次SQL,其他想執行傳值就可以
    $name="mmm";
    $num=101;
    $desn="hello1";
    $p=34.51;
    $id=109;

    if($stmt->execute()){
        echo "執行成功";
    }else{
        echo "執行失敗!";
    }

三:預處理插入多條

try {
        $pdo=new PDO("mysql:host=localhost;dbname=xsphpdb", "root", "123456");
    }catch(PDOException $e){
        echo $e->getMessage();
    }
    
    /* pdo中有兩種佔位符號
     *  
     *  ? 引數             --- 索引陣列, 按索引順序使用
     *  名子引數           ----關聯陣列, 按名稱使用,和順序無關
     */
    
    $stmt=$pdo->prepare("insert into shops(name, price, num, desn) values(?, ?, ?, ?)"); //所有SQL都可執行--syi===
    
    //準備好了一條語句,併入到伺服器端,也已經編譯過來了,就差為它分配資料過來
//    $stmt=$pdo->prepare("insert into shops(name, price, num, desn) values(:name,:price, :num, :desn)");
    
    //繫結引數
/*    $stmt->bindParam(":name", $name);
    $stmt->bindParam(":num", $num);
    $stmt->bindParam(":desn", $desn);
    $stmt->bindParam(":price", $p);
 */
    //繫結引數
    $stmt->bindParam(1, $name, PDO::PARAM_STR);
    $stmt->bindParam(3, $num, PDO::PARAM_INT);
    $stmt->bindParam(4, $desn, PDO::PARAM_STR);
    $stmt->bindParam(2, $p, PDO::PARAM_STR);

    $name="wwww1";
    $num=101;
    $desn="hello1";
    $p=34.51;

    if($stmt->execute()){
        echo "執行成功";
        echo "最後插入的ID:".$pdo->lastInsertId();
    }else{
        echo "執行失敗!";
    }


    $name="ooo";
    $num=101;
    $desn="hello1";
    $p=34.51;

    if($stmt->execute()){
        echo "執行成功";
        echo "最後插入的ID:".$pdo->lastInsertId();
    }else{
        echo "執行失敗!";
    }


    四:不繫結引數,直接execute中帶值執行sql

    try {
        $pdo=new PDO("mysql:host=localhost;dbname=xsphpdb", "root", "123456");
    }catch(PDOException $e){
        echo $e->getMessage();
    }
    
    /* pdo中有兩種佔位符號
     *  
     *  ? 引數             --- 索引陣列, 按索引順序使用
     *  名子引數           ----關聯陣列, 按名稱使用,和順序無關
     */


    
    //準備好了一條語句,併入到伺服器端,也已經編譯過來了,就差為它分配資料過來
    $stmt=$pdo->prepare("insert into shops(name, price, num, desn) values(:name,:price, :num, :desn)");
    
    //    $stmt->execute($_POST);
    //傳值是可以不按順序--這是名字引數
    $stmt->execute(array(":price"=>99, ":name"=>"kkk1", ":num"=>"451", ":desn"=>"aaaaaa1"));
    $stmt->execute(array(":price"=>88, ":name"=>"kkk2", ":num"=>"452", ":desn"=>"aaaaaa2"));
    $stmt->execute(array(":price"=>77, ":name"=>"kkk3", ":num"=>"453", ":desn"=>"aaaaaa3"));


五:獲取結果集

try {
        $pdo=new PDO("mysql:host=localhost;dbname=xsphpdb", "root", "123456");
    }catch(PDOException $e){
        echo $e->getMessage();
    }
    
    //獲取結果   fetch()取一條--返回的是關聯和索引陣列一起返回
    //獲取結果   fetchAll();  得到得是二維陣列
    
    $stmt=$pdo->prepare("select id, name, price, num, desn from shops where id > :id order by id");

    $stmt->execute(array(":id"=>100));   //如果預SQL沒有引數時,execute也不用帶引數 直接問執行就可以
    
    $stmt->setFetchMode(PDO::FETCH_ASSOC);//設定所有的獲取模式,全部是關聯陣列,下面就不用改啦,也可以解除安裝fetch裡面(PDO::FETCH_ASSOC),不寫就是預設的型別關聯和索引都返回
/*
    while($row=$stmt->fetch()){//獲取所有查出來的值  迴圈
        print_r($row);
        echo '<br>';
    }
 */
  /*
    $row=$stmt->fetch(PDO::FETCH_ASSOC);獲取關聯陣列
    $row=$stmt->fetch(PDO::FETCH_NUM);  獲取索引陣列
    $row=$stmt->fetch(PDO::FETCH_BOTH); 關聯和索引都返回--預設就是這個
    print_r($row);
  */
    $data=$stmt->fetchAll(PDO::FETCH_ASSOC); //同上,也可以直接$stmt->setFetchMode(PDO::FETCH_ASSOC);這麼設定

    echo '<pre>';
    print_r($data);
    echo '</pre>';</span>