连接到旧的MySQL服务器

jcs*_*nyi 15 php mysql mysqli pdo

我知道PHP的mysql_*功能已被弃用,我不应该使用它们.

但是,我们有几个遗留的MySQL 4.0数据库,这些数据库mysqli_*PDO函数都不支持连接.继续使用最新PHP版本并仍能连接到这些数据库的最佳方法是什么?

(根据PDO介绍页面顶部的描述,我最初认为PDO可能是一个选项,但是页面下方的Changelog表明在PHP 5.4中已经删除了对4.1之前的支持)

据我所知,MySQL 4.0已有10年历史,这里的真正问题是我们仍在使用它.升级MySQL是一个单独的问题,超出了我的影响力和这个问题的范围.我可以控制的是我们使用的PHP版本 - 我不想因为我们需要连接到一些旧数据库而不得不停止升级PHP.

更新(2):

我更新了上面的问题以反映我的新理解,即使PDO也不再连接到这些旧的MySQL服务器.

我还应该澄清,我们有几个遗留应用程序访问这些数据库,我们希望尽可能少地更改这些应用程序.他们没有积极开发,并且测试涉及重写大部分代码的更改将很快成为一个相当大的QA项目.

出于这个原因,诸如重写代码或升级MySQL版本之类的侵入式解决方案极不可能是值得的.如果它们是唯一可用的解决方案,我们可能最终无所事事 - mysql_*尽可能长时间使用,然后在最新的PHP无法再连接时冻结PHP版本(至少对这些应用程序而言).

另一方面,技术上复杂的解决方案(例如从头开始编译)绝对是可能的,并且实际上更倾向于进行大量的代码更改.

我现在正在提供赏金,希望得到新答案,提供更复杂的替代方案.

Bil*_*win 11

可以使用mysql_*函数或PDO从PHP 5.4连接到MySQL 4.0.我刚刚构建了MySQL 4.0.30并使用MySQL Sandbox启动了它.然后我成功测试了下面的代码示例.

但是,您无法使用TCP/IP协议.

您只能使用unix套接字在本地访问MySQL.使用主机名'localhost'并确保您的php.ini已mysql.default_socket为您的MySQL实例正确配置.

要使用本地访问方法,必须在同一主机上安装PHP应用程序和数据库服务器.

<?php

print "PHP VERSION = " . phpversion() . "\n";

print "\nTEST DEPRECATED EXT/MYSQL:\n";
mysql_connect('localhost', 'msandbox', 'msandbox');
$result = mysql_query("SELECT VERSION() AS 'MySQL VERSION'");
while ($row = mysql_fetch_assoc($result)) {
  print_r($row);
}

print "\nTEST PDO_MYSQL:\n";
try {
  $dbh = new PDO('mysql:host=localhost', 'msandbox', 'msandbox');
  $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  $dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch(PDOException $err) {
  die($err->getMessage());
}

$stmt = $dbh->prepare("SELECT VERSION() AS 'MySQL VERSION'");
$result = $stmt->execute();
foreach ($stmt->fetchAll() as $row) {
  print_r($row);
}
Run Code Online (Sandbox Code Playgroud)

这是我系统上面脚本的输出:

PHP VERSION = 5.4.15

TEST DEPRECATED EXT/MYSQL:
Array
(
    [MySQL VERSION] => 4.0.30
)

TEST PDO_MYSQL:
Array
(
    [MySQL VERSION] => 4.0.30
)
Run Code Online (Sandbox Code Playgroud)