国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Mysql - php中關于mysqli和mysql區別的一些知識點分析

php中關于mysqli和mysql區別的一些知識點分析

2019-11-23 19:10MYSQL教程網 Mysql

看書、看視頻的時候一直沒有搞懂mysqli和mysql到底有什么區別。于是今晚“谷歌”一番,整理一下。需要的朋友可以參考下。

一: 
PHP-MySQL 是 PHP 操作 MySQL 資料庫最原始的 Extension ,PHP-MySQLi 的 i 代表 Improvement ,提更了相對進階的功能,就 Extension 而言,本身也增加了安全性。而 PDO (PHP Data Object) 則是提供了一個 Abstraction Layer 來操作資料庫,用講的其實看不出來有有什麼差別,所以就直接看程式吧… 
首先,先來看一段用 PHP-MySQL 寫成的程式碼,這類的范例常用在世界各地: 

復制代碼代碼如下:


<?php 
mysql_connect($db_host, $db_user, $db_password); 
mysql_select_db($dn_name); 
$result = mysql_query("SELECT `name` FROM `users` WHERE `location` = '$location'"); 
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) 

echo $row['name']; 

mysql_free_result($result); 
?> 


乍看之下沒什麼問題,但其實背后有些學問… 
這種方式不能 Bind Column ,以前例的 SQL 敘述來說,$location 的地方容易被 SQL Injection。后來于是發展出了 mysql_escape_string() (備注:5.3.0之后棄用) 以及 mysql_real_escape_string() 來解決這個問題,不過這麼一搞,整個敘述會變得複雜且丑陋,而且如果欄位多了,可以想見會是怎樣的情形… 

復制代碼代碼如下:


<?php 
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'", 
mysql_real_escape_string($user), 
mysql_real_escape_string($password)); 
mysql_query($query); 
?> 


在 PHP-MySQLi 中有了不少進步,除了透過 Bind Column 來解決上述問題,而且也多援 Transaction, Multi Query ,并且同時提供了 Object oriented style (下面這段 PHP-MySQLi 范例的寫法) 和 Procedural style (上面 PHP-MySQL 范例的寫法)兩種寫法…等等。 

復制代碼代碼如下:


<?php 
$mysqli = new mysqli($db_host, $db_user, $db_password, $db_name); 
$sql = "INSERT INTO `users` (id, name, gender, location) VALUES (?, ?, ?, ?)"; 
$stmt = $mysqli->prepare($sql); 
$stmt->bind_param('dsss', $source_id, $source_name, $source_gender, $source_location); 
$stmt->execute(); 
$stmt->bind_result($id, $name, $gender, $location); 
while ($stmt->fetch()) 

echo $id . $name . $gender . $location; 

$stmt->close(); 
$mysqli->close(); 
?> 


但看到這邊又發現了一些缺點,例如得 Bind Result,這個就有點多馀,不過這其實無關緊要,因為最大的問題還是在于這不是一個抽象(Abstraction)的方法,所以當后端更換資料庫的時候,就是痛苦的開始… 
于是 PDO 就出現了(備注:目前 Ubuntu 和 Debian 來說,PDO 并沒有直接的套件可以安裝,而是必須透過 PECL 安裝)。 

復制代碼代碼如下:


roga@carlisten-lx:~$ pecl search pdo 
======================================= 
Package Stable/(Latest) Local 
PDO 1.0.3 (stable) PHP Data Objects Interface. 
PDO_4D 0.3 (beta) PDO driver for 4D-SQL database 
PDO_DBLIB 1.0 (stable) FreeTDS/Sybase/MSSQL driver for PDO 
PDO_FIREBIRD 0.2 (beta) Firebird/InterBase 6 driver for PDO 
PDO_IBM 1.3.2 (stable) PDO driver for IBM databases 
PDO_INFORMIX 1.2.6 (stable) PDO driver for IBM Informix INFORMIX databases 
PDO_MYSQL 1.0.2 (stable) MySQL driver for PDO 
PDO_OCI 1.0 (stable) Oracle Call Interface driver for PDO 
PDO_ODBC 1.0.1 (stable) ODBC v3 Interface driver for PDO 
PDO_PGSQL 1.0.2 (stable) PostgreSQL driver for PDO 
PDO_SQLITE 1.0.1 (stable) SQLite v3 Interface driver for PDO 
pdo_user 0.3.0 (beta) Userspace driver for PDO 


當透過 PECL 安裝裝好后,就可以透過以下方式來操作資料庫: 

復制代碼代碼如下:


<?php 
$dsn = "mysql:host=$db_host;dbname=$db_name"; 
$dbh = new PDO($dsn, $db_user, $db_password); 
$sql = "SELECT `name`, `location` FROM `users` WHERE `location` = ? , `name` = ?"; 
$sth = $dbh->prepare($sql); 
$sth->execute(array($location, $name)); 
$result = $sth->fetch(PDO::FETCH_OBJ); 
echo $result->name . $result->location; 
$dbh = NULL; 
?> 


乍看之下,PDO 的程式碼好像也沒有比較短,那到底好處是什麼呢? 
1. PDO 連接資料庫時透過 Connection String 來決定連接何種資料庫。 
2. PDO 可以透過 PDO::setAttribute 來決定連線時的設定,像是 Persistent Connection, 回傳錯誤的方式(Exception, E_WARNING, NULL)。甚至是回傳欄位名稱的大小寫…等等。 
2. PDO 支援 Bind Column 的功能,除了基本的 Prepare, Execute 以外,也可以 Bind 單一欄位,并且指定欄位型態。 
4. PDO 是 Abstraction Layer 所以就算更換儲存媒介,需要花的功夫比起來是最少的。 
可惜的是,儘管這些東西都已經出現很久了,但還是不夠大眾化。我想或許是肇因于大家習慣看坊間的書籍學習,但那些書本往往只會介紹最簡單最傳統的方式。導致很多人還是在用 MySQL 這種方直接連資料庫。 
不過,目前來說我個人還是最喜愛透過 DBI 來連接資料庫,像是 ActiveRecord 以及 Propel ORM(Object-Relational Mapping)。 
例如說以 ActiveRecord 為例,如果要實現這樣的 SQL 敘述… 
INSERT INTO `users` (id, name, gender, location) VALUES(1, 'roga', 'male', 'tpe') 
以 PDO 來寫是: 

復制代碼代碼如下:


<?php 
$sql = "INSERT INTO `users` (id, name, gender, location) VALUES(?, ?, ?, ?)"; 
$sth = $dbh->prepare($sql); 
$sth->execute(array(1, 'roga', 'male', 'tpe')); 
?> 


但以 ActiveRecord 來說的話,則是: 

復制代碼代碼如下:


<?php 
$user = new User(); 
$user->id = 1; 
$user->name = 'roga'; 
$user->gender = 'male'; 
$user->location = 'tpe'; 
$user->save(); 
?> 


后者在語法上是不是簡潔很多呢,而且也大幅降低對 SQL 語言的依賴性!(不同資料庫對 SQL 實作的問題可參考 Comparison of different SQL implementations) 
以上是一些簡單的介紹,如有疏漏謬誤也歡迎大家補充。 



mysql是非持繼連接函數而mysqli是永遠連接函數。也就是說 
mysql每次鏈接都會打開一個連接的進程而mysqli多次運行mysqli將使用同一連接進程,從而減少了服務器的開銷 
有些朋友在編程的時候,使用new mysqli('localhost', usenamer', 'password', 'databasename');總是報 
錯,Fatal error: Class 'mysqli' not found in d:\... 
mysqli類不是php自帶的嗎? 
不是默認開啟的,win下要改php.ini,去掉php_mysqli.dll前的;,linux下要把mysqli編譯進去。 
一:Mysqli.dll是一個允許以對象的方式或者過程操作數據庫的,它的使用方式也很容易。這里就幾個常見的操作和 mysql.dll做一個對比。 
  1:mysql.dll(可以理解為函數式的方式): 

復制代碼代碼如下:


  $conn = mysql_connect('localhost', 'user', 'password'); //連接mysql數據庫 
  mysql_select_db('data_base'); //選擇數據庫 
   
  $result = mysql_query('select * from data_base');//這里有第二個可選參數,指定打開的連接 
  $row = mysql_fetch_row( $result ) ) //為了簡單,這里只取一行數據 
  echo $row[0]; //輸出第一個字段的值 


  mysqli也有過程式的方式,只不過開始貫以mysqli的前綴,其他都差不多。如果mysqli以過程式的方式操作的話, 有些函數必須指定資源,比如說 mysqli_query(資源標識,SQL語句),并且資源標識的參數是放在前面的,而 mysql_query(SQL語句,'可選')的資源標識是放在后面的,并且可以不指定,它默認是上一個打開的連接或資源。 
  2mysqli.dll(對象方式): 

復制代碼代碼如下:


  $conn = new mysqli('localhost', 'user', 'password','data_base'); 
  //這里的連接是new出來的,最后一個參數是直接指定數據庫,不用mysql_select_db()了 
  //也可以構造時候不指定,然后 $conn -> select_db('data_base') 
  $result = $conn -> query( 'select * from data_base' ); 
  $row = $result -> fetch_row(); //取一行數據 
  echo row[0]; //輸出第一個字段的值 


  二:mysql_fetch_row(),mysql_fetch_array() 
  這兩個函數,返回的都是一個數組,區別就是第一個函數返回的數組是只包含值,我們只能$row[0], 
$row[1],這樣以數組下標來讀取數據,而mysql_fetch_array()返回的數組既包含第一種,也包含鍵值 
對的形式,我們可以這樣讀取數據,(假如數據庫的字段是 username,passwd): 
  $row['username'], $row['passwd'] 
  而且,如果用($row as $kay => $value)來操作的話,還以直接取得數據庫的字段名稱。 
  更主要的是mysqli是php5提供的新函數庫,(i)表示改進,其執行速度更快.

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 91精品国产综合久久香蕉 | 亚洲三级在线 | 黄网av| 免费成年人视频在线观看 | 亚洲精品久久久久久下一站 | 久久精品亚洲精品国产欧美kt∨ | 久久99精品久久久久久水蜜桃 | 久久草视频 | 亚洲视频二区 | 欧美精品91 | 国产日韩欧美在线观看 | 玖玖精品在线 | 99久久久无码国产精品 | 国产亚洲精品美女久久久久久久久久 | 依人在线视频 | 在线日韩| 日韩精品无码一区二区三区 | 欧美一级久久 | 国产欧美精品一区二区三区四区 | 99久久婷婷国产综合精品电影 | 精品一区二区三区中文字幕老牛 | 亚洲精品字幕 | 日韩毛片视频 | 亚洲在线视频 | 中文字幕亚洲欧美日韩在线不卡 | 国产精品久久久久久久久久久久久 | 91精品国产91久久综合桃花 | 激情综合欧美 | 91 在线免费观看 | 欧美日韩国产中文 | 91精品区| 日韩电影在线看 | 欧美日韩精品一区二区三区 | 日韩成人免费电影 | 免费国产一区二区 | 久久久精品一区 | 一级二级黄色大片 | 久久爱成人 | 一区二区久久 | 久久久夜夜夜 | 亚洲欧美高清 |