本文介绍下,php中有关mysqli与mysql类的一些区别,有需要的朋友,可以作个参考哦。一,php-mysql 是 php 操作 mysql 资料库最原始的 extension ,php-mysqli 的 i 代表 improvement ,提更了相对进阶的功能。pdo (php data object) 则是提供了一个 abstraction layer 来操作资料库。例子:
这种方式不能 bind column ,以前例的 sql 叙述来说,$location 的地方容易被 sql injection。后来于是发展出了 mysql_escape_string() (备注:5.3.0之后弃用) 以及 mysql_real_escape_string()解决此问题。
例子:
在 php-mysqli 中有了不少进步,除了透过 bind column 来解决上述问题,而且也多援 transaction, multi query ,并且同时提供了 object oriented style (下面这段 php-mysqli 范例的写法) 和 procedural style (上面 php-mysql 范例的写法)两种写法等。
例子:
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 安装装好后,就可以透过以下方式来操作资料库:
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 所以就算更换储存媒介,需要花的功夫比起来是最少的。
个人比较喜欢使用dbi 来连接资料库,像是 activerecord 以及 propel orm(object-relational mapping)。 例如,以 activerecord 为例,如果要实现这样的 sql 叙述… insert into `users` (id, name, gender, location) values(1, 'roga', 'male', 'tpe') pdo的操作方式:
prepare($sql); $sth->execute(array(1, 'roga', 'male', 'tpe')); ?>
以activerecord 来说的话,则是:
id = 1; $user->name = 'roga'; $user->gender = 'male'; $user->location = 'tpe'; $user->save(); ?>
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,
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)表示改进,其执行速度更快。
以上就是php编程中mysql与mysqli的区别了,希望对大家有一定的帮助。