首頁  >  文章  >  後端開發  >  使用 PHP 和 MySQL

使用 PHP 和 MySQL

巴扎黑
巴扎黑原創
2016-11-10 13:23:481108瀏覽

 PHP 在初期就支援 MySQL了,在它的第2版本就包含了一個API。因為它倆的結合太普遍了,所以該擴展預設就是開啟的。不過 PHP 5 發布了一個更新的 MySQL 擴展,叫做 MySQL Improved,簡稱 mysqli。
    為什麼要出新擴充呢?原因有兩方面。首先MySQL的快速發展,那些依賴舊擴充的使用者沒法利用新特性,如prepared statements、進階連線選項以及安全提升。第二,雖然那個舊擴展當然用起來也不錯,但許多人認為過程化的接口過時了,他們更喜歡面向對象的接口,因為不僅能與其他應用程序更緊密地集成,還能根據需要擴展此接口。為解決這些不足,MySQL開發人員決定是時候改造一下那個擴展,不僅修改了內部行為實現了效能提升,還引入了額外的特性促進了更新版本的MySQL中的可用特性的使用。
    幾個關鍵的改進:
# 物件導向:mysqli擴充被封裝到一系列類別,從而鼓勵使用一種被許多人認為比PHP傳統的流程化方法更方便、更有效率的程式設計範式。但是那些喜歡過程化範式的人也不要擔心,因為它也提供了一個傳統的過程化介面。
# prepared statements:能夠阻止SQL注入攻擊。它消除了那些重複執行的查詢的開銷和不方便。
# 事務支援:儘管PHP最初的MySQL擴充也能支援事務功能,mysqli 擴充提供了這些功能的一個物件導向的介面。
# 增強的偵錯功能:mysqli 擴充聽過了許多方法用於偵錯查詢,更讓開發過程更有效率。
# 內嵌的伺服器支援:MySQL 4.0 release 引進了一個內嵌的MySQL server 函式庫,那些有興趣的使用者就可以在客戶端應用例如桌面程式中執行一個完整的MYSQL伺服器了。 mysqli 擴充功能提供了一些方法用於連接和操作這些內嵌的MySQL伺服器。
# 主/從支援:從 MySQL 3.23.15 開始,MySQL 就提供了複製的支援。使用 mysqli 擴展,你可以保證查詢會被轉到一個複製配置中的主伺服器。
 
    那些對最初的MySQL擴充熟悉的使用者會發現增強的mysqli擴充很眼熟,幾乎是一樣的命名約定。例如,資料庫連線函數叫mysqli_connect而不是mysql_connect。
 
1、安裝的先決條件
    從PHP 5開始,MySQL支援不在於標準PHP分發包捆綁。因此,需要明確配置PHP才能利用此擴充。
    
    1.1、在Linux/UNIX中啟用mysqli擴充
設定PHP的時候使用 --with-mysqli 標識。它應該指向 MySQL 4.1 以及更高版本中的 mysql_config 程式的位置。
    1.2、在Windows上開啟mysqli擴充
需修改php.ini,取消這行前面的註解:extension=php_mysqli.dll,如果沒有的話,加上這一行。當然,在啟用任何擴充功能之前,請確保PHP的 extension_dir指令指向適當的目錄。
    1.3、使用MYSQL本地驅動程式
一直以來,PHP 要求運行PHP程式的那台伺服器上要安裝 MySQL client library,而不論MYSQL伺服器恰好在本地或是在其他位置。 PHP 5.3 除去了這個要求,它引進了一個新的MySQL驅動,叫作MySQL Native Driver,也被叫做mysqlnd,它比剛才說的那個驅動要有很多優點。它不是新的API,而是新的“導管”,現有的API(mysql,mysqli,PDO_MySQL)可以利用這個導管與一個MySQL伺服器通訊。建議用mysqlnd,而不要使用其他驅動程式(除非你有非常充分的理由)。
 
要將 mysqlnd和某個擴充一起使用,你需要重新編譯PHP,例如:--with-mysqli=mysqlnd。也可以多指定幾個,如%>./configure --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd
 
