欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP使用PDO、mysqli擴(kuò)展實(shí)現(xiàn)與數(shù)據(jù)庫(kù)交互操作詳解

 更新時(shí)間:2019年07月20日 07:45:10   作者:Sams-ara  
這篇文章主要介紹了PHP使用PDO、mysqli擴(kuò)展實(shí)現(xiàn)與數(shù)據(jù)庫(kù)交互操作,結(jié)合實(shí)例形式分析了PHP基于pdo和mysqli操作數(shù)據(jù)的相關(guān)使用技巧,需要的朋友可以參考下

本文實(shí)例講述了PHP使用PDO、mysqli擴(kuò)展實(shí)現(xiàn)與數(shù)據(jù)庫(kù)交互操作。分享給大家供大家參考,具體如下:

數(shù)據(jù)庫(kù)

在我們開(kāi)發(fā)php時(shí),可能有人已經(jīng)學(xué)習(xí)了php數(shù)據(jù)庫(kù)的連接交互,也可能正準(zhǔn)備學(xué)習(xí)。如今,按照php的發(fā)展趨勢(shì),mysql擴(kuò)展已經(jīng)停止開(kāi)發(fā),在以后的發(fā)展中可能被淘汰,如mysql->query(),mysql->connect()等以后可能就無(wú)法使用。所以我們要盡量使用PDO和mysqli擴(kuò)展。

PDO

基本操作如下:

<?php
// PDO + MySQL
$servername = "localhost";
$username = "username";
$password = "password";
try{
  $pdo = new PDO('mysql:host=$servername;dbname=myDB', '$username',
   '$password');
  echo '連接成功';
}
catch(PDOExcepton $e){
  echo $e->getMessge();
}
$statement = $pdo->query("SELECT some_field FROM some_table");
$row = $statement->fetch(PDO::FETCH_ASSOC);
echo htmlentities($row['some_field']);
// PDO + SQLite
$pdo = new PDO('sqlite:/path/db/foo.sqlite');
$statement = $pdo->query("SELECT some_field FROM some_table");
$row = $statement->fetch(PDO::FETCH_ASSOC);
echo htmlentities($row['some_field']);
//關(guān)閉連接
$pdo=null;

PDO 并不會(huì)對(duì) SQL 請(qǐng)求進(jìn)行轉(zhuǎn)換或者模擬實(shí)現(xiàn)并不存在的功能特性;它只是單純地使用相同的 API 連接不同種類的數(shù)據(jù)庫(kù)。

更重要的是,PDO 使你能夠安全的插入外部輸入(例如 ID)到你的 SQL 請(qǐng)求中而不必?fù)?dān)心 SQL 注入的問(wèn)題。這可以通過(guò)使用 PDO 語(yǔ)句和限定參數(shù)來(lái)實(shí)現(xiàn)。

我們來(lái)假設(shè)一個(gè) PHP 腳本接收一個(gè)數(shù)字 ID 作為一個(gè)請(qǐng)求參數(shù)。這個(gè) ID 應(yīng)該被用來(lái)從數(shù)據(jù)庫(kù)中取出一條用戶記錄。下面是一個(gè)錯(cuò)誤的做法:

<?php
$pdo = new PDO('sqlite:/path/db/users.db');
$pdo->query("SELECT name FROM users WHERE id = " . $_GET['id']); // <-- NO!

這是一段糟糕的代碼。你正在插入一個(gè)原始的請(qǐng)求參數(shù)到 SQL 請(qǐng)求中。這將讓被黑客輕松地利用[SQL 注入]方式進(jìn)行攻擊。想一下如果黑客將一個(gè)構(gòu)造的 id 參數(shù)通過(guò)像 http://domain.com/?id=1%3BDELETE+FROM+users 這樣的 URL 傳入。這將會(huì)使 $_GET[‘id'] 變量的值被設(shè)為 1;DELETE FROM users 然后被執(zhí)行從而刪除所有的 user 記錄!因此,你應(yīng)該使用 PDO 限制參數(shù)來(lái)過(guò)濾 ID 輸入。

