SQL SELECT命令用於從MySQL數據庫獲取數據。可以在MySQL>提示符使用這個命令,以及任何像PHP的腳本和語言等。
下面是通用的SQL的SELECT命令語法,從MySQL表獲取數據:
SELECT field1, field2,...fieldN table_name1, table_name2... [WHERE Clause] [OFFSET M ][LIMIT N]
可以使用分隔的一個或多個逗號從多個表,以及使用WHERE子句包括各種條件,但WHERE子句是SELECT命令的可選部分
可以在一個SELECT命令指定讀取一個或多個字段
可以指定星號(*)代替選擇的字段。在這種情況下,將返回所有字段
可以指定任意的條件在 WHERE 子句後面
可以使用OFFSET指定一個偏移量,SELECT從那裡開始返回記錄。默認情況下 offset 的值是 0
可以使用LIMIT屬性限制返回的數量
這將使用SQL SELECT命令從MySQL 表 tutorials_tbl 讀取數據
下面的例子將從 tutorials_tbl 表返回所有記錄:
root@host# mysql -u root -p password; Enter password: mysql> use test; Database changed mysql> SELECT * from tutorials_tbl +-------------+----------------+-----------------+-----------------+ | tutorial_id | tutorial_title | tutorial_author | submission_date | +-------------+----------------+-----------------+-----------------+ | 1 | Learn PHP | John Poul | 2007-05-21 | | 2 | Learn MySQL | Abdul S | 2007-05-21 | | 3 | JAVA Tutorial | Sanjay | 2007-05-21 | +-------------+----------------+-----------------+-----------------+ 3 rows in set (0.01 sec) mysql>
可以使用相同的SQL SELECT命令,在PHP中的mysql_query()函數.此函數用於執行SQL命令,另一個更高版本PHP mysql_fetch_array()函數可用於獲取所有選定的數據. 這個函數返回一行作為關聯數組,數字數組,或兩者兼而有。如果沒有更多的行這個函數返回 FALSE。
下面是一個簡單的例子來從tutorials_tbl表中提取記錄。
試試下面的例子來顯示tutorials_tbl表中的所有記錄。
<?php $dbhost = 'localhost'; $dbuser = 'root'; $dbpass = ''; $conn = mysql_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('Could not connect: ' . mysql_error()); } $sql = 'SELECT tutorial_id, tutorial_title, tutorial_author, submission_date FROM tutorials_tbl'; mysql_select_db('test'); $retval = mysql_query( $sql, $conn ); if(! $retval ) { die('Could not get data: ' . mysql_error()); } while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) { echo "Tutorial ID :{$row['tutorial_id']} <br> ". "Title: {$row['tutorial_title']} <br> ". "Author: {$row['tutorial_author']} <br> ". "Submission Date : {$row['submission_date']} <br> ". "--------------------------------<br>"; } echo "Fetched data successfully\n"; mysql_close($conn); ?>
數據庫的行內容被分配到變量$row,並且行中的值將被打印出來。
注意: 當想直接插入數組值轉換成字符串,一定記得使用花括號。
在上面的例子中,常量 MYSQL_ASSOC作為PHP函數 mysql_fetch_array() 的第二個參數, 因此,它返回該行作為關聯數組。關聯數組我們可以使用它的名稱,而不是使用索引來訪問該字段。
PHP提供了另一個函數 mysql_fetch_assoc(),也返回該行作為關聯數組。
試試下面的例子用來顯示 tutorial_tbl 表所有的記錄,使用 mysql_fetch_assoc() 函數例子如下:
<?php $dbhost = 'localhost'; $dbuser = 'root'; $dbpass = ''; $conn = mysql_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('Could not connect: ' . mysql_error()); } $sql = 'SELECT tutorial_id, tutorial_title, tutorial_author, submission_date FROM tutorials_tbl'; mysql_select_db('test'); $retval = mysql_query( $sql, $conn ); if(! $retval ) { die('Could not get data: ' . mysql_error()); } while($row = mysql_fetch_assoc($retval)) { echo "Tutorial ID :{$row['tutorial_id']} <br> ". "Title: {$row['tutorial_title']} <br> ". "Author: {$row['tutorial_author']} <br> ". "Submission Date : {$row['submission_date']} <br> ". "--------------------------------<br>"; } echo "Fetched data successfully\n"; mysql_close($conn); ?>
也可以使用常量MYSQL_NUM作為PHP mysql_fetch_array()函數的第二個參數。這會使該函數返回數字索引的數組。
試試下面的例子來使用MYSQL_NUM 參數顯示 tutorials_tbl 表的所有記錄。
<?php $dbhost = 'localhost'; $dbuser = 'root'; $dbpass = ''; $conn = mysql_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('Could not connect: ' . mysql_error()); } $sql = 'SELECT tutorial_id, tutorial_title, tutorial_author, submission_date FROM tutorials_tbl'; mysql_select_db('test'); $retval = mysql_query( $sql, $conn ); if(! $retval ) { die('Could not get data: ' . mysql_error()); } while($row = mysql_fetch_array($retval, MYSQL_NUM)) { echo "Tutorial ID :{$row[0]} <br> ". "Title: {$row[1]} <br> ". "Author: {$row[2]} <br> ". "Submission Date : {$row[3]} <br> ". "--------------------------------<br>"; } echo "Fetched data successfully\n"; mysql_close($conn); ?>
所有上述三個例子將產生相同的結果。
這是一個很好的做法,以釋放內存光標在每個SELECT語句的結束。這可以通過使用PHP函數了mysql_free_result()來完成。下面是該例子,以顯示它如何被使用。
試試下面的例子
<?php $dbhost = 'localhost'; $dbuser = 'root'; $dbpass = ''; $conn = mysql_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('Could not connect: ' . mysql_error()); } $sql = 'SELECT tutorial_id, tutorial_title, tutorial_author, submission_date FROM tutorials_tbl'; mysql_select_db('test'); $retval = mysql_query( $sql, $conn ); if(! $retval ) { die('Could not get data: ' . mysql_error()); } while($row = mysql_fetch_array($retval, MYSQL_NUM)) { echo "Tutorial ID :{$row[0]} <br> ". "Title: {$row[1]} <br> ". "Author: {$row[2]} <br> ". "Submission Date : {$row[3]} <br> ". "--------------------------------<br>"; } mysql_free_result($retval); echo "Fetched data successfully\n"; mysql_close($conn); ?>
在讀取數據時,可以根據需要編寫復雜的SQL。如上所述過程將保持不變。