3

バックアップがなく、完全に失われた非常に大規模で複雑な Web サイトを回復/再構築する任務を負っています。私はすべての PHP ファイルの完全な (できれば) コピーを持っていますが、データベース構造がどのように見えるかはまったくわかりません (確かに少なくとも 50 ほどのテーブルがあることを除けば、かなり複雑です)。すべてのデータが失われ、元の開発者は約 1 年前に激しい確執で解雇されました (そう聞いたことがあります)。私はかなり長い間 PHP 開発者をしており、すべてを整理し、アプリケーション/サイトを元に戻して実行することに十分慣れていますが、データベースがないと非常に苦労します。それで...すべての受信クエリをキャプチャし、要求されたフィールドとテーブル名を使用して構造を再構築しようとするソフトウェアへのMySQL接続をシミュレートする方法はありますか?

アプリケーションをクリックして開始すると、次のクエリが渡されるように思えます

SELECT name, email, phonefrom contact_tableWHERE contact_id='1'

...その情報を取得し、それらの名前を持つフィールドが少なくとも 4 つある「contact_table」というテーブルがあると仮定する方法があるはずです...それを繰り返し行うことができれば、検出されたデータにサンプルデータを追加するたびにフィールドを作成してから別のページに移動すると、最終的にデータベース構造の大部分 (少なくともすべての公開部分) の大まかなコピーが得られるはずです。これは、すべてのコードを手動で読み取ってすべての参照を引き出し、すべての結合とサブクエリを読み取り、すべて手動で並べ替えるよりもはるかに簡単です。

誰もこれを試したことがありますか?PHPコードからデータベース構造をリバースエンジニアリングするための他のアイデアはありますか?

4

4 に答える 4

0

私はかつて同様の仕事をしていましたが、幸いなことに古いバックアップを見つけることができました。

クエリを抽出する方法を見つけることができた場合、たとえば、正規表現mysql_queryがデータベースのクエリに使用されたすべての出現または拡張子に一致する場合、 php-sql-parser のようなものを使用してクエリを解析し、できればそれからほとんどのテーブルと列のリストを取得できます。しかし、それは戦いの半分にすぎません。残りの半分は、すべての単一の列のデータ型を決定することですが、これを PHP から自動的に行うのはむしろ不可能です。基本的には、行ごとに検査する必要があります。ベスト プラクティスはありますが、古い開発者がそれに従っていると誰が言えますか? 「日付」という列をDATEDATETIMEINT、またはVARCHAR(50)ある種の手動の醜い文字列では、実際のコードを見て判断するしかありません。

幸運を!

于 2013-08-02T23:25:15.277 に答える
0

クレイジーなタスク。DBクエリがまったく抽象化されているようなコードですか? 実際のクエリを実行する前に、クエリ関数を、テーブル、列、およびキーをログに記録したり、実際にテーブルを作成したり、必要に応じて変更したりするものに置き換えることができますか?

または、すべての PHP ファイルのクエリに対して、テキスト処理、正規表現マッチング、grep/sort/uniq を実行する方が簡単な場合があります。目標は、すべてのテーブルとそれらのテーブル内の列の管理可能なリストを作成することです。

于 2013-08-02T23:15:42.757 に答える
0

BEFORE アクション時間でいくつかのトリガーを作成できますが、残念ながら、これは INSERT、UPDATE、または DELETE コマンドに対してのみ機能します。

http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html

于 2013-08-04T03:32:20.763 に答える