国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

PDO與MySQLi:PHP數據庫API之戰(zhàn)

2020-03-22 19:48:35
字體:
來源:轉載
供稿:網友

介紹

使用mysql_擴展的日子已經過去了,因為自PHP 5.5以來它的方法已被棄用,并且從PHP 7開始被刪除。但是互聯網上仍然充斥著大量的舊教程,初學者只需復制/粘貼并在共享主機平臺上使用舊版本的PHP即可。

如果你在PHP中使用html' target='_blank'>MySQL或MariaDB,那么你現在可以選擇MySQLi或PDO。前者只是一個改進版本,支持過程化和OOP,并添加了預處理語句,而后者是一個抽象層,允許你為它支持的所有12個數據庫驅動程序使用統一的API。盡管MySQL是PHP世界中最流行的數據庫。

理論上,我們不需要為存在的每種數據庫類型都提供特定于供應商的API,因為只使用一種數據庫要簡單得多。雖然對此肯定有很多道理,但問題是PDO_MYSQL并沒有MySQLi所具有的所有最新和最先進的特性。老實說,我不明白為什么會這樣,因為這將完全消除使用特定于供應商的API的任何理由。盡管如此,我想大多數人并不需要這些額外的功能,但肯定有一些人需要。

PDO的優(yōu)勢

1.有用的獲取方式

2.允許直接將變量和值傳遞給execute

3.能夠自動檢測變量類型(實際發(fā)生的情況是,發(fā)送到服務器時,所有內容都被視為字符串,但被轉換為正確的類型。這在預處理語句中100%有效,但在某些邊緣情況下無效,比如在模擬模式中。)

4.提供一個選項,使用預處理語句自動緩沖結果

5.命名參數(盡管在PDO中關閉模擬模式是無用的,因為你只能使用相同的名稱一次)

MySQLi優(yōu)勢

1.異步查詢

2.獲取有關受影響行的更多信息的能力,比如更新具有相同值的行(可以在PDO中作為構造函數設置完成,以后無法更改)

3.正確的數據庫關閉方法

4.一次多個查詢(如果在PDO中打開模擬模式,則可以)

5.使用持久連接自動清除

代碼的差異

PDO和MySQLi非常相似,但是在語法上略有不同。MySQLi遵循舊式的PHP snake_case約定,而PDO使用camelCase。此外,MySQLi的方法被用作對象屬性,而PDO對函數使用傳統語法。

PDO和MySQLi都要求你使用兩個單獨的方法來使用預處理語句,從而使事情變得復雜。不過PDO消除了使用專用綁定函數的需要。

例如,在特定于供應商的PostgreSQL API中,你可以這樣做。

下面是一個示例,演示如何執(zhí)行一個“non-prepared”查詢來獲取一個包含MySQLi和PDO的關聯數組,以供參考。

$arr = $mysqli- query( SELECT * FROM myTable )- fetch_all(MYSQLI_ASSOC);
$arr = $pdo- query( SELECT * FROM myTable )- fetchAll(PDO::FETCH_ASSOC);

實際上,最好的方法是使用包裝器、查詢生成器或ORM。雖然PDO可以直接將值綁定到execute中,但它仍然不是理想的。在我創(chuàng)建的類中,你可以鏈接所有調用,同時傳入值作為參數參數綁定。

