MySQL数据库
PHP
驱动程序
PHP 有以下官方 MySQL 驱动程序:
- mysql - 较旧,仍被许多 Web 应用程序使用;它是一个过程式 PHP 模块
- mysqli - 更快;可以作为一组类使用,也可以作为普通过程式库使用
- PDO(PHP 数据对象) - 使用 PDO,这是一个与数据库交互的抽象层,提供 MySQL 和 ODBC 驱动程序。
- PDO_MYSQL 支持一些 MySQL 高级功能,并在这些功能缺失时进行模拟。
上述驱动程序中的函数扩展回调了 C API 中的方法。它们可以使用 MySQL 客户端库或 mysqlnd(一个 PHP 的原生驱动程序)。
有时,启用 mysql 和 mysqli 两个驱动可能会导致一些问题,因此,如果你只使用其中之一,应该禁用另一个。
此外,PHP 还有一个 ODBC 扩展,也可以与 MySQL 配合使用。
PEAR 是一组重要的 PHP 类,支持 MySQL。
register_globals 和 $_REQUEST
PHP 有一个环境变量叫做 register_globals
。从 PHP 4.2 开始,它默认设置为 false
,你不应该修改它。在 PHP 5.3 中,这个变量也被弃用,并且在 PHP 6 中已经被移除。
然而,如果你的 PHP 版本支持 register_globals
,你可以通过调用 ini_get()
函数来检查它是否设置为 true
。如果是 true
,则无法通过 ini_set()
修改它。有两种方法可以关闭它:
-
编辑
php.ini
文件 (如果使用的是托管服务,这种方法不可行) -
在
.htaccess
文件中添加一行:php_flag register_globals off
(有时在托管服务中可以这样做)
原因是,如果 register_globals
为 true
,用户可以通过以下方式随意向你的脚本添加变量:
your_script.php?new_variable=new_value
你应该永远不要使用 $_REQUEST
超全局数组。它可以用来从以下来源检索变量:
$_ENV
$_GET
$_POST
$_COOKIE
$_SERVER
这是 PHP 默认的顺序(可能由 variables_order
环境变量修改)。这意味着,如果你的脚本设置了一个名为 "userid" 的服务器变量,而你试图通过 $_REQUEST
读取它,用户可以通过在查询字符串中添加一个变量来阻止这个操作。
此外,你永远不应该盲目相信 HTTP 变量的有效性。