<?php
$pdo = new PDO('sqlite:/path/db/users.db');
$stmt = $pdo->prepare('SELECT name FROM users WHERE id = :id');
$id = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT); // <-- 首先過(guò)濾您的數(shù)據(jù) ,對(duì)于INSERT,UPDATE等特別重要
$stmt->bindParam(':id', $id, PDO::PARAM_INT); // <-- 通過(guò)PDO自動(dòng)對(duì)SQL進(jìn)行清理
$stmt->execute();

這是正確的代碼。它在一條 PDO 語(yǔ)句中使用了一個(gè)限制參數(shù)。這將對(duì)外部 ID 輸入在發(fā)送給數(shù)據(jù)庫(kù)之前進(jìn)行轉(zhuǎn)義來(lái)防止?jié)撛诘?SQL 注入攻擊。

對(duì)于寫(xiě)入操作,例如 INSERT 或者 UPDATE,進(jìn)行數(shù)據(jù)過(guò)濾并對(duì)其他內(nèi)容進(jìn)行清理(去除 HTML 標(biāo)簽,Javascript 等等)是尤其重要的。PDO 只會(huì)為 SQL 進(jìn)行清理,并不會(huì)為你的應(yīng)用做任何處理。

mysqli擴(kuò)展

mysqli基本操作如下:

<?php
$servername = "localhost";
$username = "username";
$password = "password";
// 創(chuàng)建連接
$conn = new mysqli($servername, $username, $password);
// 檢測(cè)連接
if ($conn->connect_error) {
  die("連接失敗: " . $conn->connect_error);
} 
echo "連接成功";
?>

注意在以上面向?qū)ο蟮膶?shí)例中 $connect_error 是在 PHP 5.2.9 和 5.3.0 中添加的。如果你需要兼容更早版本 請(qǐng)使用以下代碼替換:

// 檢測(cè)連接
if (mysqli_connect_error()) {
  die("數(shù)據(jù)庫(kù)連接失敗: " . mysqli_connect_error());
}

數(shù)據(jù)庫(kù)交互

<ul>
<?php
foreach ($db->query('SELECT * FROM table') as $row) {
  echo "<li>".$row['field1']." - ".$row['field1']."</li>";
}
?>
</ul>

這從很多方面來(lái)看都是錯(cuò)誤的做法,主要是由于它不易閱讀又難以測(cè)試和調(diào)試。而且如果你不加以限制的話,它會(huì)輸出非常多的字段。

其實(shí)還有許多不同的解決方案來(lái)完成這項(xiàng)工作 — 取決于你傾向于 面向?qū)ο缶幊蹋∣OP)還是函數(shù)式編程 — 但必須有一些分離的元素。

來(lái)看一下最基本的做法:

<?php
function getAllFoos($db) {
  return $db->query('SELECT * FROM table');
}
foreach (getAllFoos($db) as $row) {
  echo "<li>".$row['field1']." - ".$row['field1']."</li>"; 
}

這是一個(gè)不錯(cuò)的開(kāi)頭。將這兩個(gè)元素放入了兩個(gè)不同的文件于是你得到了一些干凈的分離。
創(chuàng)建一個(gè)類來(lái)放置上面的函數(shù),你就得到了一個(gè)「Model」。創(chuàng)建一個(gè)簡(jiǎn)單的.php文件來(lái)存放表示邏輯,你就得到了一個(gè)「View」。這已經(jīng)很接近 MVC — 一個(gè)大多數(shù)框架常用的面向?qū)ο蟮募軜?gòu)。

//foo.php

<?php
$db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8', 'username', 'password');
// 使模板可見(jiàn)
include 'models/FooModel.php';
// 實(shí)例化類
$fooModel = new FooModel($db);
// Get the list of Foos
$fooList = $fooModel->getAllFoos();
// 顯示視圖
include 'views/foo-list.php';

//models/FooModel.php

<?php
class FooModel
{
  protected $db;
  public function __construct(PDO $db)
  {
    $this->db = $db;
  }
  public function getAllFoos() {
    return $this->db->query('SELECT * FROM table');
  }
}

//views/foo-list.php

<?php foreach ($fooList as $row): ?>
  <?= $row['field1'] ?> - <?= $row['field1'] ?>
<?php endforeach ?>

