<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # MySQL PHP 教程 > 原文: [http://zetcode.com/databases/mysqlphptutorial/](http://zetcode.com/databases/mysqlphptutorial/) 這是針對 MySQL 數據庫的 PHP 編程教程。 它涵蓋了使用 PHP 進行 MySQL 編程的基礎。 它使用通用 mysql 模塊。 這些示例是在 Ubuntu Linux 上創建和測試的。 在 ZetCode 上有類似的 [MySQL C API 教程](/db/mysqlc/), [MySQL MySQL 教程](/db/mysqlpython/), [MongoDB PHP 教程](/db/mongodbphp/)和 [PostgreSQL PHP 教程](/db/postgresqlphp/)。 如果您需要重新了解 PHP 語言,可以在 ZetCode 上找到完整的 [PHP 教程](/lang/php/)。 ## 關于 MySQL 數據庫 MySQL 是領先的開源數據庫管理系統。 它是一個多用戶,多線程的數據庫管理系統。 MySQL 在網絡上特別流行。 它是非常流行的 _LAMP_ 平臺的組成部分之一。 Linux,Apache,MySQL 和 PHP。 目前,MySQL 由 Oracle 擁有。 MySQL 數據庫在最重要的 OS 平臺上可用。 它可以在 BSD Unix,Linux,Windows 或 Mac OS 上運行。 維基百科和 YouTube 使用 MySQL。 這些站點每天管理數百萬個查詢。 MySQL 有兩個版本:MySQL 服務器系統和 MySQL 嵌入式系統。 ## 開始之前 我們需要安裝幾個包來執行本教程中的示例:`php5-cli`,`php5-mysql`,`mysql-server`和`mysql-client`。 `php5-cli`是 PHP5 編程語言的命令行解釋器。 本教程中的所有示例均在控制臺上創建。 我特意跳過了 Web 界面,以使示例更簡單,僅關注 PHP 和 MySQL。 如果您尚未安裝 MySQL,則必須安裝它。 ```php $ sudo apt-get install mysql-server ``` 此命令將安裝 MySQL 服務器和其他各種包。 在安裝包時,提示我們輸入 MySQL 根帳戶的密碼。 接下來,我們將創建一個新的數據庫用戶和一個新的數據庫。 我們使用`mysql`客戶端。 ```php $ service mysql status mysql start/running, process 1238 ``` 我們檢查 MySQL 服務器是否正在運行。 如果沒有,我們需要啟動服務器。 在 Ubuntu Linux 上,可以使用`service mysql start`命令來完成。 ```php $ sudo service mysql start ``` 如果我們已經從包中安裝了 MySQL 數據庫,則上述命令是啟動 MySQL 的常用方法。 ```php $ sudo -b /usr/local/mysql/bin/mysqld_safe ``` 上面的命令使用 MySQL 服務器啟動腳本啟動 MySQL 服務器。 我們啟動 MySQL 服務器的方式可能有所不同。 這取決于我們是否從源代碼或包安裝了 MySQL,也取決于 Linux 發行版。 有關更多信息,請查閱 [MySQL 的第一步](http://zetcode.com/databases/mysqltutorial/firststeps/)或您的 Linux 發行版信息。 接下來,我們將創建一個新的數據庫用戶和一個新的數據庫。 我們使用`mysql`客戶端。 ```php $ mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 30 Server version: 5.0.67-0ubuntu6 (Ubuntu) Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | +--------------------+ 2 rows in set (0.00 sec) ``` 我們使用 mysql 監視器客戶端應用連接到服務器。 我們使用根帳戶連接到數據庫。 我們用`SHOW DATABASES`語句顯示所有可用的數據庫。 ```php mysql> CREATE DATABASE mydb; Query OK, 1 row affected (0.02 sec) ``` 我們創建一個新的`mydb`數據庫。 在整個教程中,我們將使用此數據庫。 ```php mysql> CREATE USER user12@localhost IDENTIFIED BY '34klq*'; Query OK, 0 rows affected (0.00 sec) mysql> USE mydb; Database changed mysql> GRANT ALL ON mydb.* to user12@localhost; Query OK, 0 rows affected (0.00 sec) mysql> quit; Bye ``` 我們創建一個新的數據庫用戶。 我們授予該用戶`mydb`數據庫所有表的所有特權。 ## php5-mysql 為了從 PHP 語言連接到 MySQL 數據庫,我們必須安裝`php5-mysql`包。 這是 Debian / Ubuntu Linux 的包名稱。 在其他衍生產品上,名稱可能有所不同。 該包包含三個模塊。 它們也稱為擴展。 * `mysql`模塊 * `mysqli`模塊 * `pdo_mysql` 通用`mysql`模塊是 MySQL 數據庫的原始 PHP API。 我們的教程涵蓋了該模塊。 API 是程序性的。 該模塊不提供較新的 MySQL 數據庫的所有最新功能。 MySQL 改進的`mysqli`模塊是 MySQL 4.1.3 或更高版本的推薦模塊。 它提供了面向對象的 API 和過程 API。 與原始的`mysql`模塊相比,它具有一些優點和增強。 PHP 數據對象模塊`pdo_mysql`是 PHP 應用的數據庫抽象層。 如果我們編寫可移植的數據庫 PHP 腳本,則此模塊非常有用。 ## 第一個腳本 以下腳本是一個簡單的 PHP 腳本。 如果此小腳本運行正常,則說明我們已安裝了所有必需的東西。 ```php <?php $host = "localhost"; $user = "user12"; $pass = "34klq*"; $r = mysql_connect($host, $user, $pass); if (!$r) { echo "Could not connect to server\n"; trigger_error(mysql_error(), E_USER_ERROR); } else { echo "Connection established\n"; } echo mysql_get_server_info() . "\n"; mysql_close(); ?> ``` 我們連接到數據庫并獲取有關 MySQL 服務器的一些信息。 ```php $host = "localhost"; $user = "user12"; $pass = "34klq*"; ``` 這是三個變量,分別包含主機名,用戶名和密碼。 連接到 MySQL 數據庫時需要這些變量。 ```php $r = mysql_connect($host, $user, $pass); ``` 我們使用`mysql_connect()`函數連接到數據庫。 該函數返回一個布爾值,指示是否成功創建連接。 該函數具有 3 個參數。 第一個是安裝服務器的主機。 第二和第三個參數是用戶名和用戶密碼。 ```php if (!$r) { echo "Could not connect to server\n"; trigger_error(mysql_error(), E_USER_ERROR); } else { echo "Connection established\n"; } ``` 現在我們檢查`$r`變量。 如果它包含布爾值`false`,則表示未創建與數據庫的連接。 我們調用`trigger_error()`函數來生成錯誤消息。 第一條通用消息發送給用戶。 記錄通過`trigger_error()`函數生成的更具體的錯誤消息。 ```php echo mysql_get_server_info() . "\n"; ``` `mysql_get_server_info()`返回 MySQL 服務器版本。 ```php mysql_close(); ``` `mysql_close()`函數關閉與數據庫的連接。 在本例中,不需要關閉連接,因為在腳本執行結束時,非持久性打開鏈接會自動關閉。 但是,這是一種好的編程習慣。 ```php $ php version.php 5.1.41-3ubuntu12.6 5.3.2-1ubuntu4.5 ``` 在我的系統上,我得到以下輸出。 我們有一個類似的腳本。 ```php <?php $host = "localhost"; $user = "user12"; $pass = "34klq*"; $r = mysql_connect($host, $user, $pass); if (!$r) { echo "Could not connect to server\n"; trigger_error(mysql_error(), E_USER_ERROR); } else { echo "Connection established\n"; } $query = "SELECT VERSION()"; $rs = mysql_query($query); if (!$rs) { echo "Could not execute query: $query\n"; trigger_error(mysql_error(), E_USER_ERROR); } else { echo "Query: $query executed\n"; } $row = mysql_fetch_row($rs); echo "Version: $row[0]\n"; mysql_close(); ?> ``` 我們檢查 MySQL 數據庫的版本。 這次使用 SQL 查詢。 ```php $query = "SELECT VERSION()"; ``` 這是 SQL `SELECT`語句。 它返回數據庫的版本。 `VERSION()`是內置的 MySQL 函數。 ```php $rs = mysql_query($query); ``` `mysql_query()`函數在數據庫上執行 SQL 查詢。 這是一個`SELECT`查詢,因此結果是一個包含一些數據的結果集。 ```php if (!$rs) { echo "Could not execute query: $query\n"; trigger_error(mysql_error(), E_USER_ERROR); } else { echo "Query: $query executed\n"; } ``` 如果發生錯誤,我們會生成一條錯誤消息。 否則,我們將打印執行的 SQL 查詢。 ```php $row = mysql_fetch_row($rs); ``` 我們從結果集中獲取一行。 `$row`變量是一個包含數據的數組。 ```php echo "Version: $row[0]\n"; ``` 我們從數組中打印數據。 根據查詢的性質,我們知道數組只有一項,即 MySQL 版本字符串。 ```php $ php version2.php Connection established Query: SELECT VERSION() executed Version: 5.1.62-0ubuntu0.11.10.1 ``` 腳本在我們系統上的輸出。 ## 創建并填充表 接下來,我們將創建一個數據庫表并用數據填充它。 ```php <?php $host = "localhost"; $user = "user12"; $pass = "34klq*"; $db = "mydb"; function execute_query($query) { $r = mysql_query($query); if (!$r) { echo "Cannot execute query: $query\n"; trigger_error(mysql_error()); } else { echo "Query: $query executed\n"; } } $r = mysql_connect($host, $user, $pass); if (!$r) { echo "Could not connect to server\n"; trigger_error(mysql_error(), E_USER_ERROR); } else { echo "Connection established\n"; } $r2 = mysql_select_db($db); if (!$r2) { echo "Cannot select database\n"; trigger_error(mysql_error(), E_USER_ERROR); } else { echo "Database selected\n"; } $query = "DROP TABLE IF EXISTS Cars"; execute_query($query); $query = "CREATE TABLE Cars(Id INT PRIMARY KEY, Name TEXT, Price INT) ENGINE=InnoDB"; execute_query($query); $query = "INSERT INTO Cars VALUES(1,'Audi',52642)"; execute_query($query); $query = "INSERT INTO Cars VALUES(2,'Mercedes',57127)"; execute_query($query); $query = "INSERT INTO Cars VALUES(3,'Skoda',9000)"; execute_query($query); $query = "INSERT INTO Cars VALUES(4,'Volvo',29000)"; execute_query($query); $query = "INSERT INTO Cars VALUES(5,'Bentley',350000)"; execute_query($query); $query = "INSERT INTO Cars VALUES(6,'Citroen',21000)"; execute_query($query); $query = "INSERT INTO Cars VALUES(7,'Hummer',41400)"; execute_query($query); $query = "INSERT INTO Cars VALUES(8,'Volkswagen',21600)"; execute_query($query); mysql_close(); ?> ``` 在上面的代碼示例中,我們創建具有 8 行的`Cars`表。 ```php function execute_query($query) { $r = mysql_query($query); if (!$r) { echo "Cannot execute query: $query\n"; trigger_error(mysql_error()); } else { echo "Query: $query executed\n"; } } ``` 我們創建了一個自定義`execute_query()`函數,該函數將為每個`INSERT`語句調用。 ```php $r2 = mysql_select_db($db); ``` 在使用數據庫表之前,我們必須選擇一個數據庫。 使用`mysql_select_db()`函數選擇一個數據庫。 ```php if (!$r2) { echo "Cannot select database\n"; trigger_error(mysql_error(), E_USER_ERROR); } else { echo "Database selected\n"; } ``` 數據庫選擇過程的錯誤處理。 ```php $query = "DROP TABLE IF EXISTS Cars"; execute_query($query); ``` 第一個查詢將刪除`Cars`表(如果已存在)。 ```php $query = "CREATE TABLE Cars(Id INT PRIMARY KEY, Name TEXT, Price INT) ENGINE=InnoDB"; execute_query($query); ``` 這是創建`Cars`表的 SQL 語句。 ```php $query = "INSERT INTO Cars VALUES(1,'Audi',52642)"; execute_query($query); ``` 一輛汽車被插入表。 ```php if (!$ok) { echo mysql_error(); die("Cannot execute query. \n"); } ``` 如果發生錯誤,我們將打印錯誤消息并終止腳本。 ```php $ php create_fill.php Connection established Database selected Query: DROP TABLE IF EXISTS Cars executed Query: CREATE TABLE Cars(Id INT PRIMARY KEY, Name TEXT, Price INT) ENGINE=InnoDB executed Query: INSERT INTO Cars VALUES(1,'Audi',52642) executed Query: INSERT INTO Cars VALUES(2,'Mercedes',57127) executed Query: INSERT INTO Cars VALUES(3,'Skoda',9000) executed Query: INSERT INTO Cars VALUES(4,'Volvo',29000) executed Query: INSERT INTO Cars VALUES(5,'Bentley',350000) executed Query: INSERT INTO Cars VALUES(6,'Citroen',21000) executed Query: INSERT INTO Cars VALUES(7,'Hummer',41400) executed Query: INSERT INTO Cars VALUES(8,'Volkswagen',21600) executed ``` 執行`create_fill.php`腳本。 ```php mysql> SELECT * FROM Cars; +----+------------+--------+ | Id | Name | Price | +----+------------+--------+ | 1 | Audi | 52642 | | 2 | Mercedes | 57127 | | 3 | Skoda | 9000 | | 4 | Volvo | 29000 | | 5 | Bentley | 350000 | | 6 | Citroen | 21000 | | 7 | Hummer | 41400 | | 8 | Volkswagen | 21600 | +----+------------+--------+ 8 rows in set (0.00 sec) ``` 數據插入到`Cars`表中。 ## 檢索數據 現在我們已經將一些數據插入數據庫中,我們想要取回它。 ```php <?php $host = "localhost"; $user = "user12"; $pass = "34klq*"; $db = "mydb"; $r = mysql_connect($host, $user, $pass); if (!$r) { echo "Could not connect to server\n"; trigger_error(mysql_error(), E_USER_ERROR); } else { echo "Connection established\n"; } $r2 = mysql_select_db($db); if (!$r2) { echo "Cannot select database\n"; trigger_error(mysql_error(), E_USER_ERROR); } else { echo "Database selected\n"; } $query = "SELECT * FROM Cars LIMIT 5"; $rs = mysql_query($query); if (!$rs) { echo "Could not execute query: $query"; trigger_error(mysql_error(), E_USER_ERROR); } else { echo "Query: $query executed\n"; } while ($row = mysql_fetch_assoc($rs)) { echo $row['Id'] . " " . $row['Name'] . " " . $row['Price'] . "\n"; } mysql_close(); ?> ``` 在此示例中,我們從`Cars`表中檢索五行。 ```php $query = "SELECT * FROM Cars LIMIT 5"; ``` 該 SQL 語句從`Cars`表中選擇 5 行。 ```php $rs = mysql_query($query); ``` 我們使用`mysql_query()`函數執行查詢并檢索結果集。 ```php if (!$rs) { echo "Could not execute query: $query"; trigger_error(mysql_error(), E_USER_ERROR); } else { echo "Query: $query executed\n"; } ``` 如果查詢沒有成功,我們將生成一條錯誤消息。 ```php while ($row = mysql_fetch_assoc($rs)) { echo $row['Id'] . " " . $row['Name'] . " " . $row['Price'] . "\n"; } ``` 我們遍歷結果集并將數據打印到控制臺。 `mysql_fetch_assoc()`函數返回與提取的行相對應的字符串關聯數組,如果沒有更多行,則返回`FALSE`。 換句話說,函數調用從結果集中返回一行。 該行采用關聯數組的形式。 列名稱是關聯數組的鍵。 當結果集中沒有更多行時,該函數將返回`FALSE`,而`while`循環終止。 ```php $ php query.php Connection established Database selected Query: SELECT * FROM Cars LIMIT 5 executed 1 Audi 52642 2 Mercedes 57127 3 Skoda 9000 4 Volvo 29000 5 Bentley 350000 ``` 這是示例的輸出。 在第二個示例中,我們將使用`mysql_fetch_row()`函數獲取數據。 ```php <?php $host = "localhost"; $user = "user12"; $pass = "34klq*"; $db = "mydb"; $r = mysql_connect($host, $user, $pass); if (!$r) { echo "Could not connect to server\n"; trigger_error(mysql_error(), E_USER_ERROR); } else { echo "Connection established\n"; } $r2 = mysql_select_db($db); if (!$r2) { echo "Cannot select database\n"; trigger_error(mysql_error(), E_USER_ERROR); } else { echo "Database selected\n"; } $query = "SELECT Id, Name, Price From Cars LIMIT 5"; $rs = mysql_query($query); if (!$rs) { echo "Could not execute query: $query"; trigger_error(mysql_error(), E_USER_ERROR); } else { echo "Query: $query executed\n"; } $nrows = mysql_num_rows($rs); for ($i = 0; $i < $nrows; $i++) { $row = mysql_fetch_row($rs); echo $row[0]; echo " "; echo $row[1]; echo " "; echo $row[1]; echo "\n"; } mysql_close(); ?> ``` 我們從`Cars`表中獲得前 5 行。 ```php $nrows = mysql_num_rows($rs); ``` `mysql_num_rows()`函數從結果集中獲取行數。 ```php for ($i = 0; $i < $nrows; $i++) { $row = mysql_fetch_row($rs); echo $row[0]; echo " "; echo $row[1]; echo " "; echo $row[1]; echo "\n"; } ``` 我們使用`for`循環遍歷返回的行。 `mysql_fetch_row()`函數從結果集中以枚舉數組的形式檢索行。 ```php $ php query.php Connection established Query: SELECT * FROM Cars LIMIT 5 executed 1 Audi 52642 2 Mercedes 57127 3 Skoda 9000 4 Volvo 29000 5 Bentley 350000 ``` 輸出。 在下面的示例中,我們顯示了如何從表中檢索特定行。 ```php <?php $host = "localhost"; $user = "user12"; $pass = "34klq*"; $db = "mydb"; $r = mysql_connect($host, $user, $pass); if (!$r) { echo "Could not connect to server\n"; trigger_error(mysql_error(), E_USER_ERROR); } else { echo "Connection established\n"; } $r2 = mysql_select_db($db); if (!$r2) { echo "Cannot select database\n"; trigger_error(mysql_error(), E_USER_ERROR); } else { echo "Database selected\n"; } $name = "Volkswagen"; $query = sprintf("SELECT Id, Name, Price From Cars Where Name = '%s'", mysql_real_escape_string($name)); $rs = mysql_query($query); if (!$rs) { echo "Could not execute query: $query\n"; trigger_error(mysql_error(), E_USER_ERROR); } else { echo "Query: $query executed\n"; } while ($row = mysql_fetch_object($rs)) { echo $row->Id; echo " "; echo $row->Name; echo " "; echo $row->Price; echo "\n"; } mysql_close(); ?> ``` 開發者在處理用戶輸入時必須考慮安全性問題。 我們必須始終處理來自外部世界的數據。 檢查數據的有效性。 ```php $name = "Volkswagen"; ``` 在腳本中,我們檢查`Caras`表中是否有`"Volkswagen"`。 此值可能來自 XML 文件或 Web 表單。 我們將展示如何檢查它。 ```php $query = sprintf("SELECT Id, Name, Price From Cars Where Name = '%s'", mysql_real_escape_string($name)); ``` 我們使用`sprintf()`函數構建 SQL 語句。 我們使用`mysql_real_escape_string()`函數處理`$name`變量。 此函數轉義字符串中的特殊字符以用于 SQL 語句。 這樣可以防止 SQL 注入攻擊和數據損壞。 處理完變量后,將其放入 SQL 語句字符串中。 ```php while ($row = mysql_fetch_object($rs)) { echo $row->Id; echo " "; echo $row->Name; echo " "; echo $row->Price; echo "\n"; } ``` 我們使用`mysql_fetch_object()`函數獲取數據。 該函數獲取結果行作為對象。 然后,我們使用對象表示法獲取表列。 ```php $ php query3.php Connection established Database selected Query: SELECT Id, Name, Price From Cars Where Name = 'Volkswagen' executed 8 Volkswagen 21600 ``` 示例的輸出。 我們找到了汽車,并將整行打印到控制臺。 ## 轉義字符 我們將有一個小示例演示如何轉義字符。 有些字符在數據庫環境中被認為是不安全的。 其中之一是單引號字符。 ```php mysql> CREATE TABLE IF NOT EXISTS Authors(Id INT PRIMARY KEY AUTO_INCREMENT, -> Name VARCHAR(25)) ENGINE=InnoDB; Query OK, 0 rows affected (0.09 sec) ``` 對于該示例,我們創建一個`Authors`表。 ```php <?php $host = "localhost"; $user = "user12"; $pass = "34klq*"; $db = "mydb"; $r = mysql_connect($host, $user, $pass); if (!$r) { echo "Could not connect to server\n"; trigger_error(mysql_error(), E_USER_ERROR); } else { echo "Connection established\n"; } $r2 = mysql_select_db($db); if (!$r2) { echo "Cannot select database\n"; trigger_error(mysql_error(), E_USER_ERROR); } else { echo "Database selected\n"; } $name = "O'Neill"; $name_es = mysql_real_escape_string($name); $query = "INSERT INTO Authors(Name) VALUES('$name_es')"; $rs = mysql_query($query); if (!$rs) { echo "Could not execute query: $query\n"; trigger_error(mysql_error(), E_USER_ERROR); } else { echo "Query: $query executed\n"; } mysql_close(); ?> ``` 我們在`Authors`表中插入一個新作者。 作者的名字叫奧尼爾。 該名稱具有不安全的單引號字符。 ```php $name_es = mysql_real_escape_string($name); ``` 這就是為什么我們使用`mysql_real_escape_string()`函數來轉義此字符。 ```php $query = "INSERT INTO Authors(Name) VALUES('$name_es')"; $rs = mysql_query($query); ``` 我們創建該語句并執行它。 ```php mysql> SELECT * FROM Authors; +----+---------+ | Id | Name | +----+---------+ | 1 | O'Neill | +----+---------+ 1 row in set (0.00 sec) ``` 該名稱已成功寫入表中。 ## 列標題 接下來,我們將展示如何使用數據庫表中的數據打印列標題。 ```php <?php $host = "localhost"; $user = "user12"; $pass = "34klq*"; $db = "mydb"; $r = mysql_connect($host, $user, $pass); if (!$r) { echo "Could not connect to server\n"; trigger_error(mysql_error(), E_USER_ERROR); } else { echo "Connection established\n"; } $r2 = mysql_select_db($db); if (!$r2) { echo "Cannot select database\n"; trigger_error(mysql_error(), E_USER_ERROR); } else { echo "Database selected\n"; } $query = "SELECT * From Cars LIMIT 8"; $rs = mysql_query($query); if (!$rs) { echo "Could not execute query: $query"; trigger_error(mysql_error(), E_USER_ERROR); } else { echo "Query: $query executed\n"; } $cname1 = mysql_fetch_field($rs, 0); $cname2 = mysql_fetch_field($rs, 1); $cname3 = mysql_fetch_field($rs, 2); printf("%3s %-11s %8s\n", $cname1->name, $cname2->name, $cname3->name); while ($row = mysql_fetch_row($rs)) { printf("%3s %-11s %8s\n", $row[0], $row[1], $row[2]); } mysql_close(); ?> ``` 同樣,我們將`Writers`表的內容打印到控制臺。 現在,我們也包括列的名稱。 ```php $cname1 = mysql_fetch_field($rs, 0); $cname2 = mysql_fetch_field($rs, 1); $cname3 = mysql_fetch_field($rs, 2); ``` 要獲取特定的字段名稱,我們利用`mysql_fetch_field()`函數。 該函數返回一個包含列信息的對象。 ```php printf("%3s %-11s %8s\n", $cname1->name, $cname2->name, $cname3->name); ``` 列名稱已打印并格式化。 `name`屬性包含列名。 ```php $ php columns.php Connection established Database selected Query: SELECT * From Cars LIMIT 8 executed Id Name Price 1 Audi 52642 2 Mercedes 57127 3 Skoda 9000 4 Volvo 29000 5 Bentley 350000 6 Citroen 21000 7 Hummer 41400 8 Volkswagen 21600 ``` 腳本的輸出。 ## 行和列數 以下腳本計算查詢返回的字段/列和行數。 ```php <?php $host = "localhost"; $user = "user12"; $pass = "34klq*"; $db = "mydb"; $r = mysql_connect($host, $user, $pass); if (!$r) { echo "Could not connect to server\n"; trigger_error(mysql_error(), E_USER_ERROR); } else { echo "Connection established\n"; } $r2 = mysql_select_db($db); if (!$r2) { echo "Cannot select database\n"; trigger_error(mysql_error(), E_USER_ERROR); } else { echo "Database selected\n"; } $query = "SELECT * FROM Cars WHERE Id IN (1, 2, 3)"; $rs = mysql_query($query); if (!$rs) { echo "Could not execute query: $query\n"; trigger_error(mysql_error(), E_USER_ERROR); } else { echo "Query: $query executed\n"; } echo "We have " . mysql_num_fields($rs) . " fields\n"; echo "We have " . mysql_num_rows($rs) . " rows\n"; print_r(mysql_fetch_row($rs)); mysql_close(); ?> ``` 我們從`Cars`表中選擇三行。 我們計算查詢返回的行數和列數。 ```php $query = "SELECT * FROM Cars WHERE Id IN (1, 2, 3)"; ``` 這是要執行的查詢。 它從`Cars`表中選擇前三行。 ```php echo "We have " . mysql_num_fields($rs) . " fields\n"; ``` `mysql_num_fields()`返回查詢返回的字段數。 ```php echo "We have " . mysql_num_rows($rs) . " rows\n"; ``` `mysql_num_rows()`返回查詢返回的行數。 ```php print_r(mysql_fetch_row($rs)); ``` 我們打印數組的內容。 ```php $ php fields_rows.php Connection established Database selected Query: SELECT * FROM Cars WHERE Id IN (1, 2, 3) executed We have 3 fields We have 3 rows Array ( [0] => 1 [1] => Audi [2] => 52642 ) ``` 運行腳本。 ## 寫入圖像 有些人喜歡將其圖像放入數據庫中,有些人則希望將其保留在文件系統中以供其應用使用。 當我們處理大量圖像時,會出現技術難題。 圖像是二進制數據。 MySQL 數據庫具有一種特殊的數據類型來存儲稱為`BLOB`(二進制大對象)的二進制數據。 ```php mysql> CREATE TABLE Images(Id INT PRIMARY KEY AUTO_INCREMENT, Data MEDIUMBLOB); Query OK, 0 rows affected (0.06 sec) ``` 對于此示例,我們創建一個名為`Images`的新表。 ```php <?php $host = "localhost"; $user = "user12"; $pass = "34klq*"; $db = "mydb"; $r = mysql_connect($host, $user, $pass); if (!$r) { echo "Could not connect to server\n"; trigger_error(mysql_error(), E_USER_ERROR); } else { echo "Connection established\n"; } $r2 = mysql_select_db($db); if (!$r2) { echo "Cannot select database\n"; trigger_error(mysql_error(), E_USER_ERROR); } else { echo "Database selected\n"; } $file = "woman.jpg"; $img = fopen($file, 'r'); if (!$img) { echo "Cannot open file for writing\n"; trigger_error("Cannot open file for writing\n", E_USER_ERROR); } $data = fread($img, filesize($file)); if (!$data) { echo "Cannot read image data\n"; trigger_error("Cannot read image data\n", E_USER_ERROR); } $es_data = mysql_real_escape_string($data); fclose($img); $query = "INSERT INTO Images(Id, Data) Values(1, '$es_data')"; $rs = mysql_query($query); if (!$rs) { echo "Could not execute query: $query"; trigger_error(mysql_error(), E_USER_ERROR); } else { echo "Query successfully executed\n"; } mysql_close(); ?> ``` 在上面的腳本中,我們讀取 JPG 圖像并將其插入到`Images`表中。 ```php $file = "woman.jpg"; ``` 這是我們從文件系統讀取并寫入數據庫的映像名稱。 它與腳本名稱位于同一目錄中。 ```php $img = fopen($file, 'r'); if (!$img) { echo "Cannot open file for writing\n"; trigger_error("Cannot open file for writing\n", E_USER_ERROR); } $data = fread($img, filesize($file)); if (!$data) { echo "Cannot read image data\n"; trigger_error("Cannot read image data\n", E_USER_ERROR); } ``` 我們打開并閱讀圖像。 `fread()`函數以字符串形式返回數據。 ```php $es_data = mysql_real_escape_string($data); ``` 我們逃避不安全的字符。 ```php fclose($img); ``` 我們關閉圖像文件的句柄。 ```php $query = "INSERT INTO Images(Id, Data) Values(1, '$es_data')"; $rs = mysql_query($query); if (!$rs) { echo "Could not execute query: $query"; trigger_error(mysql_error(), E_USER_ERROR); } else { echo "Query successfully executed\n"; } ``` 我們將數據插入到新創建的`Images`表中。 ## 讀取圖像 在前面的示例中,我們已將圖像插入數據庫表中。 現在,我們將從表中讀取圖像。 ```php <?php $host = "localhost"; $user = "user12"; $pass = "34klq*"; $db = "mydb"; $r = mysql_connect($host, $user, $pass); if (!$r) { echo "Could not connect to server\n"; trigger_error(mysql_error(), E_USER_ERROR); } else { echo "Connection established\n"; } $r2 = mysql_select_db($db); if (!$r2) { echo "Cannot select database\n"; trigger_error(mysql_error(), E_USER_ERROR); } else { echo "Database selected\n"; } $query = "SELECT Data FROM Images WHERE Id=1"; $rs = mysql_query($query); if (!$rs) { echo "Could not execute query: $query"; trigger_error(mysql_error(), E_USER_ERROR); } else { echo "Query: $query executed\n"; } $row = mysql_fetch_row($rs); $file = "woman2.jpg"; $img = fopen($file, 'wb'); if (!$img) { echo "Cannot open file for writing\n"; trigger_error("Cannot open file for writing\n", E_USER_ERROR); } $r3 = fwrite($img, $row[0]); if (!$r3) { echo "Cannot write image to file\n"; trigger_error("Cannot write image to file\n", E_USER_ERROR); } fclose($img); mysql_close(); ?> ``` 我們從`Images`表中讀取了一張圖像。 ```php $query = "SELECT Data FROM Images WHERE Id=1"; ``` 我們從表中選擇一條記錄。 ```php $row = mysql_fetch_row($rs); ``` 我們從結果集中獲取一行。 只有一行包含圖像數據。 ```php $file = "woman2.jpg"; ``` 我們將創建一個名為`woman2.jpg`的新圖像文件。 ```php $img = fopen($file, 'wb'); if (!$img) { echo "Cannot open file for writing\n"; trigger_error("Cannot open file for writing\n", E_USER_ERROR); } ``` 我們打開一個可寫的二進制文件。 ```php $r3 = fwrite($img, $row[0]); if (!$r3) { echo "Cannot write image to file\n"; trigger_error("Cannot write image to file\n", E_USER_ERROR); } ``` 我們使用`fwrite()`函數將數據寫入文件系統。 現在我們在當前目錄中應該有一個名為`woman2.jpg`的映像。 我們可以檢查它是否與我們插入表中的圖像相同。 ## 事務支持 事務是針對一個或多個數據庫中數據的數據庫操作的基本單位。 事務中所有 SQL 語句的影響可以全部提交給數據庫,也可以全部回滾。 MySQL 數據庫具有不同類型的存儲引擎。 最常見的是 MyISAM 和 InnoDB 引擎。 MyISAM 是默認的。 在數據安全性和數據庫速度之間需要權衡。 MyISAM 表的處理速度更快,并且不支持事務。 另一方面,InnoDB 表可以更安全地防止數據丟失。 他們支持事務。 它們處理較慢。 ```php <?php mysql_connect('localhost', 'testuser', 'test623') or die("cannot connect to database\n"); mysql_select_db("testdb") or die(mysql_error()); $r1 = mysql_query("UPDATE Writers SET Name = 'Leo Tolstoy' WHERE Id = 1") or die(mysql_error()); $r2 = mysql_query("UPDATE Writers SET Name = 'Boris Pasternak' WHERE Id = 2") or die(mysql_error()); $r3 = mysql_query("UPDATE Writer SET Name = 'Leonid Leonov' WHERE Id = 3") or die(mysql_error()); mysql_close(); ?> ``` 在此腳本中,我們嘗試更新三行。 該表的存儲引擎是 MyISAM。 ```php $r1 = mysql_query("UPDATE Writers SET Name = 'Leo Tolstoy' WHERE Id = 1") or die(mysql_error()); $r2 = mysql_query("UPDATE Writers SET Name = 'Boris Pasternak' WHERE Id = 2") or die(mysql_error()); ``` 在這里,我們要更改第 1 行和第 2 行的作者姓名。 ```php $r3 = mysql_query("UPDATE Writer SET Name = 'Leonid Leonov' WHERE Id = 3") or die(mysql_error()); ``` SQL 語句中有錯誤。 沒有`Writer`表。 ```php $ php update.php Table 'testdb.Writer' doesn't exist mysql> SELECT * FROM Writers; +----+-------------------+ | Id | Name | +----+-------------------+ | 1 | Leo Tolstoy | | 2 | Boris Pasternak | | 3 | Lion Feuchtwanger | | 4 | Emile Zola | | 5 | Truman Capote | | 6 | O'Neill | +----+-------------------+ 6 rows in set (0.00 sec) ``` 運行腳本會出現錯誤。 但是,正如我們所看到的,前兩行已經更改。 在本教程的最后一個示例中,我們將重新創建`Writers`表。 這次,該表將為 InnoDB 類型。 InnoDB MySQL 數據庫表支持事務。 ```php DROP TABLE Writers; CREATE TABLE IF NOT EXISTS Writers(Id INT PRIMARY KEY AUTO_INCREMENT, Name VARCHAR(25)) ENGINE=INNODB; INSERT INTO Writers(Name) VALUES('Jack London'); INSERT INTO Writers(Name) VALUES('Honore de Balzac'); INSERT INTO Writers(Name) VALUES('Lion Feuchtwanger'); INSERT INTO Writers(Name) VALUES('Emile Zola'); INSERT INTO Writers(Name) VALUES('Truman Capote'); ``` 這是`writers.sql`文件。 它用于重新創建`Writers`表。 ```php mysql> source writers.sql Query OK, 0 rows affected (0.03 sec) Query OK, 0 rows affected (0.10 sec) Query OK, 1 row affected (0.02 sec) Query OK, 1 row affected (0.03 sec) Query OK, 1 row affected (0.02 sec) Query OK, 1 row affected (0.02 sec) Query OK, 1 row affected (0.02 sec) ``` 我們可以使用`source`命令來加載和執行 SQL 腳本。 ```php <?php mysql_connect('localhost', 'testuser', 'test623') or die("cannot connect to database\n"); mysql_select_db("testdb") or die(mysql_error()); mysql_query("SET AUTOCOMMIT=0"); mysql_query("START TRANSACTION"); $r1 = mysql_query("DELETE FROM Writers WHERE Id = 3") or die(mysql_error()); $r2 = mysql_query("DELETE FROM Writers WHERE Id = 4") or die(mysql_error()); $r3 = mysql_query("DELETE FROM Writer WHERE Id = 5") or die(mysql_error()); if ($r1 and $r2 and $r3) { mysql_query("COMMIT"); } else { mysql_query("ROLLBACK"); } mysql_close(); ?> ``` 現在,我們將執行上面的腳本。 我們要從表中刪除三行。 第三個 SQL 語句有一個錯誤。 ```php mysql_query("START TRANSACTION"); ``` `START TRANSACTION`語句開始一個新的事務。 必須使用`COMMIT`語句將所有更改永久化,或使用`ROLLBACK`語句將其忽略。 ```php if ($r1 and $r2 and $r3) { mysql_query("COMMIT"); } else { mysql_query("ROLLBACK"); } ``` 僅當所有三個 SQL 語句都返回`True`時,才提交語句。 否則,我們將它們回滾。 在我們的情況下,`$r3`變量為`False`,因此不會使語句成為永久語句,也不會從表中刪除行。 ```php $ php transaction.php Table 'testdb.Writer' doesn't exist mysql> SELECT * FROM Writers; +----+-------------------+ | Id | Name | +----+-------------------+ | 1 | Jack London | | 2 | Honore de Balzac | | 3 | Lion Feuchtwanger | | 4 | Emile Zola | | 5 | Truman Capote | +----+-------------------+ 5 rows in set (0.00 sec) ``` 在將更改提交到數據庫之前,發生了錯誤。 調用`ROLLBACK`語句,并且沒有發生刪除。 [Tweet](https://twitter.com/share) 這是 MySQL PHP 教程。 您可能也對 [MySQL C API 教程](/db/mysqlc/), [MySQL Python 教程](/db/mysqlpython/)或 [MySQL Visual Basic 教程](/db/mysqlvb/)感興趣。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看