警告:
mysql_*
関数を使用して新しいコードを記述しないでください。それらはもはや保守されておらず、コミュニティは非推奨プロセスを開始しています。赤いボックスが見えますか?
代わりに、準備済みステートメントについて学び、 PDOまたはMySQLiのいずれかを使用する必要があります。この記事では、使用する API を決定する方法について詳しく説明します。PDO については、ここに良いチュートリアルがあります。
次のデータベース設定を検討してください。
-- This contains the elements: books, videos, albums.
CREATE TABLE IF NOT EXISTS `entries` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`comment` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
-- This contains what our users favourited.
-- row_id: row identifier index
-- name: the name of the user to search for
-- entry_id: the id of the entry we search for, this will
-- make our JOIN relation towards entries.id
CREATE TABLE IF NOT EXISTS `favorites` (
`row_id` int(10) NOT NULL AUTO_INCREMENT,
`name` varchar(64) NOT NULL,
`entry_id` int(10) NOT NULL,
PRIMARY KEY (`row_id`)
) ENGINE=InnoDB;
もちろん、いくつかの任意のデータを入れてください:
INSERT INTO `entries` (`id`, `name`, `comment`) VALUES
(1, 'Foobar', 'Bazqux'),
(2, 'Barbaz', 'Quxfoo');
INSERT INTO `favorites` (`row_id`, `name`, `entry_id`) VALUES
(1, 'someguy', 1),
(2, 'someguy', 2),
(3, 'person', 2);
データベースにクエリを実行するには、基本的なスクリプトが必要です。
mysql_connect("localhost", "username", "password");
mysql_select_db("database");
$result = mysql_query('SELECT entries.id, entries.name, entries.comment
FROM entries
INNER JOIN favorites ON entries.id = favorites.entry_id
WHERE favorites.name = "' .mysql_real_escape_string($_GET['name']). '"');
while ( $row = mysql_fetch_assoc($result) )
var_dump($row);
mysql_close();
$_GET['name']
の値を与えるsomeguy
と、結果は次のようになります。
array (
'id' => '1',
'name' => 'Foobar',
'comment' => 'Bazqux',
)
array (
'id' => '2',
'name' => 'Barbaz',
'comment' => 'Quxfoo',
)
の値を使用すると、次のperson
ようになります。
array (
'id' => '2',
'name' => 'Barbaz',
'comment' => 'Quxfoo',
)
その秘訣は にありINNER JOIN
ます。私たちの検索パターンであるWHERE
句は、入力であるfavorites.entry_id
場所を検索することをデータベースに伝えfavorites.name
ます。そこから、JOIN
検索を拡張する 2 つのテーブル間のリンクを作成します。は、 と等しい行のみが返されることINNER JOIN
を意味します。そしてもちろん、ステートメントにリストされたフィールドをフェッチします。結局のところ、これがデータベースに指示したことです。もう少し、視覚的な説明。entries.id
favorites.entry_id
SELECT
そして、ここからwhile(){}
構造内で、取得したデータを使って好きなことを行うことができます。
field IN (value1, value2)
すべての ID を取得してステートメントに挿入する代わりにINNER JOIN
、MySQL のリレーショナル構造を利用するため、パフォーマンスと保守性が向上します。
そして、私が別の人と同様の問題について話し合っているときにチャットで言ったように:
MySQL で構築できる複雑さは、想像を超える場合があります。肝心なのは、最初にデータベースが適切にモデル化されていることを確認する必要があるということです。後は、あるフィールドを別のフィールドにどのようにリンクするかだけです。phpMyAdmin、LibreOffice Base、または Microsoft Access などのツールは、キー間の関係をモデル化するためのグラフィカル インターフェイスで非常に役立ちます。