$arr = $mysqli- query( SELECT * FROM myTable WHERE id ? , [12])- fetchAll( assoc 

現在,在變量中以更簡潔的方式存儲了整個關聯數組。

創(chuàng)建一個新的數據庫連接

PDO

$dsn = mysql:host=localhost;dbname=myDatabase;charset=utf8mb4 $options = [ PDO::ATTR_EMULATE_PREPARES = false, // turn off emulation mode for real prepared statements PDO::ATTR_ERRMODE = PDO::ERRMODE_EXCEPTION, //turn on errors in the form of exceptions PDO::ATTR_DEFAULT_FETCH_MODE = PDO::FETCH_ASSOC, //make the default fetch be an associative array];try { $pdo = new PDO($dsn, username , password , $options);} catch (Exception $e) { error_log($e- getMessage()); exit( Something weird happened //something a user can understand}

MySQLi

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);try { $mysqli = new mysqli( localhost , username , password , databaseName  $mysqli- set_charset( utf8mb4 } catch(Exception $e) { error_log($e- getMessage()); exit( Error connecting to database //Should be a message a typical user could understand}

插入、更新、刪除

PDO

$stmt = $pdo- prepare( INSERT INTO myTable (name, age) VALUES (?, ?) $stmt- execute([$_POST[ name ], 29]);$stmt = null;

MySQLi

$stmt = $mysqli- prepare( UPDATE myTable SET name = ? WHERE id = ? $stmt- bind_param( si , $_POST[ name ], $_SESSION[ id $stmt- execute();$stmt- close();

注意,使用PDO可以將prepare()和execute()鏈接起來。

獲取受影響的行數

PDO

$stmt- rowCount();

MySQLi

$stmt- affected_rows;

插入最新的主鍵

注意,這兩種方法都使用connection變量,而不是$stmt。

PDO

$pdo- lastInsertId();

MySQLi

$mysqli- insert_id;

得到匹配的行

PDO

在PDO中,實現這一點的唯一方法是將其設置為一個連接選項,以更改rowCount()的行為。這意味著rowCount()將為整個數據庫連接返回匹配的行或更改的行,但不能同時返回兩者。

$options = [ PDO::MYSQL_ATTR_FOUND_ROWS = true];

MySQLi

$mysqli- info;

這將輸出整個字符串的信息,如:

Rows matched: 1 Changed: 0 Warnings: 0

可以這樣做

preg_match_all( /(/S[^:]+): (/d+)/ , $mysqli- info, $matches); $infoArr = array_combine ($matches[1], $matches[2]);var_export($infoArr);

現在可以很容易地訪問這些值。注意,該值是一個字符串,因此你可以將所有值轉換為int,===可以使用,也可以嚴格檢查==。

[ Rows matched = 1 , Changed = 0 , Warnings = 0 ]

抓取

獲取關聯數組

PDO

$stmt = $pdo- prepare( SELECT * FROM myTable WHERE id = ? $stmt- execute([5]);$arr = $stmt- fetchAll(PDO::FETCH_ASSOC);if(!$arr) exit( No rows var_export($arr);$stmt = null;

MySQLi

$stmt = $mysqli- prepare( SELECT id, name, age FROM myTable WHERE name = ? $stmt- bind_param( s , $_POST[ name $stmt- execute();$arr = $stmt- get_result()- fetch_all(MYSQLI_ASSOC);if(!$arr) exit( No rows var_export($arr);$stmt- close();

獲取單行

PDO

$stmt = $pdo- prepare( SELECT id, name, age FROM myTable WHERE name = ? $stmt- execute([$_POST[ name ]]);$arr = $stmt- fetch(PDO::FETCH_ASSOC);if(!$arr) exit( No rows var_export($arr);$stmt = null;

MySQLi

$stmt = $mysqli- prepare( SELECT id, name, age FROM myTable WHERE name = ? $stmt- bind_param( s , $_POST[ name $stmt- execute();$arr = $stmt- get_result()- fetch_assoc();if(!$arr) exit( No rows var_export($arr);$stmt- close();

獲取單個值(標量)

PDO

$stmt = $pdo- prepare( SELECT id, name, age FROM myTable WHERE name = ? $stmt- execute([$_POST[ name ]]);$arr = $stmt- fetch(PDO::FETCH_COLUMN);if(!$arr) exit( No rows var_export($arr);$stmt = null;

MySQLi

$stmt = $mysqli- prepare( SELECT id, name, age FROM myTable WHERE name = ? $stmt- bind_param( s , $_POST[ name $stmt- execute();$arr = $stmt- get_result()- fetch_row()[0];if(!$arr) exit( No rows var_export($arr);$stmt- close();

獲取對象數組

PDO

class myClass {}$stmt = $pdo- prepare( SELECT name, age, weight FROM myTable WHERE name = ? $stmt- execute([ Joe $arr = $stmt- fetchAll(PDO::FETCH_CLASS, myClass if(!$arr) exit( No rows var_export($arr);$stmt = null;

MySQLi

class myClass {}$arr = [];$stmt = $mysqli- prepare( SELECT id, name, age FROM myTable WHERE id = ? $stmt- bind_param( s , $_SESSION[ id $stmt- execute();$result = $stmt- get_result();while($row = $result- fetch_object( myClass )) { $arr[] = $row;if(!$arr) exit( No rows var_export($arr);$stmt- close();

正如你所看到的,PDO在這里非常出色。MySQLi沒有像$mysqli_result- fetch_all(MYSQLI_OBJ)這樣的東西。PDO甚至更進一步,通過使用fetchAll(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, myClass )對它進行位元化,以處理在類構造函數之后調用它的默認行為。可以在MySQLi中復制這種行為,但是它依賴于省略構造函數,和魔術方法 _set(),或者只在構造函數中設置它(如果它不等于默認值)。

PDO

$search = %{$_POST[ search ]}% $stmt = $pdo- prepare( SELECT id, name, age FROM myTable WHERE name LIKE ? $stmt- execute([$search]);$arr = $stmt- fetchAll();if(!$arr) exit( No rows var_export($arr);$stmt = null;Copy

MySQLi

$search = %{$_POST[ search ]}% $stmt = $mysqli- prepare( SELECT id, name, age FROM myTable WHERE name LIKE ? $stmt- bind_param( s , $search);$stmt- execute();$arr = $stmt- get_result()- fetch_all(MYSQLI_ASSOC);if(!$arr) exit( No rows var_export($arr);$stmt- close();

獲取模式

到目前為止,這是我最喜歡的PDO特性。PDO中的獲取模式非常有用,而MySQLi還沒有添加它們。

獲取鍵/值對

PDO

$stmt = $pdo- prepare( SELECT event_name, location FROM events WHERE id ? $stmt- execute([25]);$arr = $stmt- fetchAll(PDO::FETCH_KEY_PAIR);if(!$arr) exit( No rows var_export($arr);$stmt = null;Copy

MySQLi

$arr = [];$id = 25;$stmt = $con- prepare( SELECT event_name, location FROM events WHERE id ? $stmt- bind_param( i , $id);$stmt- execute();$result = $stmt- get_result();while($row = $result- fetch_row()) { $arr[$row[0]] = $row[1];if(!$arr) exit( No rows var_export($arr);$stmt- close();

輸出:

[ Cool Event = Seattle , Fun Event = Dallas , Boring Event = Chicago ]

獲取組列

PDO

$stmt = $pdo- prepare( SELECT hair_color, name FROM myTable WHERE id ? $stmt- execute([10]);$arr = $stmt- fetchAll(PDO::FETCH_GROUP | PDO::FETCH_COLUMN);if(!$arr) exit( No rows var_export($arr);$stmt = null;Copy

MySQLi

$arr = [];$id = 10;$stmt = $con- prepare( SELECT hair_color, name FROM myTable WHERE id ? $stmt- bind_param( i , $id);$stmt- execute();$result = $stmt- get_result();while($row = $result- fetch_row()) { $arr[$row[0]][] = $row[1];if(!$arr) exit( No rows var_export($arr);$stmt- close();Copy

輸出:

[ blonde = [ Patrick , Olivia ], brunette = [ Kyle , Ricky ], red = [ Jordan , Eric ]]

獲取鍵/值對數組

PDO

$stmt = $pdo- prepare( SELECT id, max_bench, max_squat FROM myTable WHERE weight ? $stmt- execute([200]);$arr = $stmt- fetchAll(PDO::FETCH_UNIQUE);if(!$arr) exit( No rows var_export($arr);$stmt = null;Copy

MySQLi

$arr = [];$weight = 200;$stmt = $con- prepare( SELECT id, max_bench, max_squat FROM myTable WHERE weight ? $stmt- bind_param( i , $weight);$stmt- execute();$result = $stmt- get_result();$firstColName = $result- fetch_field_direct(0)- name;while($row = $stmtResult- fetch_assoc()) { $firstColVal = $row[$firstColName]; unset($row[$firstColName]); $arr[$firstColVal] = $row;if(!$arr) exit( No rows var_export($arr);$stmt- close();Copy

輸出:

[ 17 = [ max_bench = 230, max_squat = 175], 84 = [ max_bench = 195, max_squat = 235], 136 = [ max_bench = 135, max_squat = 285]]

獲取組

PDO

$stmt = $pdo- prepare( SELECT hair_color, name, age FROM myTable WHERE id ? $stmt- execute([12]);$arr = $stmt- fetchAll(PDO::FETCH_GROUP);if(!$arr) exit( No rows var_export($arr);$stmt = null;Copy

MySQLi

$arr = [];$id = 12;$stmt = $con- prepare( SELECT hair_color, name, age FROM myTable WHERE id ? $stmt- bind_param( i , $id);$stmt- execute();$result = $stmt- get_result();$firstColName = $result- fetch_field_direct(0)- name;while($row = $stmtResult- fetch_assoc()) { $firstColVal = $row[$firstColName]; unset($row[$firstColName]); $arr[$firstColVal][] = $row;if(!$arr) exit( No rows var_export($arr);$stmt- close();Copy

輸出:

[ blonde = [ [ name = Patrick , age = 22], [ name = Olivia , age = 18] brunette = [ [ name = Kyle , age = 25], [ name = Ricky , age = 34] red = [ [ name = Jordan , age = 17], [ name = Eric , age = 52]]

在數組中的位置

PDO

$inArr = [1, 3, 5];$clause = implode( , , array_fill(0, count($inArr), ? $stmt = $pdo- prepare( SELECT * FROM myTable WHERE id IN ($clause) $stmt- execute($inArr);$resArr = $stmt- fetchAll();if(!$resArr) exit( No rows var_export($resArr);$stmt = null;Copy

MySQLi

$inArr = [12, 23, 44];$clause = implode( , , array_fill(0, count($inArr), ? /$types = str_repeat( i , count($inArr)); /$stmt = $mysqli- prepare( SELECT id, name FROM myTable WHERE id IN ($clause) $stmt- bind_param($types, ...$inArr);$stmt- execute();$resArr = $stmt- get_result()- fetch_all(MYSQLI_ASSOC);if(!$resArr) exit( No rows var_export($resArr);$stmt- close();

與其他占位符一起排列的位置

PDO

$inArr = [1, 3, 5];$clause = implode( , , array_fill(0, count($inArr), ? $stmt = $pdo- prepare( SELECT * FROM myTable WHERE id IN ($clause) AND id ? $fullArr = array_merge($inArr, [5]); $stmt- execute($fullArr);$resArr = $stmt- fetchAll();if(!$resArr) exit( No rows var_export($resArr);$stmt = null;Copy

MySQLi

$inArr = [12, 23, 44];$clause = implode( , , array_fill(0, count($inArr), ? $types = str_repeat( i , count($inArr));$types .= i //add 1 more int type$fullArr = array_merge($inArr, [26]); $stmt = $mysqli- prepare( SELECT id, name FROM myTable WHERE id IN ($clause) AND age ? $stmt- bind_param($types, ...$fullArr); $stmt- execute();$resArr = $stmt- get_result()- fetch_all(MYSQLI_ASSOC);if(!$resArr) exit( No rows var_export($resArr);$stmt- close();

交易

PDO

try { $pdo- beginTransaction(); $stmt1 = $pdo- prepare( INSERT INTO myTable (name, state) VALUES (?, ?)  $stmt2 = $pdo- prepare( UPDATE myTable SET age = ? WHERE id = ?  if(!$stmt1- execute([ Rick , NY ])) throw new Exception( Stmt 1 Failed  else if(!$stmt2- execute([27, 139])) throw new Exception( Stmt 2 Failed  $stmt1 = null; $stmt2 = null; $pdo- commit();} catch(Exception $e) { $pdo- rollback(); throw $e;}

MySQLi

try { $mysqli- autocommit(FALSE); $stmt1 = $mysqli- prepare( INSERT INTO myTable (name, age) VALUES (?, ?)  $stmt2 = $mysqli- prepare( UPDATE myTable SET name = ? WHERE id = ?  $stmt1- bind_param( si , $_POST[ name ], $_POST[ age  $stmt2- bind_param( si , $_POST[ name ], $_SESSION[ id  $stmt1- execute(); $stmt2- execute(); $stmt1- close(); $stmt2- close(); $mysqli- autocommit(TRUE);} catch(Exception $e) { $mysqli- rollback();  throw $e;}

MySQLi有一個問題,但是解決方案是使用全局處理程序將錯誤轉換為異常。

命名為Paramters

$stmt = $pdo- prepare( UPDATE myTable SET name = :name WHERE id = :id $stmt- execute([ :name = David , :id = 3]);$stmt = null;

相關推薦:《mysql教程》《PHP教程》

以上就是PDO與MySQLi:PHP數據庫API之戰(zhàn)的詳細內容,PHP教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 东乌珠穆沁旗| 鲁山县| 岳池县| 桐梓县| 琼海市| 兰州市| 东丰县| 东港市| 涪陵区| 德庆县| 亚东县| 诸城市| 吉安市| 瑞安市| 武川县| 寿宁县| 永和县| 鄂托克前旗| 石家庄市| 喀喇| 太康县| 宝坻区| 汕尾市| 琼中| 沧源| 苏州市| 武义县| 绥宁县| 湖南省| 阳江市| 牡丹江市| 清流县| 高平市| 全椒县| 孙吴县| 江永县| 班玛县| 太仆寺旗| 邹平县| 农安县| 黄浦区|