首先先吐槽下mysqli與mysql,前者是后者的改進版,我的ps不支持mysql相關函數,而且我看的是w3school上的教程,呵呵,w3school上的代碼用的是舊版本的mysql函數,我去,讓我一個個百mysqli系列函數的用法。。。
php5以上的版本,建議使用mysqli和PDO。有個網站,我剛發現的:http://www.runoob.com
mysqli和PDO各有各的優勢。PDO應用於12中數據庫,是一種通用的寫法;而mysqli是專門針對mysql的。兩者都是面向對象,而mysqli還提高了API接口。兩者都支持預處理語句,預處理語句可以防止SQL注入,對於web項目的安全性是非常重要的。因為我現在專門開發mysql項目,故而就使用mysqli吧,PDO只了解即可。PDO的學習可以參考上面那個網址。
下面說mysqli操作數據庫。
做個小目錄:
1.連接數據庫
2.關閉連接
3.創建數據庫
4.創建表
5.插入數據
6.插入多條數據
7.預處理語句
8.讀取數據
9.where
10.order by
11.update
12.delete
13.ODBC
連接數據庫:
mysqli(面向對象)
<?php $servername = "127.0.0.1"; $username = "root"; $password = ""; // 創建連接 $conn = new mysqli($servername, $username, $password); // 檢測連接 if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } echo "Connected successfully"; ?>
注意在以上面向對象的實例中 $connect_error 是在 PHP 5.2.9 和 5.3.0 中添加的。如果你需要兼容更早版本 請使用以下代碼替換: // 檢測連接 if (mysqli_connect_error()) { die("Database connection failed: " . mysqli_connect_error()); }
mysqli(面向過程)
<?php $servername = "127.0.0.1"; $username = "root"; $password = ""; // 創建連接 $conn = mysqli_connect($servername, $username, $password); // 檢測連接 if (!$conn) { die("Connection failed: " . mysqli_connect_error()); } echo "Connected successfully"; ?>
關閉連接:
mysqli(面向對象)
$conn->close();
mysqli(面向過程)
mysqli_close($conn);
創建數據庫:
CREATE DATABASE語句用於創建數據庫:
mysqli面向對象:這里創建了tdb0.
<?php $servername = "127.0.0.1"; $username = "root"; $password = ""; // 創建連接 $conn = mysqli_connect($servername, $username, $password); // 檢測連接 if (!$conn) { die("Connection failed: " . mysqli_connect_error()); } echo "Connected successfully<br>"; // Create database $sql = "CREATE DATABASE tdb0"; if ($conn->query($sql) === TRUE) { echo "Database created successfully"; } else { echo "Error creating database: " . $conn->error; } $conn->close(); ?>
注意: 當你創建一個新的數據庫時,你必須為 mysqli 對象指定三個參數 (servername, username 和 password)。 Tip: 如果你使用其他端口(默認為3306),為數據庫參數添加空字符串,如: new mysqli("localhost", "username", "password", "", port)
mysqli面向過程:
<?php $servername = "127.0.0.1"; $username = "root"; $password = ""; // 創建連接 $conn = mysqli_connect($servername, $username, $password); // 檢測連接 if (!$conn) { die("Connection failed: " . mysqli_connect_error()); } // Create database $sql = "CREATE DATABASE tdb1"; if (mysqli_query($conn, $sql)) { echo "Database created successfully"; } else { echo "Error creating database: " . mysqli_error($conn); } mysqli_close($conn); ?>
創建表:
CREATE TABLE 語句用於創建 MySQL 表。
mysqli面向對象:
<?php $servername = "127.0.0.1"; $username = "root"; $password = ""; $dbname="jiu151231"; // 創建連接 $conn = new mysqli($servername, $username, $password, $dbname); // 檢測連接 if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } // sql to create table $sql = "CREATE TABLE MyGuests ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, firstname VARCHAR(30) NOT NULL, lastname VARCHAR(30) NOT NULL, email VARCHAR(50), reg_date TIMESTAMP )"; if ($conn->query($sql) === TRUE) { echo "Table MyGuests created successfully"; } else { echo "Error creating table: " . $conn->error; } $conn->close(); ?>
mysqli面向過程:
<?php $servername = "127.0.0.1"; $username = "root"; $password = ""; $dbname="jiu151231"; // 創建連接 $conn = mysqli_connect($servername, $username, $password, $dbname); // 檢測連接 if (!$conn) { die("Connection failed: " . mysqli_connect_error()); } // sql to create table $sql = "CREATE TABLE MyGuests ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, firstname VARCHAR(30) NOT NULL, lastname VARCHAR(30) NOT NULL, email VARCHAR(50), reg_date TIMESTAMP )"; if (mysqli_query($conn, $sql)) { echo "Table MyGuests created successfully"; } else { echo "Error creating table: " . mysqli_error($conn); } mysqli_close($conn); ?>
上表中的注意事項:
數據類型指定列可以存儲什么類型的數據。完整的數據類型請參考我們的 數據類型參考手冊。
在設置了數據類型后,你可以為每個列指定其他選項的屬性:
- NOT NULL - 沒一行都必須含有值(不能為空),null 值是不允許的。
- DEFAULT value - 設置默認值
- UNSIGNED - 使用無符號數值類型,0 及正數
- AUTO INCREMENT - 設置 MySQL 字段的值在新增記錄時每次自動增長 1
- PRIMARY KEY - 設置數據表中每條記錄的唯一標識。 通常列的 PRIMARY KEY 設置為 ID 數值,與 AUTO_INCREMENT 一起使用。
每個表都應該有一個主鍵(本列為 "id" 列),主鍵必須包含唯一的值。
插入數據:
以下為一些語法規則:
- PHP 中 SQL 查詢語句必須使用引號
- 在 SQL 查詢語句中的字符串值必須加引號
- 數值的值不需要引號
- NULL 值不需要引號
INSERT INTO 語句通常用於向 MySQL 表添加新的記錄:
INSERT INTO table_name (column1, column2, column3,...)
VALUES (value1, value2, value3,...)
注意: 如果列設置 AUTO_INCREMENT (如 "id" 列) 或 TIMESTAMP (如 "reg_date" 列),,我們就不需要在 SQL 查詢語句中指定值; MySQL 會自動為該列添加值。
mysqli面向對象:
<?php $servername = "127.0.0.1"; $username = "root"; $password = ""; $dbname="jiu151231"; // 創建連接 $conn = new mysqli($servername, $username, $password, $dbname); // 檢測連接 if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $sql = "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('John', 'Doe', 'john@example.com')"; if ($conn->query($sql) === TRUE) { echo "New record created successfully"; } else { echo "Error: " . $sql . "<br>" . $conn->error; } $conn->close(); ?>
mysqli面向過程:
<?php $servername = "127.0.0.1"; $username = "root"; $password = ""; $dbname="jiu151231"; // 創建連接 $conn = mysqli_connect($servername, $username, $password, $dbname); // 檢測連接 if (!$conn) { die("Connection failed: " . mysqli_connect_error()); } $sql = "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('John', 'Doe', 'john@example.com')"; if (mysqli_query($conn, $sql)) { echo "New record created successfully"; } else { echo "Error: " . $sql . "<br>" . mysqli_error($conn); } mysqli_close($conn); ?>
插入多條語句:
mysqli_multi_query() 函數可用來執行多條SQL語句。
mysqli面向對象:
<?php $servername = "127.0.0.1"; $username = "root"; $password = ""; $dbname="jiu151231"; // 創建鏈接 $conn = new mysqli($servername, $username, $password, $dbname); // 檢查鏈接 if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $sql = "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('John', 'Doe', 'john@example.com');"; $sql .= "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('Mary', 'Moe', 'mary@example.com');"; $sql .= "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('Julie', 'Dooley', 'julie@example.com')"; if ($conn->multi_query($sql) === TRUE) { echo "New records created successfully"; } else { echo "Error: " . $sql . "<br>" . $conn->error; } $conn->close(); ?>
mysqli面向過程:
<?php $servername = "127.0.0.1"; $username = "root"; $password = ""; $dbname="jiu151231"; // 創建鏈接 $conn = mysqli_connect($servername, $username, $password, $dbname); // 檢查鏈接 if (!$conn) { die("Connection failed: " . mysqli_connect_error()); } $sql = "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('John', 'Doe', 'john@example.com');"; $sql .= "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('Mary', 'Moe', 'mary@example.com');"; $sql .= "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('Julie', 'Dooley', 'julie@example.com')"; if (mysqli_multi_query($conn, $sql)) { echo "New records created successfully"; } else { echo "Error: " . $sql . "<br>" . mysqli_error($conn); } mysqli_close($conn); ?>
預處理語句及綁定參數
預處理語句用於執行多個相同的 SQL 語句,並且執行效率更高。
預處理語句的工作原理如下:
- 預處理:創建 SQL 語句模板並發送到數據庫。預留的值使用參數 "?" 標記 。例如:INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)
- 數據庫解析,編譯,對SQL語句模板執行查詢優化,並存儲結果不輸出
- 執行:最后,將應用綁定的值傳遞給參數("?" 標記),數據庫執行語句。應用可以多次執行語句,如果參數的值不一樣。
相比於直接執行SQL語句,預處理語句有兩個主要優點:
- 預處理語句大大減少了分析時間,只做了一次查詢(雖然語句多次執行)
- 綁定參數減少了服務器帶寬,你只需要發送查詢的參數,而不是整個語句
- 預處理語句針對SQL注入是非常有用的,因為 參數值發送后使用不同的協議,保證了數據的合法性。
<?php $servername = "127.0.0.1"; $username = "root"; $password = ""; $dbname="jiu151231"; // Create connection $conn = new mysqli($servername, $username, $password, $dbname); // Check connection if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } else { $sql = "INSERT INTO MyGuests VALUES(?, ?, ?)"; // 為 mysqli_stmt_prepare() 初始化 statement 對象 $stmt = mysqli_stmt_init($conn); //預處理語句 if (mysqli_stmt_prepare($stmt, $sql)) { // 綁定參數 mysqli_stmt_bind_param($stmt, 'sss', $firstname, $lastname, $email); // 設置參數並執行 $firstname = 'John'; $lastname = 'Doe'; $email = 'john@example.com'; mysqli_stmt_execute($stmt); $firstname = 'Mary'; $lastname = 'Moe'; $email = 'mary@example.com'; mysqli_stmt_execute($stmt); $firstname = 'Julie'; $lastname = 'Dooley'; $email = 'julie@example.com'; mysqli_stmt_execute($stmt); } } ?>
<?php $servername = "127.0.0.1"; $username = "root"; $password = ""; $dbname="jiu151231"; // 創建連接 $conn = new mysqli($servername, $username, $password, $dbname); // 檢測連接 if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } // prepare and bind $stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)"); $stmt->bind_param("sss", $firstname, $lastname, $email); // 設置參數並執行 $firstname = "John"; $lastname = "Doe"; $email = "john@example.com"; $stmt->execute(); $firstname = "Mary"; $lastname = "Moe"; $email = "mary@example.com"; $stmt->execute(); $firstname = "Julie"; $lastname = "Dooley"; $email = "julie@example.com"; $stmt->execute(); echo "New records created successfully"; $stmt->close(); $conn->close(); ?>
我們可以看到以上實例中使用模塊化來處理問題。我們可以通過創建代碼塊實現更簡單的讀取和管理。
注意參數的綁定。讓我們看下 mysqli_stmt_bind_param() 中的代碼:
mysqli_stmt_bind_param($stmt, 'sss', $firstname, $lastname, $email);
該函數綁定參數查詢並將參數傳遞給數據庫。第二個參數是 "sss" 。以下列表展示了參數的類型。 s 字符告訴 mysql 參數是字符串。
This argument may be one of four types:
- i - integer
- d - double
- s - string
- b - BLOB
每個參數必須指定類型,來保證數據的安全性。通過類型的判斷可以減少SQL注入漏洞帶來的風險。
從 MySQL 數據庫讀取數據
SELECT 語句用於從數據表中讀取數據:
SELECT column_name(s) FROM table_name
mysqli面向對象:
<?php $servername = "127.0.0.1"; $username = "root"; $password = ""; $dbname="jiu151231"; // 創建連接 $conn = new mysqli($servername, $username, $password, $dbname); // 檢測連接 if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $sql = "SELECT id, firstname, lastname FROM MyGuests"; $result = $conn->query($sql); if ($result->num_rows > 0) { // 輸出每行數據 while($row = $result->fetch_assoc()) { echo "<br> id: ". $row["id"]. " - Name: ". $row["firstname"]. " " . $row["lastname"]; } } else { echo "0 results"; } $conn->close(); ?>
where子句
WHERE 子句用於提取滿足指定標准的的記錄。
SELECT column_name(s)
FROM table_name
WHERE column_name operator value
<?php $con=mysqli_connect("example.com","peter","abc123","my_db"); // Check connection if (mysqli_connect_errno()) { echo "Failed to connect to MySQL: " . mysqli_connect_error(); } $result = mysqli_query($con,"SELECT * FROM Persons WHERE FirstName='Peter'"); while($row = mysqli_fetch_array($result)) { echo $row['FirstName'] . " " . $row['LastName']; echo "<br>"; } ?>
Order By 關鍵詞
ORDER BY 關鍵詞用於對記錄集中的數據進行排序。
ORDER BY 關鍵詞默認對記錄進行升序排序。默認為ASC。
如果你想降序排序,請使用 DESC 關鍵字。
SELECT column_name(s)
FROM table_name
ORDER BY column_name(s) ASC|DESC
<?php $con=mysqli_connect("example.com","peter","abc123","my_db"); // Check connection if (mysqli_connect_errno()) { echo "Failed to connect to MySQL: " . mysqli_connect_error(); } $result = mysqli_query($con,"SELECT * FROM Persons ORDER BY age"); while($row = mysqli_fetch_array($result)) { echo $row['FirstName']; echo " " . $row['LastName']; echo " " . $row['Age']; echo "<br>"; } mysqli_close($con); ?>
根據兩列進行排序
可以根據多個列進行排序。當按照多個列進行排序時,只有第一列的值相同時才使用第二列:
SELECT column_name(s)
FROM table_name
ORDER BY column1, column2
Update
UPDATE 語句用於更新數據庫表中已存在的記錄。
UPDATE table_name SET column1=value, column2=value2,... WHERE some_column=some_value
注釋:請注意 UPDATE 語法中的 WHERE 子句。WHERE 子句規定了哪些記錄需要更新。如果您想省去 WHERE 子句,所有的記錄都會被更新!
<?php $con=mysqli_connect("example.com","peter","abc123","my_db"); // Check connection if (mysqli_connect_errno()) { echo "Failed to connect to MySQL: " . mysqli_connect_error(); } mysqli_query($con,"UPDATE Persons SET Age=36 WHERE FirstName='Peter' AND LastName='Griffin'"); mysqli_close($con); ?>
Delete
DELETE FROM 語句用於從數據庫表中刪除記錄。
DELETE FROM table_name
WHERE some_column = some_value
注釋:請注意 DELETE 語法中的 WHERE 子句。WHERE 子句規定了哪些記錄需要刪除。如果您想省去 WHERE 子句,所有的記錄都會被刪除!
<?php $con=mysqli_connect("example.com","peter","abc123","my_db"); // Check connection if (mysqli_connect_errno()) { echo "Failed to connect to MySQL: " . mysqli_connect_error(); } mysqli_query($con,"DELETE FROM Persons WHERE LastName='Griffin'"); mysqli_close($con); ?>
ODBC
ODBC 是一種應用程序編程接口(Application Programming Interface,API),使我們有能力連接到某個數據源(比如一個 MS Access 數據庫)。
創建 ODBC 連接
通過一個 ODBC 連接,您可以連接到您的網絡中的任何計算機上的任何數據庫,只要 ODBC 連接是可用的。
這是創建到達 MS Access 數據庫的 ODBC 連接的方法:
- 在控制面板中打開管理工具圖標。
- 雙擊其中的數據源(ODBC)圖標。
- 選擇系統 DSN 選項卡。
- 點擊系統 DSN 選項卡中的添加。
- 選擇Microsoft Access Driver。點擊完成。
- 在下一個界面,點擊選擇來定位數據庫。
- 為數據庫起一個數據源名(DSN)。
- 點擊確定。
請注意,必須在您的網站所在的計算機上完成這個配置。如果您的計算機上正在運行 Internet 信息服務(IIS),上面的指令將會生效,但是如果您的網站位於遠程服務器,您必須擁有對該服務器的物理訪問權限,或者請您的主機提供商為您建立 DSN。
連接到 ODBC
odbc_connect() 函數用於連接到 ODBC 數據源。該函數有四個參數:數據源名、用戶名、密碼以及可選的指針類型。
odbc_exec() 函數用於執行 SQL 語句。
實例
下面的實例創建了到達名為 northwind 的 DSN 的連接,沒有用戶名和密碼。然后創建並執行一條 SQL 語句:
$conn=odbc_connect('northwind','',''); $sql="SELECT * FROM customers"; $rs=odbc_exec($conn,$sql);
取回記錄
odbc_fetch_row() 函數用於從結果集中返回記錄。如果能夠返回行,則函數返回 true,否則返回 false。
該函數有兩個參數:ODBC 結果標識符和可選的行號:
odbc_fetch_row($rs)
從記錄中取回字段
odbc_result() 函數用於從記錄中讀取字段。該函數有兩個參數:ODBC 結果標識符和字段編號或名稱。
下面的代碼行從記錄中返回第一個字段的值:
$compname=odbc_result($rs,1);
下面的代碼行返回名為 "CompanyName" 的字段的值:
$compname=odbc_result($rs,"CompanyName");
關閉 ODBC 連接
odbc_close() 函數用於關閉 ODBC 連接。
odbc_close($conn);
ODBC 實例
下面的實例展示了如何首先創建一個數據庫連接,接着創建一個結果集,然后在 HTML 表格中顯示數據。
<html> <body> <?php $conn=odbc_connect('northwind','',''); if (!$conn) {exit("Connection Failed: " . $conn);} $sql="SELECT * FROM customers"; $rs=odbc_exec($conn,$sql); if (!$rs) {exit("Error in SQL");} echo "<table><tr>"; echo "<th>Companyname</th>"; echo "<th>Contactname</th></tr>"; while (odbc_fetch_row($rs)) { $compname=odbc_result($rs,"CompanyName"); $conname=odbc_result($rs,"ContactName"); echo "<tr><td>$compname</td>"; echo "<td>$conname</td></tr>"; } odbc_close($conn); echo "</table>"; ?> </body> </html>
