POD extension is added in PHP5. This extension provides PHP built-in class PDO to access the database. Different databases use the same method name , solve the problem of inconsistent database connections.
Features of PDO:
Performance. PDO learned from the beginning about the successes and failures of scaling existing databases. Because PDO's code is brand new, we have the opportunity to redesign performance from the ground up to take advantage of PHP 5's latest features.
Ability. PDO is designed to provide common database functionality as a foundation while providing easy access to the unique features of an RDBMS.
Simple. PDO is designed to make working with databases easy for you. The API doesn't force its way into your code and makes it clear what each function call does.
Extensible at runtime. The PDO extension is modular, enabling you to load drivers for your database backend at runtime without having to recompile or reinstall the entire PHP program. For example, the PDO_OCI extension implements the oracle database API instead of the PDO extension. There are also drivers for MySQL, PostgreSQL, ODBC, and Firebird, with more in development.
PDO installation
You can check whether the PDO extension is installed through PHP’s phpinfo() function.
1. Install PDO on Unix/Linux system
On Unix or Linux you need to add the following extension:
extension=pdo.so
2. Install pdo in Windows
PDO and all major drivers are shipped with PHP as shared extensions, to activate them simply edit the php.ini file and add the following extension:
extension=php_pdo.dll
In addition, there are various database extensions corresponding to the following:
<span class="pln"><span class="pun"> ;<span class="pln">extension<span class="pun">=<span class="pln">php_pdo_firebird<span class="pun">.<span class="pln">dll <span class="pln"><span class="pun"><span class="pln"><span class="pun"><span class="pln"><span class="pun"><span class="pln"><span class="pun">;<span class="pln">extension<span class="pun">=<span class="pln">php_pdo_informix<span class="pun">.<span class="pln">dll <span class="pun">;<span class="pln">extension<span class="pun">=<span class="pln">php_pdo_mssql<span class="pun">.<span class="pln">dll <span class="pun">;<span class="pln">extension<span class="pun">=<span class="pln">php_pdo_mysql<span class="pun">.<span class="pln">dll <span class="pun">;<span class="pln">extension<span class="pun">=<span class="pln">php_pdo_oci<span class="pun">.<span class="pln">dll <span class="pun">;<span class="pln">extension<span class="pun">=<span class="pln">php_pdo_oci8<span class="pun">.<span class="pln">dll <span class="pun">;<span class="pln">extension<span class="pun">=<span class="pln">php_pdo_odbc<span class="pun">.<span class="pln">dll <span class="pun">;<span class="pln">extension<span class="pun">=<span class="pln">php_pdo_pgsql<span class="pun">.<span class="pln">dll <span class="pun">;<span class="pln">extension<span class="pun">=<span class="pln">php_pdo_sqlite<span class="pun">.<span class="pln">dll</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
Open php.ini and remove the semicolons in front of all the lines above.
After setting these configurations, we need to restart PHP or Web server.
Next we use mysql as an example to use pdo:
<?<span>php $dbms='mysql'; //数据库类型 $host='localhost'; //数据库主机名 $dbName='test'; //使用的数据库 $user='root'; //数据库连接用户名 $pass=''; //对应的密码 $dsn="$dbms:host=$host;dbname=$dbName"<span>; try<span> { $dbh = new PDO($dsn, $user, $pass); //初始化一个PDO对象 echo "连接成功<br/>"<span>; /*你还可以进行一次搜索操作 foreach ($dbh->query('SELECT * from FOO') as $row) { print_r($row); //你可以用 echo($GLOBAL); 来看到这些值 } */ $dbh = null<span>; } catch (PDOException $e<span>) { die ("Error!: " . $e->getMessage() . "<br/>"<span>); } //默认这个不是长连接,如果需要数据库长连接,需要最后加一个参数:array(PDO::ATTR_PERSISTENT => true) 变成这样: $db = new PDO($dsn, $user, $pass, array(PDO::ATTR_PERSISTENT => true<span>)); ?></span></span></span></span></span></span></span></span>
Let’s take a look at the detailed introduction of pdo:
1. Predefined constants:
PDO::PARAM_BOOL (integer) | represents the Boolean data type. |
PDO::PARAM_NULL (integer) | represents the NULL data type in SQL. |
PDO::PARAM_INT (integer) | represents an integer type in SQL. |
PDO::PARAM_STR (integer) | represents CHAR, VARCHAR or other string types in SQL. |
PDO::PARAM_LOB (integer) | represents the large object data type in SQL. |
PDO::PARAM_STMT (integer) | represents a recordset type. It is not currently supported by any driver. |
PDO::PARAM_INPUT_OUTPUT (integer) | The specified parameter is an INOUT parameter of a stored procedure. This value must be bitwise ORed with an explicit PDO::PARAM_* data type. |
PDO::FETCH_LAZY (integer) | Specify the acquisition method and return each row in the result set as an object. The variable name of this object corresponds to the column name. PDO::FETCH_LAZY creates the object variable name for access. Not valid in PDOStatement::fetchAll(). |
PDO::FETCH_ASSOC (integer) | Specify the acquisition method and return each row in the corresponding result set as an array indexed by the column name. If the result set contains multiple columns with the same name, PDO::FETCH_ASSOC returns only one value per column name. |
PDO::FETCH_NAMED (integer) | Specify the acquisition method and return each row in the corresponding result set as an array indexed by the column name. If the result set contains multiple columns with the same name, PDO::FETCH_ASSOC returns an array containing values for each column name. |
PDO::FETCH_NUM (integer) | Specify the acquisition method and return each row in the corresponding result set as an array indexed by the column number, starting from column 0. |
PDO::FETCH_BOTH (integer) | Specify the acquisition method and return each row in the corresponding result set as an array indexed by column number and column name, starting from column 0. |
PDO::FETCH_OBJ (integer) | Specify the acquisition method and return each row in the result set as an object whose attribute name corresponds to the column name. |
PDO::FETCH_BOUND (integer) | Specify the acquisition method, return TRUE and assign the column value in the result set to the PHP variable bound through the PDOStatement::bindParam() or PDOStatement::bindColumn() method. |
PDO::FETCH_COLUMN (integer) | Specify the acquisition method and return the required column from the next row in the result set. |
PDO::FETCH_CLASS (integer) | Specify the acquisition method, return a new instance of the requested class, and map the column to the corresponding attribute name in the class. Note: If the attribute does not exist in the requested class, the __set() magic method is called |
PDO::FETCH_INTO (integer) | Specify the acquisition method, update an existing instance of the requested class, and map the column to the corresponding attribute name in the class. |
PDO::FETCH_FUNC (integer) | Allows data to be processed in completely custom ways on the fly. (Only valid in PDOStatement::fetchAll()). |
PDO::FETCH_GROUP (integer) | Return grouped by value. Typically used with PDO::FETCH_COLUMN or PDO::FETCH_KEY_PAIR. |
PDO::FETCH_UNIQUE (integer) | Only take unique values. |
PDO::FETCH_KEY_PAIR (integer) | Get a result set with two columns into an array, where the first column is the key name and the second column is the value. Available since PHP 5.2.3. |
PDO::FETCH_CLASSTYPE (integer) | Determine the class name based on the value of the first column. |
PDO::FETCH_SERIALIZE (integer) | Similar to PDO::FETCH_INTO, but represents the object as a serialized string. Available since PHP 5.1.0. Starting with PHP 5.3.0, if this flag is set, the class's constructor is never called. |
PDO::FETCH_PROPS_LATE (integer) | Call the constructor before setting properties. Available since PHP 5.2.0. |
PDO::ATTR_AUTOCOMMIT (integer) | If this value is FALSE , PDO will attempt to disable autocommit in order for the database connection to start a transaction. |
PDO::ATTR_PREFETCH (integer) | Set the prefetch size to balance speed and memory usage for your application. Not all database/driver combinations support setting the prefetch size. Larger prefetch sizes result in improved performance but also consume more memory. |
PDO::ATTR_TIMEOUT (integer) | Set the timeout seconds for connecting to the database. |
PDO::ATTR_ERRMODE (integer) | See the Errors and Error Handling section for more information about this property. |
PDO::ATTR_SERVER_VERSION (integer) | This is a read-only property; returns the version information of the database service connected to PDO. |
PDO::ATTR_CLIENT_VERSION (integer) | This is a read-only property; returns the version information of the client library used by the PDO driver. |
PDO::ATTR_SERVER_INFO (integer) | This is a read-only property. Returns some meta-information about the database service to which PDO is connected. |
PDO::ATTR_CONNECTION_STATUS (integer) | |
PDO::ATTR_CASE (integer) | Use constants like PDO::CASE_* to force column names to the specified case. |
PDO::ATTR_CURSOR_NAME (integer) | Gets or sets the name of the cursor to use. Very useful when using scrollable cursors and positioned updates. |
PDO::ATTR_CURSOR (integer) | Select the cursor type. PDO currently supports PDO::CURSOR_FWDONLY and PDO::CURSOR_SCROLL. Typically PDO::CURSOR_FWDONLY unless a scrollable cursor is really needed. |
PDO::ATTR_DRIVER_NAME (string) | Returns the driver name.
Example using PDO::ATTR_DRIVER_NAME: <?php if ($db->getAttribute(PDO::ATTR_DRIVER_NAME) == 'mysql') { echo "Running on mysql; doing something mysql specific here\n"; } ?> Copy after login |
PDO::ATTR_ORACLE_NULLS (integer) | 在获取数据时将空字符串转换成 SQL 中的 NULL 。 |
PDO::ATTR_PERSISTENT (integer) | 请求一个持久连接,而非创建一个新连接。关于此属性的更多信息请参见 连接与连接管理 。 |
PDO::ATTR_STATEMENT_CLASS (integer) | |
PDO::ATTR_FETCH_CATALOG_NAMES (integer) | 将包含的目录名添加到结果集中的每个列名前面。目录名和列名由一个小数点分开(.)。此属性在驱动层面支持,所以有些驱动可能不支持此属性。 |
PDO::ATTR_FETCH_TABLE_NAMES (integer) | 将包含的表名添加到结果集中的每个列名前面。表名和列名由一个小数点分开(.)。此属性在驱动层面支持,所以有些驱动可能不支持此属性。 |
PDO::ATTR_STRINGIFY_FETCHES (integer) | |
PDO::ATTR_MAX_COLUMN_LEN (integer) | |
PDO::ATTR_DEFAULT_FETCH_MODE (integer) | 自 PHP 5.2.0 起可用。 |
PDO::ATTR_EMULATE_PREPARES (integer) | 自 PHP 5.1.3 起可用。 |
PDO::ERRMODE_SILENT (integer) | 如果发生错误,则不显示错误或异常。希望开发人员显式地检查错误。此为默认模式。关于此属性的更多信息请参见 错误与错误处理 。 |
PDO::ERRMODE_WARNING (integer) | 如果发生错误,则显示一个 PHP E_WARNING 消息。关于此属性的更多信息请参见 错误与错误处理。 |
PDO::ERRMODE_EXCEPTION (integer) | 如果发生错误,则抛出一个 PDOException 异常。关于此属性的更多信息请参见 错误与错误处理。 |
PDO::CASE_NATURAL (integer) | 保留数据库驱动返回的列名。 |
PDO::CASE_LOWER (integer) | 强制列名小写。 |
PDO::CASE_UPPER (integer) | 强制列名大写。 |
PDO::NULL_NATURAL (integer) | |
PDO::NULL_EMPTY_STRING (integer) | |
PDO::NULL_TO_STRING (integer) | |
PDO::FETCH_ORI_NEXT (integer) | 在结果集中获取下一行。仅对可滚动游标有效。 |
PDO::FETCH_ORI_PRIOR (integer) | 在结果集中获取上一行。仅对可滚动游标有效。 |
PDO::FETCH_ORI_FIRST (integer) | 在结果集中获取第一行。仅对可滚动游标有效。 |
PDO::FETCH_ORI_LAST (integer) | 在结果集中获取最后一行。仅对可滚动游标有效。 |
PDO::FETCH_ORI_ABS (integer) | 根据行号从结果集中获取需要的行。仅对可滚动游标有效。 |
PDO::FETCH_ORI_REL (integer) | 根据当前游标位置的相对位置从结果集中获取需要的行。仅对可滚动游标有效。 |
PDO::CURSOR_FWDONLY (integer) | 创建一个只进游标的 PDOStatement 对象。此为默认的游标选项,因为此游标最快且是 PHP 中最常用的数据访问模式。 |
PDO::CURSOR_SCROLL (integer) | 创建一个可滚动游标的 PDOStatement 对象。通过 PDO::FETCH_ORI_* 常量来控制结果集中获取的行。 |
PDO::ERR_NONE (string) | 对应 SQLSTATE '00000',表示 SQL 语句没有错误或警告地成功发出。当用 PDO::errorCode() 或 PDOStatement::errorCode() 来确定是否有错误发生时,此常量非常方便。在检查上述方法返回的错误状态代码时,会经常用到。 |
PDO::PARAM_EVT_ALLOC (integer) | 分配事件 |
PDO::PARAM_EVT_FREE (integer) | 解除分配事件 |
PDO::PARAM_EVT_EXEC_PRE (integer) | 执行一条预处理语句之前触发事件。 |
PDO::PARAM_EVT_EXEC_POST (integer) | 执行一条预处理语句之后触发事件。 |
PDO::PARAM_EVT_FETCH_PRE (integer) | 从一个结果集中取出一条结果之前触发事件。 |
PDO::PARAM_EVT_FETCH_POST (integer) | 从一个结果集中取出一条结果之后触发事件。 |
PDO::PARAM_EVT_NORMALIZE (integer) | 在绑定参数注册允许驱动程序正常化变量名时触发事件。 |