Home >Backend Development >PHP Tutorial >大家看php连接数据库,到底用什么方式啊解决思路

大家看php连接数据库,到底用什么方式啊解决思路

WBOY
WBOYOriginal
2016-06-13 10:07:09758browse

大家看php连接数据库,到底用什么方式啊?
http://www.44lanweb.com/lan_server/php/php_mysql_connect.aspx
里面讲的是用mysql_connect()来连接,我记得老师说过最好是用PDO还是还什么ADO连接什么的,记得不是很清楚了,请问下PHP连接数据库到底用什么连接啊?

------解决方案--------------------
最普通的就是用mysql_connect()函数来连接

pdo好像是屏蔽掉了各个数据库之间的差异,提供统一接口,貌似是

------解决方案--------------------
数据库的区别,一般php都是和mysql搭配,所以使用mysql_connect比较多,但是如果数据库是access、mssql就要考虑使用ADO或者oledb这样的链接。
以上是个人理解,仅供参考,呵呵~~
------解决方案--------------------
这种问题 最好的老师是google大叔.需要额外增加pdo的扩展支持。不过好像我是在哪看过新版本会直接支持..还是我记错了,因为我没有使用PDO所以其他更多的需要别人来补充了。

=================

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

首先,先來看一段用 PHP-MySQL 寫成的程式碼,這類的範例常用在世界各地:


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() 來解決這個問題,不過這麼一搞,整個敘述會變得複雜且醜陋,而且如果欄位多了,可以想見會是怎樣的情形…


$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 範例的寫法)兩種寫法…等等。


$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 安裝)。

[email protected]:~$ 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 安裝裝好後,就可以透過以下方式來操作資料庫:


$dsn = "mysql:host=$db_host;dbname=$db_name";
$dbh = new PDO($dsn, $db_user, $db_password);

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn