程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> php中關於mysqli和mysql差別的一些常識點剖析

php中關於mysqli和mysql差別的一些常識點剖析

編輯:MySQL綜合教程

php中關於mysqli和mysql差別的一些常識點剖析。本站提示廣大學習愛好者:(php中關於mysqli和mysql差別的一些常識點剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是php中關於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)表現改良,其履行速度更快.
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved