本期要點(diǎn):
mysqli_result 類 我們接著《MySQL丨通過 PHP 執(zhí)行 SQL 語句》中的內(nèi)容,把之前的 SQL 語句更換成:ELECT * FROM msg ORDER BY id DESC(也就是按 id 進(jìn)行倒序排列) <?php header("Content-type: text/html; charset=utf-8"); //如果瀏覽器輸出亂碼就加上這一句 //預(yù)先定義數(shù)據(jù)庫連接參數(shù) $host = '127.0.0.1'; $user = 'root'; $pwd = 'root'; $dbname = 'php'; //連接到數(shù)據(jù)庫 $db = new mysqli($host, $user, $pwd, $dbname); //檢查連接是否成功 if ( $db->connect_errno <> 0 ) { echo "鏈接失敗"; echo $db->connect_error; } //編寫SQL //$sql = "INSERT INTO msg (content,user,intime) VALUES ('aaa','bbb',123456)"; 注釋掉原來的語句 $sql = "SELECT * FROM msg ORDER BY id DESC"; //執(zhí)行SQL $is = $db->query( $sql ); //獲取返回值 var_dump( $is ); //判斷執(zhí)行是否成功 if ( $is == true) { echo "插入成功"; }else { echo "插入失敗"; } 然后在瀏覽器輸出,看到返回值不是布爾值,而變成了一個(gè)對象: 我們可以看到對象來自 mysqli_result 個(gè)類(類的實(shí)例化就是對象)。
mysqli::query 的返回值 從上面的內(nèi)容我們可以看到 SQL 的執(zhí)行語句($is = $db->query( $sql );)在更改之前跟更改之后所得到的結(jié)果是不一樣的(一個(gè)是布爾值,,一個(gè)是對象)。 這就源于 mysqli::query 的返回值,。 mysqli::query 的返回值語法:
PS:因?yàn)槲覀兩厦娴膬?nèi)容所執(zhí)行的是一個(gè) SELECT 語句,,所以輸出的是對象,。 語法參考:【PHP 手冊】-【函數(shù)參考】-【數(shù)據(jù)庫擴(kuò)展】-【針對各數(shù)據(jù)庫系統(tǒng)對應(yīng)的擴(kuò)展】-【MySQL】-【Mysqli】-【Mysqli】-【mysqli::query】 mysql_fetch_array() 函數(shù) mysql_fetch_array() 函數(shù)(方法)的作用是從結(jié)果集中取得一行作為關(guān)聯(lián)數(shù)組,或數(shù)字?jǐn)?shù)組,,或二者兼有,; 返回根據(jù)從結(jié)果集取得的行生成的數(shù)組,如果沒有更多行則返回 false,。 語法參考:【PHP 手冊】-【函數(shù)參考】-【數(shù)據(jù)庫擴(kuò)展】-【針對各數(shù)據(jù)庫系統(tǒng)對應(yīng)的擴(kuò)展】-【MySQL】-【Mysqli】-【Mysqli_result】 針對 mysqli::query 的返回值可能會出現(xiàn)兩種數(shù)據(jù)的可能性,,我們需要對它的返回值進(jìn)行一個(gè)判斷:
<?php header("Content-type: text/html; charset=utf-8"); //如果瀏覽器輸出亂碼就加上這一句 //預(yù)先定義數(shù)據(jù)庫連接參數(shù) $host = '127.0.0.1'; $user = 'root'; $pwd = 'root'; $dbname = 'php'; //連接到數(shù)據(jù)庫 $db = new mysqli($host, $user, $pwd, $dbname); //檢查連接是否成功 if ( $db->connect_errno <> 0 ) { echo "鏈接失敗"; echo $db->connect_error; } //編寫SQL //$sql = "INSERT INTO msg (content,user,intime) VALUES ('aaa','bbb',123456)"; 注釋掉原來的語句 $sql = "SELECT * FROM msg ORDER BY id DESC"; //執(zhí)行SQL $is = $db->query( $sql ); //獲取返回值 //對返回值進(jìn)行判斷 if ( $is === false) { echo "SQL錯(cuò)誤"; exit; } //得到mysqli_result對象后調(diào)用fetch_array()方法 var_dump( $is->fetch_array() ); 瀏覽器輸出與數(shù)據(jù)庫對比: 我們可以看到瀏覽器輸出的是一個(gè)數(shù)組,其中的鍵值對都可以跟數(shù)據(jù)庫中的內(nèi)容一一對應(yīng)上,。 但好像重復(fù)了一次:其中一組是關(guān)聯(lián)數(shù)組,,一組是索引數(shù)組。 這里我們可以用一個(gè)常量 MYSQLI_ASSOC 把索引數(shù)組去掉,。 我們把上面fetch_array()方法加一個(gè)參數(shù): //得到mysqli_result對象后調(diào)用fetch_array()方法 var_dump( $is->fetch_array( MYSQLI_ASSOC ) ); 然后在瀏覽器再次輸出: 獲取多條數(shù)據(jù) 如果我們需要輸出多條數(shù)據(jù): <?php header("Content-type: text/html; charset=utf-8"); //如果瀏覽器輸出亂碼就加上這一句 //預(yù)先定義數(shù)據(jù)庫連接參數(shù) $host = '127.0.0.1'; $user = 'root'; $pwd = 'root'; $dbname = 'php'; //連接到數(shù)據(jù)庫 $db = new mysqli($host, $user, $pwd, $dbname); //檢查連接是否成功 if ( $db->connect_errno <> 0 ) { echo "鏈接失敗"; echo $db->connect_error; } //編寫SQL //$sql = "INSERT INTO msg (content,user,intime) VALUES ('aaa','bbb',123456)"; 注釋掉原來的語句 $sql = "SELECT * FROM msg ORDER BY id DESC"; //執(zhí)行SQL $is = $db->query( $sql ); //獲取返回值 //對返回值進(jìn)行判斷 if ( $is === false) { echo "SQL錯(cuò)誤"; exit; } //得到mysqli_result對象后調(diào)用fetch_array()方法 var_dump( $row = $is->fetch_array( MYSQLI_ASSOC ) ) ; var_dump( $row = $is->fetch_array( MYSQLI_ASSOC ) ) ; var_dump( $row = $is->fetch_array( MYSQLI_ASSOC ) ) ; var_dump( $row = $is->fetch_array( MYSQLI_ASSOC ) ) ; ... 只要我們連續(xù)調(diào)用,,瀏覽器就會依次輸出:
瀏覽器輸出: while 循環(huán) 這個(gè)應(yīng)該是屬于《PHP丨流程控制》中的內(nèi)容,,因?yàn)橹皼]講就插播一下,。 while 循環(huán)是 PHP 中最簡單的循環(huán)類型:
所以,根據(jù) while 循環(huán)的原理我們上面的代碼也可以這樣寫: <?php header("Content-type: text/html; charset=utf-8"); //如果瀏覽器輸出亂碼就加上這一句 //預(yù)先定義數(shù)據(jù)庫連接參數(shù) $host = '127.0.0.1'; $user = 'root'; $pwd = 'root'; $dbname = 'php'; //連接到數(shù)據(jù)庫 $db = new mysqli($host, $user, $pwd, $dbname); //檢查連接是否成功 if ( $db->connect_errno <> 0 ) { echo "鏈接失敗"; echo $db->connect_error; } //編寫SQL //$sql = "INSERT INTO msg (content,user,intime) VALUES ('aaa','bbb',123456)"; 注釋掉原來的語句 $sql = "SELECT * FROM msg ORDER BY id DESC"; //執(zhí)行SQL $is = $db->query( $sql ); //獲取返回值 //對返回值進(jìn)行判斷 if ( $is === false) { echo "SQL錯(cuò)誤"; exit; } //得到mysqli_result對象后調(diào)用fetch_array()方法 while ( $row = $is->fetch_array( MYSQLI_ASSOC )) { var_dump( $row ); } 瀏覽器輸出: 可以看到那些 NULL 也都沒了,,因?yàn)楫?dāng) while 的值為 false 時(shí)它就停止循環(huán)了,。 將查詢結(jié)果保存到數(shù)組 <?php //預(yù)先定義數(shù)據(jù)庫連接參數(shù) $host = '127.0.0.1'; $user = 'root'; $pwd = 'root'; $dbname = 'php'; //連接到數(shù)據(jù)庫 $db = new mysqli($host, $user, $pwd, $dbname); //檢查連接是否成功 if ( $db->connect_errno <> 0 ) { echo "鏈接失敗"; echo $db->connect_error; } //編寫SQL //$sql = "INSERT INTO msg (content,user,intime) VALUES ('aaa','bbb',123456)"; 注釋掉原來的語句 $sql = "SELECT * FROM msg ORDER BY id DESC"; //執(zhí)行SQL $is = $db->query( $sql ); //獲取返回值 //對返回值進(jìn)行判斷 if ( $is === false) { echo "SQL錯(cuò)誤"; exit; } //得到mysqli_result對象后調(diào)用fetch_array()方法 $rows = []; while ( $row = $is->fetch_array( MYSQLI_ASSOC )) { $rows[] = $row; } var_dump( $rows ); 瀏覽器輸出: 可以看到上面已經(jīng)成為了一個(gè)二維數(shù)組。 因?yàn)?span style="color: rgb(51, 51, 51);background-color: rgb(255, 255, 255);"> fetch_array() 只能調(diào)用一次數(shù)據(jù)庫中的數(shù)據(jù)(如果進(jìn)行第二次調(diào)用同一條數(shù)據(jù)就會顯示 NULL),,而如果我們需要在網(wǎng)頁中重復(fù)顯示數(shù)據(jù)就需要把所調(diào)出的數(shù)據(jù)保存在一個(gè)二維數(shù)組中,,以供重復(fù)調(diào)用。 如果我們需要把數(shù)組的鍵名改為它們的 id 的話,,只需要在 $rows[] =$row; 中加上 $rows[ $row['id'] 即是:$rows[ $rows[ $row['id'] ] = $row; 然后再次在瀏覽器輸出: |
|