ホームページ >バックエンド開発 >PHPチュートリアル >PHP データベースでよくある 5 つの問題 (2)_PHP チュートリアル
これらすべてを行うためのより良い方法は、データをデータベースにロードしてから、以下のようなクエリを実行することです。
リスト 9. Getfiles_good.php
require_once("DB.php");
関数 get_files( $name )
{
$rows = array();
$dsn = 'mysql://root:password@localhost/good_multi';
$db =& DB::Connect( $dsn, array() );
if (PEAR::isError($db)) { die($db->getMessage()) }
$res = $db->query("SELECT files.* FROM ユーザー、ファイル WHERE
users.login=? AND users.id=files.user_id",
array( $name ) );
while( $res->fetchInto( $row ) ) { $rows[] = $row }
$rows を返します;
}
$files = get_files( 'jack' );
var_dump( $files );
?>
コードが短くなっただけでなく、理解しやすくなり、効率も向上しました。 2 つのクエリを実行する代わりに、1 つのクエリを実行します。
この質問は突飛に聞こえるかもしれませんが、実際には、よほどの特別な理由がない限り、すべてのテーブルは同じデータベース内にあるべきであると通常結論付けられます。
質問 4: リレーションシップを使用していない
リレーショナル データベースは配列型を持たないという点でプログラミング言語とは異なります。代わりに、テーブル間の関係を使用して、オブジェクト間に 1 対多の構造を作成します。これは、配列と同じ効果があります。私がアプリケーションで見た問題の 1 つは、エンジニアがカンマ区切りの識別子を含むテキスト文字列を使用して配列を作成することにより、データベースをプログラミング言語のように使用しようとする場合です。以下のパターンを参照してください。
リスト 10. Bad.sql
ファイルが存在する場合はテーブルを削除;
テーブルファイルの作成 (
ID ミディアムミント、
名前テキスト、
パステキスト
);
ユーザーが存在する場合はテーブルを削除;
CREATE TABLE ユーザー (
ID ミディアムミント、
ログインテキスト、
パスワードテキスト、
ファイルテキスト
);
INSERT INTO files VALUES ( 1, 'test1.jpg', 'media/test1.jpg' );
INSERT INTO files VALUES ( 2, 'test1.jpg', 'media/test1.jpg' );
INSERT INTO users VALUES ( 1, 'jack', 'pass', '1,2' );
システム内のユーザーは複数のファイルを持つことができます。プログラミング言語では、ユーザーに関連付けられたファイルを表すために配列を使用する必要があります。この例では、プログラマは、ファイル ID のカンマ区切りリストを含むファイル フィールドを作成することを選択します。特定のユーザーのすべてのファイルのリストを取得するには、プログラマはまず users テーブルから行を読み取り、次にファイルのテキストを解析し、ファイルごとに個別の SELECT ステートメントを実行する必要があります。コードを以下に示します。
リスト 11. Get.php
require_once("DB.php");