15

PHP のmysql_*関数は非推奨であり、使用すべきではないことを理解しています

ただし、いくつかのレガシー MySQL 4.0 データベースがあり、関数mysqli_*PDO関数も接続をサポートしていません。最新の PHP バージョンを引き続き使用し、これらのデータベースに接続できるようにするための最良の方法は何ですか?

(PDO イントロ ページの上部の説明に基づいて、最初は PDO がオプションである可能性があると考えていましたが、ページのさらに下にある変更ログは、4.1 より前のサポートが PHP 5.4 で削除されたことを示唆しています)

MySQL 4.0 が 10 年前のものであることは理解していますが、ここでの本当の問題は、まだそれを使用していることです。MySQL のアップグレードは、私の影響とこの質問の範囲外の別の問題です。私が制御できるのは、使用している PHP のバージョンです。古いデータベースに接続する必要があるという理由だけで、PHP のアップグレードを停止する必要はありません。

PDO でさえ、これらの古い MySQL サーバーには接続できなくなります。

また、これらのデータベースにアクセスするいくつかのレガシー アプリケーションがあり、これらのアプリケーションをできるだけ変更したくないことも明確にする必要があります。それらは活発に開発されておらず、コードの大部分を書き直すことを含む変更をテストすると、すぐにかなり大きな QA プロジェクトに膨らみます。

このため、コードの書き直しや MySQL のバージョンのアップグレードなどの侵襲的なソリューションは、ほとんど価値がありません。それらが利用可能な唯一の解決策である場合、おそらく何もmysql_*せず、最新の PHP が接続できなくなるとすぐに、できるだけ長く使用し、PHP バージョンを (少なくともこれらのアプリについては) フリーズすることになります。

一方、技術的に複雑な解決策 (ゼロから何かをコンパイルするなど) は間違いなく可能であり、実際には大規模なコード変更を行うよりも好まれます。

4

7 に答える 7

11

mysql_ * 関数または PDO を使用して、PHP 5.4 から MySQL 4.0 に接続できます。MySQL 4.0.30 をビルドし、MySQL Sandbox で起動しました。次に、以下のコード例を正常にテストしました。

ただし、TCP/IP プロトコルは使用できません。

Unix ソケットを使用して、MySQL にローカルでのみアクセスできます。「localhost」のホスト名を使用し、php.ini がmysql.default_socketMySQL インスタンスに対して正しく構成されていることを確認してください。

ローカル アクセス方式を使用するには、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);
}

私のシステムでの上記のスクリプトの出力は次のとおりです。

PHP VERSION = 5.4.15

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

TEST PDO_MYSQL:
Array
(
    [MySQL VERSION] => 4.0.30
)
于 2013-06-18T02:38:03.297 に答える
1

これは非常に単純な解決策かもしれません...古いMySQLデータベースリビジョンでレガシーアプリケーションを実行しているため..継続性を維持しないのはなぜですか? アプリケーションは、サードパーティではなく自分で管理するサーバー (Web ホスティング) でホストされていると想定しています。

私がお勧めするのは、別のマシンを用意することです.おそらく、mysql4.0を実行する仮想サーバーと、アプリケーションに適したPHPのバージョン..次に、すべてのレガシーを新しいサーバーに移行します..そうすれば、心配する必要はありません.機能の削除/減価償却についてmysql_*..

現在の開発要件を維持したい場合は、メイン サーバーをアップグレードし続けますか?

于 2013-06-17T23:22:36.253 に答える
1

mysql_* から PDO まではそれほど悪くはありません。PDO は最初は少し恐ろしいように見えますが、少なくともクエリ (IMO) からデータを取得する場合は、やや複雑です。

最初は少しかもしれませんが、それほど悪くはないはずです。また、現在の 2 つの標準の 1 つであることに加えて、より安全でもあります。

例えば、

$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');

mysql_query($sql)

なる

$link = new PDO("mysql:host=localhost;dbname=$dbname", $dbuser, $dbpass);

$statement = $link->prepare($sql);
$statement->execute(values);
于 2013-06-13T23:29:38.367 に答える
-1

この回答は、OP が PDO が MySQL 4 に接続できると信じている間に書かれました。

おそらくできることは、mysql 関数を PDO ドライバーで書き直すことです。そのため、元のコードを変更する必要はありません。Serdnad の例を挙げると、次のようなことができます。

function mysql_connect($dbhost, $dbusr, $dbpass){
  return new PDO("mysql:host=$dbhost;dbname=mydb", $dbuser, $dbpass);
}

function mysql_select_db($db, $link=false){
  // If you were not using the link argument you might use some global instead
  $link->query("USE $db");
  return 1;
}

function mysql_query($sql, $link=false){
  // If you were not using the link argument you might use some global instead
  $statement = $link->prepare($sql);
  return $statement->execute(values);
}

まあ、かなりの数の mysql_* 関数がありますが、最終的には、ソースで単純な正規表現検索を使用して、実際に使用するもの (ほんの一部かもしれません) を見つけることができます。

mysql_escape_string、mysql_affected_rows、または mysql_insert_id などのいくつかの関数を賢く使用する必要があると思いますが、それが実行可能であると確信しています。

関数を再定義するときに拡張機能がまだアクティブな場合、コードに簡単に追加できる名前空間を使用して回避できる致命的なエラーが発生します。mysql ext を無効にすると、元のコードの行を変更せずに目標を達成できると思います。

于 2013-06-17T23:40:01.500 に答える