許多框架都提供了自己的數(shù)據(jù)庫(kù)抽象層,其中一些是設(shè)計(jì)在 PDO 的上層的。這些抽象層通常將你的請(qǐng)求在 PHP 方法中包裝起來(lái),通過(guò)模擬的方式來(lái)使你的數(shù)據(jù)庫(kù)擁有一些之前不支持的功能。這種抽象是真正的數(shù)據(jù)庫(kù)抽象,而不單單只是 PDO 提供的數(shù)據(jù)庫(kù)連接抽象。這類抽象的確會(huì)增加一定程度的性能開(kāi)銷,但如果你正在設(shè)計(jì)的應(yīng)用程序需要同時(shí)使用 MySQL,PostgreSQL 和 SQLite 時(shí),一點(diǎn)點(diǎn)的額外性能開(kāi)銷對(duì)于代碼整潔度的提高來(lái)說(shuō)還是很值得的。

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《PHP基于pdo操作數(shù)據(jù)庫(kù)技巧總結(jié)》、《php+mysqli數(shù)據(jù)庫(kù)程序設(shè)計(jì)技巧總結(jié)》、《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫(kù)操作入門教程》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總

希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • 解析PHP中的正則表達(dá)式以及模式匹配

    解析PHP中的正則表達(dá)式以及模式匹配

    本篇文章是對(duì)PHP中的正則表達(dá)式及模式匹配進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • 詳解thinkphp的Auth類認(rèn)證

    詳解thinkphp的Auth類認(rèn)證

    Auth類已經(jīng)在ThinkPHP代碼倉(cāng)庫(kù)中存在很久了,但是因?yàn)橐恢睕](méi)有出過(guò)它的教程,很少人知道它,它其實(shí)比RBAC更方便。本文帶著大家來(lái)詳細(xì)了解它。
    2021-05-05
  • php cookie的操作實(shí)現(xiàn)代碼(登錄)

    php cookie的操作實(shí)現(xiàn)代碼(登錄)

    cookie 常用于識(shí)別用戶。cookie 是服務(wù)器留在用戶計(jì)算機(jī)中的小文件。每當(dāng)相同的計(jì)算機(jī)通過(guò)瀏覽器請(qǐng)求頁(yè)面時(shí),它同時(shí)會(huì)發(fā)送 cookie。通過(guò) PHP,您能夠創(chuàng)建并取回 cookie 的值。
    2010-12-12
  • PHP模擬登陸163郵箱發(fā)郵件及獲取通訊錄列表的方法

    PHP模擬登陸163郵箱發(fā)郵件及獲取通訊錄列表的方法

    這篇文章主要介紹了PHP模擬登陸163郵箱發(fā)郵件及獲取通訊錄列表的方法,實(shí)例分析了php實(shí)用curl模擬登陸163郵箱的操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • 詳解PHP 二維數(shù)組排序保持鍵名不變

    詳解PHP 二維數(shù)組排序保持鍵名不變

    這篇文章主要介紹了如何保持PHP 二維數(shù)組排序鍵名不變,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • php通用防注入程序 推薦

    php通用防注入程序 推薦

    今天做完了整個(gè)php項(xiàng)目,想來(lái)安全問(wèn)題不少,開(kāi)發(fā)程序的過(guò)程中無(wú)心過(guò)濾參數(shù)。所以注入少不了,才有了下面的防注入程序.
    2011-02-02
  • PHP并發(fā)多進(jìn)程處理利器Gearman使用介紹

    PHP并發(fā)多進(jìn)程處理利器Gearman使用介紹

    這篇文章主要介紹了PHP并發(fā)多進(jìn)程處理利器Gearman使用介紹,需要的朋友可以參考下
    2016-05-05
  • PHP 冒泡排序 二分查找 順序查找 二維數(shù)組排序算法函數(shù)的詳解

    PHP 冒泡排序 二分查找 順序查找 二維數(shù)組排序算法函數(shù)的詳解

    本篇文章是對(duì)PHP 冒泡排序 二分查找 順序查找 二維數(shù)組排序算法函數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • 詳解php中curl返回false的解決辦法

    詳解php中curl返回false的解決辦法

    這篇文章主要介紹了php中curl返回false的解決辦法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • PHP中extract()函數(shù)的定義和用法

    PHP中extract()函數(shù)的定義和用法

    PHP extract() 函數(shù)從數(shù)組中把變量導(dǎo)入到當(dāng)前的符號(hào)表中
    2012-08-08

最新評(píng)論