站長資訊網
        最全最豐富的資訊網站

        PHP中mysqli的基本操作有哪些

        MySQLi的擴展相對于PDO來說功能更加的豐富,所以我們依然還會在學習過程中穿插各種MySQLi中好玩的方法函數。不過,今天的主角是MySQLi中如何執行SQL語句以及多條SQL語句的執行。

        PHP中mysqli的基本操作有哪些

        連接與選擇數據庫

        首先是一個小內容的學習分享,依然還是連接數據庫,不過這次我們用另外一種方式來進行連接。

        $mysqli = new mysqli(); $mysqli->real_connect("localhost", "root", "", "blog_test");  var_dump($mysqli);  // ["thread_id"]=> // int(163)  $mysqli->real_connect("localhost", "root2", "123", "blog_test"); var_dump($mysqli); // ["thread_id"]=> // int(164)

        首先,我們實例化了一個 mysqli 對象。在實例化過程中,我們并沒有給 mysqli 的構造函數傳遞任何的參數,而是使用 real_connect() 方法來傳遞數據庫服務器信息并建立連接。

        相信不少朋友從代碼中就可以看出,我們使用 real_connect() 可以在一個 mysqli 實例下來切換不同的數據庫連接。通過打印 mysqli 對象的內容就可以看出,兩個連接的線程ID不同,也就是說,它們是不同的兩個連接,但是使用的都是最上面所初始化的那個 mysqli 對象。

        連接可以切換了,那么我們要連接的數據庫呢?當然也可以方便地切換。

        $mysqli->select_db('mysql');

        就是這樣一個簡單的 select_db() 方法,就可以幫助我們在代碼執行過程中動態地修改所連接的數據庫。

        執行 SQL 語句

        對于 PDO 來說,如果是查詢語句,我們需要使用 query() 方法,如果是增、刪、改之類的其它語句,我們要使用 exec() ,通過這兩個方法分別執行不同的 SQL 語句。但是在 MySQLi 中,我們統一只使用 query() 方法就可以了。

        $mysqli->query("insert into zyblog_test_user(username, password, salt) values('3a', '3a', '3a')"); var_dump($mysqli->affected_rows); var_dump($mysqli->insert_id);  $mysqli->query("update zyblog_test_user set password='3aa' where username='3a'"); var_dump($mysqli->affected_rows);  $mysqli->query("delete from zyblog_test_user where id = 60"); var_dump($mysqli->affected_rows);  $res = $mysqli->query("select * from zyblog_test_user where username='3a'"); print_r($res); // mysqli_result Object // ( //     [current_field] => 0 //     [field_count] => 4 //     [lengths] => //     [num_rows] => 3 //     [type] => 0 // )  print_r($res->fetch_assoc()); // Array // ( //     [id] => 61 //     [username] => 3a //     [password] => 3aa //     [salt] => 3a // )  while ($row = $res->fetch_assoc()) {     print_r($row); } // Array // ( //     [id] => 62 //     [username] => 3a //     [password] => 3aa //     [salt] => 3a // ) // Array // ( //     [id] => 63 //     [username] => 3a //     [password] => 3aa //     [salt] => 3a // ) // ……

        對于增、刪、改之類的語句,query() 方法只會返回一個布爾值,也就是語句是否執行成功。記住,它返回的不是受影響的行數,這一點是需要注意的。我們如果需要獲取受影響的行數需要使用 MySQLi 的屬性 affected_rows 。對于插入語句來說,獲取最新插入的數據ID使用的是 insert_id 屬性。

        如果執行的是 SELECT 語句,那么 query() 返回的就是一個 mysqli_result 對象,它代表從一個數據庫查詢中獲取的結果集。關于這個對象的內容我們將在后面的文章中進行詳細的說明。

        執行多條 SQL 語句

        執行多條 SQL 語句的能力對于 PDO 來說是無法實現的,不過據說 PDO 是支持的,語句是可以正常執行的,但是我們拿不到完整的返回結果。

        $sql = "insert into zyblog_test_user(username, password, salt) values('3bb', '3bb', '3bb');"         . "update zyblog_test_user set password='3aa' where username='3a';"         . "select * from zyblog_test_user where username='3b';"         . "select now()";  $pdo = new PDO("mysql:dns=locahost;dbname=blog_test", 'root', '', [PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION]); $res = $pdo->exec($sql); var_dump($res); // int(1) $stmt = $pdo->query($sql); foreach ($stmt as $row) { //PHP Fatal error:  Uncaught PDOException: SQLSTATE[HY000]: General error in     var_dump($row); }

        從代碼中可以看出,如果使用的是 exec() 方法,那么返回的就是 INSERT 語句的結果。如果使用 query() 方法,返回的雖然是 PDOStatement 對象,但是它是無法遍歷的。

        接下來我們就看看 MySQLi 是如何來執行這個多條語句拼接在一起的 SQL 語句的。

        $mysqli->multi_query($sql); $i = 1; do{     echo '第' . $i . '條:', PHP_EOL;     $i++;     $result = $mysqli->use_result();     var_dump($result);     var_dump($mysqli->affected_rows);     if(is_object($result)){         var_dump($result->fetch_assoc());     }     var_dump($mysqli->next_result());     echo '========', PHP_EOL; } while($mysqli->more_results() ); // 第1條: // bool(false) // int(1) // ======== // 第2條: // bool(false) // int(0) // ======== // 第3條: // object(mysqli_result)#2 (5) { //   ["current_field"]=> //   int(0) //   ["field_count"]=> //   int(4) //   ["lengths"]=> //   NULL //   ["num_rows"]=> //   int(0) //   ["type"]=> //   int(1) // } // int(-1) // array(4) { //   ["id"]=> //   string(2) "67" //   ["username"]=> //   string(2) "3b" //   ["password"]=> //   string(2) "3b" //   ["salt"]=> //   string(2) "3b" // } // ======== // 第4條: // bool(false) // int(0) // ========

        multi_query() 就是 MySQLi 提供的執行多條 SQL 語句的方法。通過它執行之后,返回的結果是一個布爾值,如果第一條語句就有問題的話,那么它返回的就是 FALSE 。如果是后面的語句錯誤了,我們需要調用 next_result() 才能獲取后面語句的錯誤信息。

        其實這也引出了我們 next_result() 這個方法的作用。它就相當于是為執行獲取下一個結果的操作做準備,也可以看作是將游標移動到了下一條 SQL 語句上。而 more_results() 方法就是判斷是否還有

        贊(1)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 午夜精品一区二区三区在线观看| 三上悠亚久久精品| 婷婷精品国产亚洲AV麻豆不片| 久久精品国产精品国产精品污| 亚洲AV永久无码精品水牛影视| 精品国产一区二区三区久久蜜臀| 99精品在线观看| 久久er99热精品一区二区| 香蕉依依精品视频在线播放| 国产精品热久久无码av| 国产精品久久影院| 国内精品久久久久影院优 | 人妻少妇精品无码专区动漫| 亚洲精品成人av在线| 91久久婷婷国产综合精品青草| 亚洲精品无码乱码成人| 免费国产在线精品一区| 国产精品国产三级在线专区| 女人香蕉久久**毛片精品| 国产成人精品日本亚洲18图| 国内精品九九久久久精品| 久久精品国产亚洲av影院| 无码国产乱人伦偷精品视频| 亚洲国产一成人久久精品| 亚洲人成精品久久久久| 亚洲精品乱码久久久久久自慰| 亚洲精品国产综合久久一线| 欧美精品黑人粗大视频| 免费精品精品国产欧美在线欧美高清免费一级在线 | 国产精品v欧美精品v日韩| 99精品国产成人一区二区| 91精品国产91热久久久久福利| 亚洲国产精品久久久久久| 99久久精品国产一区二区| 91无码人妻精品一区二区三区L| 亚洲国产精品一区二区久久| 国产999精品久久久久久| 欧美日韩精品一区二区| 国产精品成人啪精品视频免费| 国产精品内射婷婷一级二| 国产欧美在线观看精品一区二区 |