<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # PHP PDO 教程 > 原文: [https://zetcode.com/php/pdo/](https://zetcode.com/php/pdo/) 在本教程中,我們展示了如何在 PHP PDO 中對數據庫進行編程。 ## PHP PDO PHP 數據對象(PDO)定義了用于訪問 PHP 中數據庫的輕量級接口。 它提供了一個數據訪問抽象層,用于在 PHP 中使用數據庫。 它定義了用于各種數據庫系統的一致 API。 ## PHP PDO 類 `PDO`表示 PHP 與數據庫服務器之間的連接。 `PDOStatement`代表準備好的語句,在執行該語句后,代表關聯的結果集。 `PDOException`表示 PDO 引發的錯誤。 ## MySQL 數據庫 在本教程中,我們將使用 MySQL 數據庫。 `countries_mysql.sql` ```php DROP TABLE IF EXISTS countries; CREATE TABLE countries(id BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255), population INT); INSERT INTO countries(name, population) VALUES('China', 1382050000); INSERT INTO countries(name, population) VALUES('India', 1313210000); INSERT INTO countries(name, population) VALUES('USA', 324666000); INSERT INTO countries(name, population) VALUES('Indonesia', 260581000); INSERT INTO countries(name, population) VALUES('Brazil', 207221000); INSERT INTO countries(name, population) VALUES('Pakistan', 196626000); INSERT INTO countries(name, population) VALUES('Nigeria', 186988000); INSERT INTO countries(name, population) VALUES('Bangladesh', 162099000); INSERT INTO countries(name, population) VALUES('Nigeria', 186988000); INSERT INTO countries(name, population) VALUES('Russia', 146838000); INSERT INTO countries(name, population) VALUES('Japan', 126830000); ``` 這些 SQL 命令創建一個`countries`表。 ## PHP PDO 查詢 PDO `query()`在單個函數調用中執行一條 SQL 語句,返回該語句返回的結果集(如果有)。 `version.php` ```php <?php $dsn = "mysql:host=localhost;dbname=mydb"; $user = "user12"; $passwd = "12user"; $pdo = new PDO($dsn, $user, $passwd); $stm = $pdo->query("SELECT VERSION()"); $version = $stm->fetch(); echo $version[0] . PHP_EOL; ``` 該示例返回 MySQL 的版本。 ```php $dsn = "mysql:host=localhost;dbname=mydb"; $user = "user12"; $passwd = "12user"; ``` 這些變量用于創建到數據庫的連接字符串。 `dsn`是數據源名稱,其中包含連接到數據庫所需的信息。 ```php $pdo = new PDO($dsn, $user, $passwd); ``` 創建一個新的`PDO`對象。 我們向構造器傳遞數據源名稱以及用戶名和密碼。 `PDO`類表示 PHP 與數據庫服務器之間的連接。 ```php $stm = $pdo->query("SELECT VERSION()"); ``` `query()`方法在單個函數調用中執行一條 SQL 語句。 它返回結果集。 ```php $version = $stm->fetch(); ``` PDO 語句的`fetch()`方法從結果集中獲取下一行。 在我們的例子中,它是 MySQL 的一個版本。 ```php echo $version[0] . PHP_EOL; ``` `$version`是一個數組; 我們得到它的第一個值。 ```php $ php version.php 5.7.22-0ubuntu0.16.04.1 ``` 這是輸出。 ## PHP PDO 執行 PDO `exec()`執行一條 SQL 語句并返回受影響的行數。 `affected_rows.php` ```php <?php $dsn = "mysql:host=localhost;dbname=mydb"; $user = "user12"; $passwd = "12user"; $pdo = new PDO($dsn, $user, $passwd); $id = 12; $nrows = $pdo->exec("DELETE FROM countries WHERE id IN (1, 2, 3)"); echo "The statement affected $nrows rows\n"; ``` 該代碼示例將刪除三行。 它打印受影響的行數。 ```php $nrows = $pdo->exec("DELETE FROM countries WHERE id IN (1, 2, 3)"); ``` 在此 SQL 語句中,我們刪除 ID 為 1、2 和 3 的行。已刪除的行數存儲在`$nrows`變量中。 ```php echo "The statement deleted $nrows rows\n"; ``` 我們打印已刪除的行數。 ## PHP PDO 提取樣式 提取樣式參數控制如何將下一行返回給調用方。 例如,`PDO::FETCH_ASSOC`返回按列名索引的數組,`PDO::FETCH_NUM`返回按列號索引的數組,`PDO::FETCH_BOTH`返回按列名和索引列號索引的數組。 默認的獲取樣式為`PDO::FETCH_BOTH`。 `fetch_style_num.php` ```php <?php $dsn = "mysql:host=localhost;dbname=mydb"; $user = "user12"; $passwd = "12user"; $pdo = new PDO($dsn, $user, $passwd); $stm = $pdo->query("SELECT * FROM countries"); $rows = $stm->fetchAll(PDO::FETCH_NUM); foreach($rows as $row) { printf("$row[0] $row[1] $row[2]\n"); } ``` 在此代碼示例中,我們在索引數組中獲取數據。 ```php $stm = $pdo->query("SELECT * FROM countries"); ``` 我們從`countries`表中選擇所有數據。 ```php $rows = $stm->fetchAll(PDO::FETCH_NUM); ``` 我們將`PDO:FETCH_NUM`樣式傳遞給`fetchAll()`方法。 ```php foreach($rows as $row) { printf("$row[0] $row[1] $row[2]\n"); } ``` 我們遍歷`$rows`數組并打印字段。 通過數組索引訪問這些字段。 `fetch_style_assoc.php` ```php <?php $dsn = "mysql:host=localhost;dbname=mydb"; $user = "user12"; $passwd = "12user"; $pdo = new PDO($dsn, $user, $passwd); $stm = $pdo->query("SELECT * FROM countries"); $rows = $stm->fetchAll(PDO::FETCH_ASSOC); foreach($rows as $row) { printf("{$row['id']} {$row['name']} {$row['population']}\n"); } ``` 在此示例中,我們以關聯數組的形式獲取數據。 ```php $rows = $stm->fetchAll(PDO::FETCH_ASSOC); ``` 在`fetchAll()`方法中,我們使用`PDO::FETCH_ASSOC`樣式。 ## PHP PDO 參數綁定 SQL 語句通常是動態構建的。 用戶提供一些輸入,并且此輸入已內置到語句中。 每當我們處理來自用戶的輸入時,我們都必須謹慎。 它具有一些嚴重的安全隱患。 動態構建 SQL 語句的推薦方法是使用參數綁定。 PDO 包含`bindParam()`和`bindValue()`方法來創建參數化查詢。 PDO 允許將數據綁定到問號或命名的占位符。 `parameterized_query.php` ```php <?php $dsn = "mysql:host=localhost;dbname=mydb"; $user = "root"; $passwd = "andrea"; $pdo = new PDO($dsn, $user, $passwd); $id = 12; $stm = $pdo->prepare("SELECT * FROM countries WHERE id = ?"); $stm->bindValue(1, $id); $stm->execute(); $row = $stm->fetch(PDO::FETCH_ASSOC); echo "Id: " . $row['id'] . PHP_EOL; echo "Name: " . $row['name'] . PHP_EOL; echo "Population: " . $row['population'] . PHP_EOL; ``` 在示例中,我們使用`bindValue()`創建參數化查詢。 我們使用問號占位符。 ```php $id = 12; ``` 說此輸入來自用戶。 ```php $stm = $pdo->prepare("SELECT * FROM countries WHERE id = ?"); $stm->bindValue(1, $id); $stm->execute(); ``` `select`語句從表中獲取特定行。 我們將帶有`bindValue()`的值綁定到問號占位符。 在第二種情況下,我們使用`bindParam()`。 `parameterized_query2.php` ```php <?php $dsn = "mysql:host=localhost;dbname=mydb"; $user = "user12"; $passwd = "12user"; $pdo = new PDO($dsn, $user, $passwd); $id = 12; $stm = $pdo->prepare("SELECT * FROM countries WHERE id = :id"); $stm->bindParam(":id", $id, PDO::PARAM_INT); $stm->execute(); $row = $stm->fetch(PDO::FETCH_ASSOC); echo "Id: " . $row['id'] . PHP_EOL; echo "Name: " . $row['name'] . PHP_EOL; echo "Population: " . $row['population'] . PHP_EOL; ``` 該示例選擇并打印特定的行。 ```php $stm = $pdo->prepare("SELECT * FROM countries WHERE id = :id"); $stm->bindParam(":id", $id, PDO::PARAM_INT); $stm->execute(); ``` 這次我們使用命名占位符(`:id`)和`bindParam()`。 ## PHP PDO 最后插入的行 ID PDO `lastInsertId()`方法返回最后插入的行 ID。 `create_table.php` ```php <?php $dsn = "mysql:host=localhost;dbname=mydb"; $user = "user12"; $passwd = "12user"; $pdo = new PDO($dsn, $user, $passwd); $sql = "CREATE TABLE words(id INT PRIMARY KEY AUTO_INCREMENT, word VARCHAR(255))"; $ret = $pdo->exec($sql); $pdo->exec("INSERT INTO words(word) VALUES ('pen')"); $pdo->exec("INSERT INTO words(word) VALUES ('bum')"); $pdo->exec("INSERT INTO words(word) VALUES ('hum')"); $pdo->exec("INSERT INTO words(word) VALUES ('den')"); $rowid = $pdo->lastInsertId(); echo "The last inserted row id is: $rowid\n"; ``` 在示例中,我們創建一個新表。 創建表后,我們用`lastInsertId()`找出最后插入的 ID。 ```php $ php create_table.php The last inserted row id is: 4 ``` This is the output. ```php mysql> select * from words; +----+------+ | id | word | +----+------+ | 1 | pen | | 2 | bum | | 3 | hum | | 4 | den | +----+------+ 4 rows in set (0.01 sec) ``` 我們驗證數據。 ## PHP PDO 事務 事務是針對一個或多個數據庫中數據的數據庫操作的基本單位。 事務中所有 SQL 語句的影響可以全部提交給數據庫,也可以全部回滾。 PDO `beginTransaction()`啟動新事務。 PDO `commit()`提交事務。 PDO `rollback()`將回滾事務。 `transaction.php` ```php <?php $dsn = "mysql:host=localhost;dbname=mydb"; $user = "user12"; $passwd = "12user"; $pdo = new PDO($dsn, $user, $passwd); try { $pdo->beginTransaction(); $stm = $pdo->exec("INSERT INTO countries(name, population) VALUES ('Iraq', 38274000)"); $stm = $pdo->exec("INSERT INTO countries(name, population) VALUES ('Uganda', 37673800)"); $pdo->commit(); } catch(Exception $e) { $pdo->rollback(); throw $e; } ``` 在示例中,我們將兩個新的國家/地區添加到數據庫表中。 將`insert`語句放置在事務中:要么執行兩個插入,要么都不執行。 ```php } catch(Exception $e) { $pdo->rollback(); throw $e; } ``` 如果發生異常,我們回滾事務:沒有數據寫入數據庫。 我們拋出異常,以便異常處理繼續按常規方式進行。 ## PHP PDO 獲取元數據 元數據是有關數據庫中數據的信息。 元數據包含有關我們存儲數據的表和列的信息。 SQL 語句影響的行數是元數據。 結果集中返回的行數和列數也是元數據。 `column_count.php` ```php <?php $dsn = "mysql:host=localhost;dbname=mydb"; $user = "user12"; $passwd = "12user"; $pdo = new PDO($dsn, $user, $passwd); $stm = $pdo->query("SELECT name, population FROM countries WHERE id=1"); $ncols = $stm->columnCount(); echo "The result set contains $ncols columns\n"; ``` 在示例中,我們使用`columnCount()`方法打印結果集中的列數。 `getAttribute()`方法檢索數據庫連接屬性。 `connection_attributes.php` ```php <?php $dsn = "mysql:host=localhost;dbname=mydb"; $user = "user12"; $passwd = "12user"; $pdo = new PDO($dsn, $user, $passwd); $driver = $pdo->getAttribute(PDO::ATTR_DRIVER_NAME); $server_version = $pdo->getAttribute(PDO::ATTR_SERVER_VERSION); $autocommit_mode = $pdo->getAttribute(PDO::ATTR_AUTOCOMMIT); echo "Driver: $driver\n"; echo "Server version: $server_version\n"; echo "Autocommit mode: $autocommit_mode\n"; ``` 在示例中,我們使用`getAttribute()`方法獲取驅動程序名稱,服務器版本和自動提交模式。 ```php $ php connection_attributes.php Driver: mysql Server version: 5.7.22-0ubuntu0.16.04.1 Autocommit mode: 1 ``` 這是一個示例輸出。 在以下示例中,我們打印列元數據。 列元數據通過`getColumnMeta()`方法檢索。 `column_metadata.php` ```php <?php $dsn = "mysql:host=localhost;dbname=mydb"; $user = "user12"; $passwd = "12user"; $pdo = new PDO($dsn, $user, $passwd); $stm = $pdo->query("SELECT * FROM countries WHERE id=1"); $col_meta = $stm->getColumnMeta(0); echo "Table name: {$col_meta["table"]}\n"; echo "Column name: {$col_meta["name"]}\n"; echo "Column length: {$col_meta["len"]}\n"; echo "Column flags: {$col_meta["flags"][0]} {$col_meta["flags"][1]} \n"; ``` 在示例中,我們獲取列表,名稱,長度和標志。 ```php $ php column_metadata.php Table name: countries Column name: id Column length: 20 Column flags: not_null primary_key ``` This is a sample output. 您可能也對以下相關教程感興趣: [PHP SQLite3 教程](/php/sqlite3/), [CakePHP 數據庫教程](/php/cakephpdatabase/), [Doctrine `QueryBuilder`教程](/doctrine/querybuilder/), [PHP 文件系統函數](/articles/phpfilesystemfunctions/) , [Twig 教程](/php/twig/), [PHP Faker 教程](/php/faker/), [PHP 教程](/lang/php/)或列出[所有 PHP 教程](/all/#php)。 在本教程中,我們使用 PHP PDO 處理 MySQL 數據庫。
                  <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>

                              哎呀哎呀视频在线观看