私は正しい方法であなたを入れようとします(それは長いポストのようですが、初心者に読ませる価値があると思います)。
コメントあなたのデータベースを正規化し、私があなたであり、あなたのプロジェクトが長い間うまくいくようにしたいのであれば...私はそれをやりたいと言われました。
多くのMySQL正規化チュートリアルがあります。あなたが興味を持っている場合は、あなた自身をグーグルにすることができます...私はちょうどあなたの特定の例についてお手伝いするつもりです。
基本的に、「異なる概念」を格納するために異なるテーブルを作成し、データベースをクエリするときにそれを結合する必要があります。この場合
、私はこれらのテーブルを作成します。
categories
、dance_clubs
、users
とdancers
店 "基本的な" データを。
moments
およびmoment_dancers
は、データ間の関係を作成するための外部キーを格納します。
内容をよく理解してみましょう。
mysql> select * from categories;
+----+---------------+
| id | name |
+----+---------------+
| 1 | Hip-hop/dance |
+----+---------------+
mysql> select * from dance_clubs;
+----+---------------+
| id | name |
+----+---------------+
| 1 | dance academy |
+----+---------------+
mysql> select * from users;
+----+-------+
| id | name |
+----+-------+
| 1 | alex |
+----+-------+
mysql> select * from dancers;
+----+-------+
| id | name |
+----+-------+
| 1 | alex |
| 2 | dan |
| 3 | mihai |
+----+-------+
mysql> select * from moments;
+----+--------------+---------------+-------------------+
| id | main_user_id | dance_club_id | dance_category_id |
+----+--------------+---------------+-------------------+
| 1 | 1 | 1 | 1 |
+----+--------------+---------------+-------------------+
(user alex) (dance acad..) (Hip-hop/dance)
mysql> select * from moment_dancers;
+----+-----------+-----------+
| id | moment_id | dancer_id |
+----+-----------+-----------+
| 1 | 1 | 1 | (moment 1, dancer alex)
| 2 | 1 | 2 | (moment 1, dancer dan)
| 3 | 1 | 3 | (moment 1, dancer mihai)
+----+-----------+-----------+
今度はPHPからいくつかの問い合わせをしたいと思います。
コメントでも述べたとおり、mysql_ *クエリの代わりに準備文を使用します。
準備されたステートメントの概念は、最初は分かりにくいものです。ブラウザで
// Your connection settings
$connData = ["localhost", "user", "pass", "dancers"];
$conn = new mysqli($connData[0], $connData[1], $connData[2], $connData[3]);
$conn->set_charset("utf8");
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// Here we explain MySQL which will be the query
$stmt = $conn->prepare("select * from dancers");
// Here we explain PHP which variables will store the values of the two columns (row by row)
$stmt->bind_result($dancerId, $dancerName);
// Here we execute the query and store the result
$stmt->execute();
$stmt->store_result();
// Here we store the results of each row in our two PHP variables
while($stmt->fetch()){
// Now we can do whatever we want (store in array, echo, etc)
echo "<p>$dancerId - $dancerName</p>";
}
$stmt->close();
$conn->close();
結果:
ダンサーを(ちょうどそれを理解するために)
リストへ) 簡単たとえば、ちょうど密接にコードを読んで、再びいくつかのチュートリアルを探して
いいえ!今何か少し難しい! リスト瞬間:ブラウザで
// Your connection settings
$connData = ["localhost", "user", "pass", "dancers"];
$conn = new mysqli($connData[0], $connData[1], $connData[2], $connData[3]);
$conn->set_charset("utf8");
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// Query to read the "moments", but we have their main user and dancers in other tables
$stmtMoments = $conn->prepare("
select
moments.id,
(select name from users where users.id = moments.main_user_id) as main_user,
(select name from dance_clubs where dance_clubs.id = moments.dance_club_id) as dance_club,
(select name from categories where categories.id = moments.dance_category_id) as dance_category,
(select count(*) from moment_dancers where moment_dancers.moment_id = moments.id) as number_of_dancers
from moments
");
// Five columns, five variables... you know ;)
$stmtMoments->bind_result($momentId, $momentMainUser, $momentDanceClub, $momentDanceCategory, $momentNumberOfDancers);
// Query to read the dancers of the "moment" with id $momentId
$stmtDancers = $conn->prepare("
select
dancers.name as dancer_name
from
dancers join moment_dancers on dancers.id = moment_dancers.dancer_id
where
moment_dancers.moment_id = ?
");
$stmtDancers->bind_param("i", $momentId);
$stmtDancers->bind_result($momentDancerName);
// Executing the "moments" query
$stmtMoments->execute();
$stmtMoments->store_result();
// We will enter once to the while because we have only one "moment" right now
while($stmtMoments->fetch()){
// Do whatever you want with $momentId, $momentMainUser, $momentDanceClub, $momentDanceCategory, $momentNumberOfDancers
// For example:
echo "<h3>Moment $momentId</h3>";
echo "<p>Main user: $momentMainUser</p>";
echo "<p>Dance club: $momentDanceClub</p>";
echo "<p>Category: $momentDanceCategory</p>";
echo "<p>Number of dancers: $momentNumberOfDancers</p>";
echo "<p><strong>Dancers</strong>: ";
// Now, for this moment, we look for its dancers
$stmtDancers->execute();
$stmtDancers->store_result();
while($stmtDancers->fetch()){
// Do whatever you want with each $momentDancerName
// For example, echo it:
echo $momentDancerName . " ";
}
echo "</p>";
echo "<hr>";
}
$stmtUsers->close();
$stmtMoments->close();
$conn->close();
結果:
そして、それがすべてだと!質問がある場合は私に尋ねてください!
(あなたがしたい場合、私は、コンテンツデータと例のデータベースを作成するDDLコードを投稿できる)
編集は:dancers
テーブルを追加しました。名前がmoment_users
からmoment_dancers
に変更されました。新しいテーブルと名前にスクリプトを適合させるように変更された機能。
[mysql_ *関数を使用しない](http://stackoverflow.com/questions/12859942/why-shouldnt-i-use-mysql-functions-in-php)ください。 [これらの拡張機能](http://php.net/manual/en/migration70.removed-exts-sapis.php)はPHP 7で削除されました。[prepared](http://en.wikipedia.org/ [PDO](http://php.net/manual/en/pdo.prepared-statements.php)および[MySQLi](http://php.net/manual/en/mysqli.quickstart)のwiki/Prepared_statement)ステートメント.prepared-statements.php)、PDOの使用を検討してください。[これは本当に簡単です](http://jayblanchard.net/demystifying_php_pdo.html)。 –
私は新しい学習者です。アドバイスをいただきありがとうございます。Jay – Fido
データベースを正規化することを検討してください。列の値のカンマ区切りリストはデザインが悪いので、なぜ名前とリストを保存する必要がありますか?リスト内の名前を数えることはできませんか? –