2017-11-09 6 views
0

MYSQLで生成されたPHPアプリケーションを構築しています。私は学生と呼ばれるテーブルとノートと呼ばれるテーブルを持っています。ノートテーブルは、アドバイスされている学生に関する追加情報を入力するために使用されるので、アドバイザーは次回に学生にアドバイスするときにその情報を参照することができます。私はこれについてどうやって行くのか分からない。PHPを使用して特定のデータに属するデータのみを表示する

私はアドバイザーに、彼らがアドバイスしている特定の学生のメモだけを見たいだけで、他の人はメモしません。私はSELECTステートメントと一緒に2つのテーブルを結合するために内部結合を使用しています。両方のテーブルの情報は、HTMLフォームのメモページにポストされます。正しく表示できるようにデータを挿入するにはどうすればよいですか?事前に助けてくれてありがとう。

これは私の選択したクエリです(ページ全体ではありません)。このページにはノートが表示されます。

<?php 
$query = " 

SELECT 
notes.Note_Title, 
notes.Note_Desc, 
notes.Note_Cont, 
notes.Note_Date 
from notes 
INNER JOIN students 
ON notes.id = students.id 
Where students.id = 'id'"; 

try { 

$stmt = $db->prepare($query); 
$stmt->execute(); 
} 
catch(PDOException $ex) 

{ 

die("Opps that Query didn't work out: " . $ex->getMessage()); 

} 
while($row = $stmt->fetch()){ 

echo'<div>'; 
echo'<tr>'; 
    echo '<td><h5><a href="notes_view.php?id='.$row['id'].'">'.$row['Note_Title'].'</a></h5></td>'; 
    echo '<td><p>Note created on '.date('JS M Y H:i:s', strtotime($row['Note_Date'])).'</p></td>'; 
    echo '<p>'.$row['Note_Desc'].'</p>'; 
    echo '<p><a href="notes_view.php?id='.$row['id'].'">Read Note</a></p>'; 
    echo '<p><a href="delete.php?id='.$row['id'].'">Delete note</a></p>'; 
    echo '<p><a href="edit_notes.php?id='.$row['id'].'">Edit</a></p>'; 
    echo '<hr width="100%">'; 
echo'</div>'; 
    } 


$query = "INSERT INTO notes (
id, 
Note_Title, 
Note_Desc, 
Note_Cont, 
Note_Date 

) VALUES (
:id, 
:Note_Title, 
:Note_Desc, 
:Note_Cont, 
:Note_Date 
) 
"; 

$query_go = array(
':id' => $id, 
':Note_Title' => $Note_Title, 
':Note_Desc' => $Note_Desc, 
':Note_Cont' => $Note_Cont, 
':Note_Date' => date('Y-m-d H:i:s') 
); 

try { 

$stmt = $db->prepare($query); 
$result = $stmt->execute($query_go); 
} 
catch(PDOException $ex) 

{ 

die("Opps that query didn't work out: " . $ex->getMessage()); 

} 
header('location: index.php?action=added'); 
exit; 
} 
} 
?> 

<form action='' method='POST'> 

<input type='hidden' name='id' id='id' value='<?php if(isset($error)){echo $_POST['id'];}?>'> 
<p><label>Note Title:</label><br /> 
<input type='text' name='Note_Title' value='<?php if(isset($error)){echo $_POST['Note_Title'];}?>'></p></td> 

<p><label>Note description:</label><br /> 
<textarea name="Note_Desc" cols="40" rows="11"><?php if(isset($error)){echo $_POST['Note_Desc'];}?></textarea></p></td> 

<p><label>Note content:</label><br /> 
<textarea name="Note_Cont" cols="70" rows="11"><?php if(isset($error)){echo $_POST['Note_Cont'];}?></textarea></p></td> 

<p><input type="submit" name="submit" value="submit" ></p> 
</form> 
+0

データベースの構造、クエリ、PHP、HTMLまであなたがすでに得意としているものを確認できますか?それは私があなたが望むものとしたくないものを視覚化するのに役立ちます。つまり、ユーザーのデータを取得するクエリと、そのユーザーのアカウントに関連付けられたすべてのコメントを取得するクエリの2つのクエリを検討することがあります。 – showdev

答えて

1

あなたのページには、選択したユーザーのメモが表示されているようです。これは"one to many"の関係を表します。 1人のユーザーは多くのメモを持つことができ、各メモは1人のユーザーにのみ関連付けることができます。

この場合、JOINを使用するのではなく、目的のユーザーのメモを選択するだけです。編集するとき

SELECT * from `notes` WHERE `user_id`=:user_id; 

:あなたは、ユーザーのノートのページにいるとき

`id` 
`user_id`, 
`title`, 
`description`, 
`content`, 
`date` 

は、そのユーザーのすべてのノートを選択します。これを行うには、あなたのnotesテーブル内user_id列(foreign key)が含まあなたが実際にuser_idを必要としない(メモを別のユーザーに割り当て直さない限り)。それぞれの音符は独自のidで参照できます。

ちなみに、JOINを使用して、ユーザー一覧のユーザーあたりのメモ数を表示できます。このような何か:

SELECT u.*, 
     COUNT(n.`id`) as `note_count` 
FROM `users` u 
LEFT JOIN `notes` n ON (n.`user_id`=u.`id`) 
GROUP BY u.`id`; 

はまた、私はちょうどshowdevはすでに上記の言ったことに、いくつかの明確さを追加するためにこれを書いているHow to store a one to many relation in my sql database?

0

を参照してください。私はここでいくつかの仮定をしています。データベースの基礎、特に正規化、PHPを使ってMySQLと対話する方法をすでに理解していることだから私はコードを書くことはしません。論理を説明しようとするだけです。

2つのテーブルstudentsnotesがあります。両者の関係はone-to-manyの関係です。これは単に、1人の学生が彼/彼女に関連する多くのノートを持つことができることを意味する。しかし一方で、各単音は常に1つの特定の学生に属します。

notesテーブルでは、「student_id」という名前のフィールドまたは属性を追加します。この新しいフィールドは、studentsテーブルの学生のIDにリンクする(参照する)外部キーである必要があります。

これで、特定の生徒のメモをすべて表示したい場合、クエリがより簡単になります。結合の必要はありません。もちろん

SELECT * FROM notes WHERE student_id = :student_id

あなたが新しいノートを挿入しているとき、あなたは特定のノートが所属する学生のIDを含める必要があります。

PHPの日付関数を使用してnotesテーブルに日付を挿入する代わりに、MySQLが自動的にそれを行うことを許可することもできます。 notesテーブルのNote_Date列を変更します。それをNote_Date TIMESTAMP DEFAULT CURRENT_TIMESTAMPにします。 MySQLは現在の日付と時刻を自動的に挿入します。これにより、ネットワークオーバーヘッドのバイトが節約されます。

関連する問題