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() 修改它。有两种方法可以关闭它:

  1. 编辑 php.ini 文件 (如果使用的是托管服务,这种方法不可行)

  2. .htaccess 文件中添加一行:

    php_flag register_globals off
    

    (有时在托管服务中可以这样做)

原因是,如果 register_globalstrue,用户可以通过以下方式随意向你的脚本添加变量:

your_script.php?new_variable=new_value

你应该永远不要使用 $_REQUEST 超全局数组。它可以用来从以下来源检索变量:

  • $_ENV
  • $_GET
  • $_POST
  • $_COOKIE
  • $_SERVER

这是 PHP 默认的顺序(可能由 variables_order 环境变量修改)。这意味着,如果你的脚本设置了一个名为 "userid" 的服务器变量,而你试图通过 $_REQUEST 读取它,用户可以通过在查询字符串中添加一个变量来阻止这个操作。

此外,你永远不应该盲目相信 HTTP 变量的有效性。

Last modified: Friday, 17 January 2025, 7:38 PM