PHP 入门 - 8.数据库
文章目錄
- 訪問數據庫
- PDO ( PHP 數據對象)
- 連接
- 數據庫交互
- 預處理語句
- 事務
- MySQLi
- 連接
- 數據庫交互
- 文件操作
- NoSQL
訪問數據庫
在 PHP 中訪問數據有兩種方法:
- 使用數據庫特定的拓展
- 使用不受數據庫約束的 PDO ( PHP 數據對象)庫
如果使用數據庫特定的擴展,你的代碼會和你所使用的數據庫密切相關。也就是說你先把數據庫從 MySQL 遷移到 PostgreSQL ,會引起代碼的重大改動。而 PDO ,用一個抽象層為你隱藏了數據庫特定的函數,因此在數據庫系統間進行遷移,改變程序或 php.ini 文件中的一行代碼這么簡單。但是這種可移植性也是有代價的。使用 PDO 的代碼會比使用原生數據庫特定擴展的代碼在執行速度上慢一點。
需要注意的是,抽象層并不能保證你的 SQL 語句是真正可移植的。如果你的應用使用了任何非泛型的 SQL ,那么在數據庫遷移時你不得不對 SQL 語句進行重大改造。
PDO ( PHP 數據對象)
連接
$db = new PDO($dsn, $username, $password);$db = new PDO("mysql:host=localhost;bdname=text", "username", "password");數據庫交互
使用 query() 函數
$db = new PDO("mysql:host=localhost;dbname=laravelblog", 'root', 'root');$result = $db->query("select * from users");foreach($result as $row){print_r($row); }$result = null; // 釋放結果集對象預處理語句
先使用預處理函數 prepare() ,在運行執行函數 execute() 。
$db = new PDO("mysql:host=localhost;dbname=laravelblog", 'root', 'root');$result = $db->prepare("select * from users"); $result->execute();while ($row = $result->fetch()) {print_r($row); }$result = null; // 釋放結果集對象利用占位符來進行重復插入
$db = new PDO("mysql:host=localhost;dbname=laravelblog", 'root', 'root');$statement = $db->prepare("insert into posts (title, body) values (:title, :body)"); $statement->execute(['title' => 'What is PHP?','body' => 'best language' ]);$db = null;也可以使用位置占位符(不命名),用 ? 標志。
$db = new PDO("mysql:host=localhost;dbname=laravelblog", 'root', 'root');$statement = $db->prepare("insert into posts (title, body) values (?, ?)"); $statement->execute(['What is PHP?', 'best language']);$db = null;事務
使用函數 beginTransaction() 開始事務, commit() 提交事務, rollback() 取消事務。
try {$db = new PDO("mysql:host=localhost;dbname=laravelblog", 'root', 'root');echo "Connected\n"; } catch (Exception $e) {die("Unable to connect: " . $e->getMessage()); }try { $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);$dbh->beginTransaction();$dbh->exec("insert into staff (id, first, last) values (23, 'Joe', 'Bloggs')");$dbh->exec("insert into salarychange (id, amount, changedate) values (23, 50000, NOW())");$dbh->commit();} catch (Exception $e) {$dbh->rollBack();echo "Failed: " . $e->getMessage(); }MySQLi
MySQLi , MySQL 改進擴展( MySQL Improved )。
連接
$db = new mysqli(host, user, password, databaseName);$db = new mysqli("localhost", "root", "root", "laravelblog");數據庫交互
$db = new mysqli("localhost", "root", "root", "laravelblog");$sql = "select * from users"; $result = $db->query($sql);while ($row = $result->fetch_assoc()) {print_r($row); }$result->close(); $db->close();文件操作
當我們不想使用數據庫時,我們可以用文件代替它。但是功能有限。
首先我們來看一下 PHP 文件管理常用函數
| mkdir() | 用來在服務器上創建目錄 |
| file_exits() | 用來檢測指定位置的文件或目錄是否存在 |
| fopen() | 用來打開存在的文件用來讀或寫 |
| fread() | 用來讀取文件內容到一個 PHP 使用的變量 |
| flock() | 用來獲得文件的獨占寫鎖 |
| fwrite() | 用來將變量中的內容寫入到文件中 |
| filesize() | 當讀取文件時,這個用來檢測一次需要讀取的字節數 |
| fclose() | 用來當文件的實用性已經過去時,關閉文件 |
fopen() 中的參數
| r | 只讀方式打開,將文件指針指向文件頭 |
| r+ | 讀寫方式打開,將文件指針指向文件頭 |
| w | 寫入方式打開,將文件指針指向文件頭并將文件大小截為零,如果文件不存在則嘗試創建之 |
| w+ | 讀寫方式打開,將文件指針指向文件頭并將文件大小截為零,如果文件不存在則嘗試創建之 |
| a | 寫入方式打開,將文件指針指向文件末尾進行寫入,如果文件不存在則嘗試創建之 |
| a+ | 讀寫方式打開,通過將文件指針指向文件末尾進行寫入來保存文件內容 |
| x | 創建一個新的文件并以寫入方式打開,如果文件已存在則返回 FALSE 和一個錯誤 |
| x+ | 建一個新的文件并以讀寫方式打開,如果文件已存在則返回 FALSE 和一個錯誤 |
下面我會利用 PHP 的文件操作來創建一個動態頁面。類似一個問卷調查的形式。
首先要通過唯一標識來區別用戶,這里我們假定個人郵箱是唯一的(這樣并不安全)。我們一旦獲取用戶的電子郵件地址,需要把信息存在在一個對每個訪問者不同的位置。為此,我們為每個訪問者在服務器上創建目錄文件夾。
<?php session_start();if (!empty($_POST['posted']) && !empty($_POST['email'])) {$folder = "surveys/" . strtolower($_POST['email']);//向會話發送路徑消息$_SESSION['folder'] = $folder;if (!file_exists($folder)) {//創建目錄并添加文件mkdir($folder, 0777, true);}header("Location: 08_6.php"); } else { ?><!DOCTYPE html><head><title>Files & folders - On-line Survey</title></head><body bgcolor="white" text="black"><h2>Survey Form</h2><p>Please enter your e-mail address to start recording your comments</p><form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="POST"><input type="hidden" name="posted" value="1"><p>Email address: <input type="text" name="email" size="45" /><br /><input type="submit" value="Submit" name="submit"></p></form></body></html> <?php } ?>向通過電子郵箱創建目錄,進而進行問卷調查。
<?php session_start(); $folder = $_SESSION['folder']; $filename = $folder . "/question.txt";$file_handle = fopen($filename, "a+"); //向判斷文件中是否有數據 if (filesize($filename) > 0) {//獲取文件中已存在的任何文本$comments = fread($file_handle, filesize($filename)); } else {$comments = ''; } fclose($file_handle); if (!empty($_POST['posted'])) {//首次訪問創建文件,然后存儲 $_POST['question']中的文本$question = $_POST['question'];$file_handle = fopen($filename, "w+");if (flock($file_handle, LOCK_EX)) {if (fwrite($file_handle, $question) == false) {echo "Cannot write to file {$filename}";}flock($file_handle, LOCK_UN);}fclose($file_handle);header("Location: thank_your.php"); } else { ?><!DOCTYPE html><head><title>Files & folders - On-line Survey</title></head><body><table border="0"><tr><td>Please enter your response to the following survey question:</td></tr><tr bgcolor="red"><td>What is your opinion on the state of the world economy><br />Can you help us fix it ?</td></tr><tr><td><form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST"><input type="hidden" name="posted" value="1"> <br /><textarea name="question" cols="35" rows="12"><?php echo $comments ?></textarea><input type="submit" name="submit" value="Submit"></form></td></tr></table></body></html> <?php } ?>調查開始,通過表單來提交到 PHP ,進而創建相應文件。如果文件中存在數據,則打印到對應的 <textarea> 中。這里還可以繼續往后面寫問卷調查,要注意的是一對一,也就是一個問題一個文件。
在提交表單這里,使用了獨占鎖,則保證當操作它時,沒有其他進程范圍這個文件。這里最后我重定向到了感謝頁面,表示調查的結束。
NoSQL
NoSQL , Not Only SQL 。 這里重點介紹 MongoDB 。
在 PHP 7+ 中, MongoDB 與之前的不太一樣,首先要去 這個網站 下載 MongoDB 的擴展。對應的就是 php_mongodb.dll 。下載到的是一個壓縮包,解壓之后,將里面的 php_mongodb.dll 文件放入你的 PHP 目錄下的 ext 文件中。最后在 php.ini 文件中寫下 extension=php_mongodb.dll 重啟服務器就行了。
這里演示一下插入數據(要保證 MongoDB 在運行中):
$bulk = new MongoDB\Driver\BulkWrite; $author1 = ['authorid' => 1, 'name' => 'J.R.R. Tolkien']; $bulk->insert($author1); $author2 = ['authorid' => 2, 'name' => 'Alex Haley']; $bulk->insert($author2); $author3 = ['authorid' => 3, 'name' => 'Tom Clancy']; $bulk->insert($author3); $author4 = ['authorid' => 4, 'name' => 'Isaac Asimov']; $bulk->insert($author4);$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017"); $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000); $result = $manager->executeBulkWrite('test.authors', $bulk, $writeConcern);更多的操作可以看這篇文章:php7的mongodb基本用法
感謝你看到了這里。如果文章有錯誤,請評論指正,謝謝!
總結
以上是生活随笔為你收集整理的PHP 入门 - 8.数据库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP 入门 - 7.Web技术
- 下一篇: PHP 入门 - 9.安全