mysqlnd 驅動也有一些限制。目前它不提供壓縮以及SSL支援。
 
    1.4、管理使用者權限
當一個腳本初始化一個到MySQL伺服器的連線時,權限就會被傳遞和檢驗。還有在提交需要權限檢驗的命令時也是一樣。不過,你只需在連接時確認執行用戶;除非後來搞了一個新連接,否則腳本的後續執行都將一直是那個用戶。
 
    1.5、使用範例資料
學新知識時加上一些例子就簡單了。資料庫:corporate;表:products
CREATE TABLE products ( 
   id INT NOT NULL AUTO_INCREMENT, 
   sku VARCHAR(8) NOT NULL, 瑪🠎 N N N75 N N55 N N55 Npat地區」 ) NOT NULL, 
   PRIMARY KEY(id) 
 

========================================== =================================
2、使用mysqli 擴充
2.1、建立與斷開連線
    先要連接到伺服器,然後選擇一個資料庫,之後是關閉連線。物件導向、過程化 這2種風格都是可以的。
    用物件導向介面和MySQL伺服器交互,首先要用mysqli類別的建構器實例化它。
mysqli([string host [, string username [, string pswd 
                   的使用者會發現該建構函數的許多參數和傳統的mysql_connect()函數是一樣的。
$mysqli = new mysqli('localhost', 'catalog_user', 'secret', 'corporate');
    如果某個時刻,你想切換到其他伺服器或選擇另一個資料庫,你可以用connect()和select_db ()方法。 connect()方法的參數和mysqli類別的建構子一樣。
// Instantiate the mysqli class
$mysqli = new mysqli();
// Connect to the database server and select a database
$mysqli->connect('localhost', 'corp', '', 'corpate', '', 'corporate'root) ;
------------------------------------------------ ----------------------------------

// Connect to the database server 
$mysqli = new mysqli ('localhost', 'catalog_user', 'secret');
// Select the database 
$mysqli->select_db('corporate');
    一但腳本完成執行,任何開啟的資料庫連線會自動關閉,資源也會被恢復。然而,也有可能一個頁面在執行的過程中需要用到多個資料庫連接,這些連接都需要正確地被關閉。即使只使用了一個連接,也應該在腳本的最後將其關閉,這是一種很好的實踐方法。 $mysqli->close()。
 
2.2、處理連接錯誤
    應仔細監控連接錯誤,並相應地做出應對措施。 mysqli 擴充功能提供了一些特性,能夠被用來捕捉錯誤訊息,還有一種方法就是利用異常。例如,mysqli_connect_errno() 和 mysqli_connect_error() 就能夠被用來診斷和顯示MySQL連線錯誤訊息。
 
2.3、取得錯誤訊息
    2.3.1、取得錯誤碼
errno() 方法傳回上一次MySQL函數執行過程中產生的錯誤碼。 0表示沒有錯誤。
  $mysqli = new mysqli('localhost', 'catalog_user', 'secret', 'corporate');   printf("Mysqlerror number generated: %d"
  printf("Mysqlerror number generated: %d", $myd", $erro); >
    2.3.2、取得錯誤訊息
error() 方法傳回最近產生的錯誤訊息。沒有錯誤回傳的就是空字串。訊息語言依賴 Mysql 資料庫伺服器。
 
2.4、在一個獨立文件中儲存連接資訊
    在安全程式設計實踐的想法中,定期修改密碼是個不錯的主意。還有就是有很多要存取資料庫的腳本,一個個修改太麻煩了。辦法是存在單獨的一個文件中,必要時將其包含到你目前的文件中。
    例如,可以將mysqli 建構子放在一個頭檔(mysql.connect.php):
    $mysqli = new mysqli('localhost', 'catalog_user', 'secret', 'corporate', ' ?>
然後在其他文件中包含它:
    include 'mysql.connect.php';     // begin database selection== and queries. 
    // begin database selection== and queries. 
    // begin==== ================================================== =================
3、與資料庫互動
3.1、傳送查詢至資料庫
    以query()方法。其形式為mixed query(string query [, int resultmode])。其中可選的 resultmode 參數用於修改該方法的行為,它有2種值:
. MYSQLI_STORE_RESULT:是預設值。將結果集回傳為快取集,代表整個結果集立刻就能準備好要用於導覽了。雖然對記憶體的消耗有些大,但它允許你立刻就能使用整個結果集,所以當你嘗試分析以及管理結果集時很有用。例如,你可能想知道從一個查詢中返回了多少行數據,或者你可能想立即調到結果集中的某一行。
. MYSQLI_USE_RESULT:將結果集傳回為一個 unbuffered set,表示會根據需要從伺服器取得資料。對於大結果集,這提升了效能,但它無法決定傳回了多少行數據,也不能調到某個行。
3.1.1 取得資料
     $mysqli = new mysqli('localhost', 'catalog_user', 'secret', 'corporate'); ku, name, price FROM products ORDER by name'; 

    // Send the query to MySQL 
    $result = $mysqli->query($query, MYSQLI_STORE_RESULT); 
  ,$$ $ Iterate thrname $ result ->fetch_row()) 
        printf("(%s) %s: $%s
", $sku, $name, $price); 
、 
?>
 也是用的query() 方法。
$result = $mysqli->query($query, MYSQLI_STORE_RESULT);
printf("%d rows have been deleted.", $mysqli->affected_rows);
    當然,可以執行您希望執行的任何查詢,包括建立和修改資料庫、資料表和索引,甚至可以完成MySQL管理任務,例如為使用者建立和賦予權限。
 
3.1.3、釋放查詢內存
    有時你獲取到了一個特別大的結果集,那麼就要在完成處理後,很有必要釋放該結果集所請求的內存,用free() 方法就行了,之後該結果集就不能用了。 $result->free();
 
3.2、解析查詢結果
3.2.1、將結果抓取到物件中
while ($row = $result->fetch_object()) 

    $name = $row >name; 
    $sku = $row->sku; 
    $price = $row->price; 
    printf("(%s) %s: %s
", $price, $name, $price);

 
3.2.2、以索引和關聯陣列取得結果
    fetch_array() 是同時都是,fetch_row() 是索引陣列。 ) 

class mysqli_result { 
   mixed fetch_row() 

其中resulttype的值可以是MYSQLI_ASSOC或MYI_NUM或MYI_A_BOSQL。 M:順序由查詢指定的字段名順序決定。
$result = $mysqli->query($query); 
while ($row = $result->fetch_array(MYSQLI_ASSOC)) 
{     $name = $row['name']; 'sku']; 
    echo "Product:  $name ($sku)
"; 
}

while ($row = $result->fetch_arra
   $name = $row[1]; 
   $price = $row[2]; 
   printf("(%s) %s: %d
", $sku, $name, $price);

3.3 決定選擇的行數|受影響的行數

    你希望知道一個SELECT查詢回傳的行數或受到INSERT、UPDATE或DELETE查詢影響的行數。

. num_rows() 方法用於確定從一個SELECT查詢語句傳回了多少行資料。例如:

$query = 'SELECT name FROM products WHERE price > 15.99'; 
$result = $mysqli->query($query);

printf("There are %f product(ab) price 9999. , $result->num_rows);

. affected_rows() 方法用於確定受INSERT、UPDATE以及DELETE查詢影響的行數。

 

3.4、使用 Prepared Statements

    不斷重複執行查詢,每次使用的是不同的參數值是很常見的。然而,使用傳統的query() 方法再加上循環來實現不僅開銷很大(因為需要重複解析幾乎一樣的查詢以檢驗合法性),而且編碼也不方便(因為需要為每次迭代使用新值重新配置查詢),MySQL 4.1 引入了prepared statements,它可以用低得多的開銷和更少的程式碼實現上述任務。

    有2種 prepared statements:

. Bound parameters:它允許你將一個查詢放到 MySQL 伺服器上,只需將變更的資料重複地傳送到伺服器上,再整合到查詢中執行。例如,假設你建立了一個 web 程序,允許使用者管理商店商品,為快速啟動初始化過程,可以建立一個表單,最多接受 20 個產品的名稱、ID、價格和描述,就適用於此情況。

. Bound results:它允許你將 PHP 變數綁定到所獲取的相應字段,從而使用索引數組或關聯數組從結果集中提取數據,然後在必要時使用這些變數。

 


3.4.1、準備用於執行的Statement

    不管你是用 bound-parameter 或 bound-result prepared statement,你需要先準備好用於執行的statement,就是用 prepare() 方法。

    // Create a new server connection 
    $mysqli = new mysqli('localhost', 'catalog_user', 'secret', 'corp $query = "SELECT sku , name, price, description 
              FROM products ORDER BY sku"; 
   
    // Prepare the statement for execution 
    $stmt->prepare($ query); 
    .. Do something with the prepared statement 
 
    // Recuperate the statement resources 
   >close(); 
 
?>

 

3.4.2、執行Prepared Statement

    一旦statement 準備好後,就需要執行它了。何時執行取決於你希望用綁定參數還是綁定結果。如果是前者,將在綁定參數之後執行語句。如果是後者,則會在綁定結果之前執行此方法。 2種方式中語句的執行都是透過 execute() 方法完成的。

 

3.4.3、 回收Prepared Statement 資源【用close() 方法】

 

3.4.4、綁定參數

 

3.4.4、綁定參數

 state.變數名綁定到對應的欄位。原型如下:

class stmt { 

    boolean bind_param(string types, mixed &var1 [, mixed &varN]) 

}

¢ ,此參數是必需的,以確保向伺服器發送時能最有效地實現資料編碼。目前支援4種類型碼。


. i :所有INTEGER 類型

.d :DOUBLE 與FLOAT 類型

.b : BLOB 類型

.s 字串: Create a new server connection 

    $mysqli = new mysqli('localhost', 'catalog_user', 'secret', 'corporate'); 

 

 id= NULL, sku=?, 

              name=?, price=?"; 

 

    // 迷    // Prepare the statement for execution 

    $stmt-> prepare($query); 

 

    // Bind the parameters 

    $stmt->bind_param('ssd', $sku, $name, $price $_POST[ 'sku']; 

     // Assign the posted name array 
    $namearray = $_POST['name']; 
  
 
    / / Initialize the counter 
    $x = 0; 
 
    // Cycle through the array, and iteratively execute the query   ($ ile ($ ) ($ ) = $skuarray[$x]; 
        $ name = $namearray[$x]; 
        $price = $pricearray[$x]; 
        $  resources 
    $stmt->close(); 

    // Close the connection 
    $mysqli->close(); 
 
?>

 

3.4.5、綁定變數

 
 取回的字段中。用的是 bind_result() 方法。原型如下:

class mysqli_stmt { 
    boolean bind_result(mixed &var1 [, mixed &varN]) 
}

  下面的程式碼就是將變數 $sku、$name 和 $price綁定到取回的欄位上。

 
    // 建立一個新的伺服器連線 
    $mysqli = new mysqli('localhost', 'catalog_user', 'secret', 'corporate'); 🠎🠎🠎 ku, name , Price FROM products ORDER BY sku'; 
 
    // 建立語句物件 
    $stmt = $mysqli->stmt_init();  
 
    //執行語句 
    $stmt->execute(); 
 
    // 綁定結果參數 
    $stmt->bind_result );    while($ stmt->fetch()) 
printf("%s, %s, %s
", $sku, $name, $price); 
 
    // 恢復語句資源 
  
    // // 關閉連線 

    $mysqli->close(); 

 
?>

 

3.4.6、從準備好的語句取得資料行
語句獲取查看字段屬性到綁定結果中。其原型如下:

class mysqli { 
    boolean fetch() 
}

================================ ========= =======================================

4、執行資料庫事務

4.1、 class mysqli {

boolean autocommit(boolean mode)

}

}

} true true就就,false就就是4.2。

4.2、4.2 、4.2,,,,,,,,,提交提交提交一一一個

 

4.3、回滾一個事務

class mysqli { 
.

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn