当用户选择数据时,从 mysql 查询结果中携带特定数据
Carry over specific data from mysql query result when user selects data
这是我关于 stackover flow 的第一个问题,所以希望我能解释清楚。我是 php/js/html 的新手,我遇到了 运行 的问题。我使用会话变量查询我的数据库,它 returns 所有与登录用户关联的结果。
下面是我用来获取结果的 php 代码。
<?php
session_start();
include('conn.php');
if(!isset($_SESSION['40219357_user'])){
header('Location:index.php');
}
$username = $_SESSION['40219357_user'];
$userid = $_SESSION['40219357_id'];
$read = "SELECT * FROM medi_users WHERE dr_id = '$userid'";
$result = $conn ->query($read);
?>
此查询的结果显示在我网站上的 table 中。当网站的登录用户点击一个人的记录时,它应该显示与该特定人相关的所有信息。
自从问我原来的问题后,我找到了一个简单的解决方案,方法是将用户 ID 作为隐藏值传递到按钮中。代码如下。
<?php
while($row = $result ->fetch_assoc()){
$rowid = $row['id'];
$firstname = $row['firstname'];
$surname = $row ['surname'];
$dob = $row['dob'];
$address = $row['address'];
$town = $row['town'];
$postcode = $row['postcode'];
echo"
<tbody>
<tr>
<td>$firstname</td>
<td>$surname </td>
<td>$dob</td>
<td>$address</td>
<td>$town</td>
<td>$postcode</td>
<td><a class = 'btn btn-danger'
href `='patientsmedication.php?editid=$rowid'>View</a></td>`
</tr>
";
}
?>
</tbody>
</table>
</div>
</div>
我完全理解这不是一种非常安全的方法,我愿意接受有关如何正确执行此操作的建议,因为我很想学习。
<?php
session_start();
//I think you are already using PDO/Mysqli prepared statements
//in this file since you call $conn->query below
include('conn.php');
if(!isset($_SESSION['40219357_user'])){
header('Location:index.php');
}
//
$username = $_SESSION['40219357_user'];
$userid = $_SESSION['40219357_id'];
//so to make this secure use place markers and bind your params
$read = "SELECT * FROM medi_users WHERE dr_id = '$userid'";
//becomes:
$read = "SELECT * FROM medi_users WHERE dr_id = :userId";
$q = $conn->prepare($read);
$q->bindParam(":userId",$userId,PDO::PARAM_INT);
$q->execute();
//now you can fetch your result set and store it in a variable
$results = $q->fetchAll();
?>
然后您可以使用 foreach
遍历结果
echo "<table>
<tr>
<th>Heading 1</th><th.....
</tr>";
foreach($results as $row) {
$rowid = $row['id'];
//I'm not sure if this is the right id,
//you would need to confirm, I would think you want to have a user id, but obviously don't know the structure
//of your database - if this is the user (patient?)
//id then it's fine
$firstname = $row['firstname'];
$surname = $row ['surname'];
$dob = $row['dob'];
$address = $row['address'];
$town = $row['town'];
$postcode = $row['postcode'];
echo "<tr>
<td>$firstname</td>
<td>$surname </td>
<td>$dob</td>
<td>$address</td>
<td>$town</td>
<td>$postcode</td>
<td><a class='btn btn-danger'
href='patientsmedication.php?patientId=$rowid'>View</a></td>//or whatever the relevant id is
</tr>";
}
echo "</table">;
我敢肯定,在 url 中传递 id 的感觉很复杂 - 就我个人而言,我不是一个忠实粉丝,但如果你有足够的其他检查,我们会在只读情况下工作到位然后它自己的 id 对任何人都不是很有用。
现在 patientsmedication.php 您可以使用 $_GET['patientId']
获取患者 ID
<?php
session_start();
include('conn.php');
if(!can_view_patient_details()) {
header('Location:error_page.php');
exit();
} else {
$patientId = isset($_GET['patientId'])??0;
//if you aren't using php7 you won't have the null coalescing operator so use a ternary style like $var = cond ? A : B
//now do your query
$q = "SELECT * FROM yourtable WHERE patientId = :patientId";
$q = $conn->prepare($q);
$q->bindParam(":patientId",$patientId,PDO::PARAM_INT);
$q->execute();
//now you can fetch your result set and store it in a variable
$results = $q->fetchAll();
}
function can_view_patient_details() {
//this should return true or false
//you would need to design your own permissions checks,
//given the nature of your project I would think you would
//do a database call to confirm the user has the right access
//to the patient, but you may just check that the correct
//sessions are set, you'd have to decide what is most appropriate
}
?>
然后根据您的结果,您可以创建您认为合适的页面 - 如果您打算使用此页面更新详细信息,我建议您使用一个表单,因为您可以使用 $_POST
方法,但该方法不会在 url 中显示信息 - 然后我建议它通过控制器对权限、数据类型等进行所有正确检查。
如果您还没有进入 MVC 模式(如果您刚刚开始,这很可能),那么至少将您的表单指向一个单独的脚本,然后 return 到此页面并提供一些反馈 -通过 url 中的标志或通过设置会话消息并将其回显。
有几件事值得注意,我假设您使用的是 PDO 而不是 Mysqli 准备好的语句,它们都很好,但语法略有不同,我的回答也只在 PDO 中使用 PDO 你不再 需要 在你的位置标记上使用分号 (:userId == userId)
但我个人更喜欢它以便在编写 sql 时提高可读性。此外,您的会话名称看起来好像在名称中包含用户 ID(它可能是一个内部代码,尽管这意味着某些东西),但如果它是 ID,则以这种方式设置它的可扩展性不是很好 - 它更简单有一个名为 'user' 的会话并为其赋予 id 的值 - 否则您如何在不查找用户的情况下知道会话的名称,这将破坏该对象。
希望这会为您指明正确的方向,我建议您阅读 PDO 和 MVC 模式
这是我关于 stackover flow 的第一个问题,所以希望我能解释清楚。我是 php/js/html 的新手,我遇到了 运行 的问题。我使用会话变量查询我的数据库,它 returns 所有与登录用户关联的结果。 下面是我用来获取结果的 php 代码。
<?php
session_start();
include('conn.php');
if(!isset($_SESSION['40219357_user'])){
header('Location:index.php');
}
$username = $_SESSION['40219357_user'];
$userid = $_SESSION['40219357_id'];
$read = "SELECT * FROM medi_users WHERE dr_id = '$userid'";
$result = $conn ->query($read);
?>
此查询的结果显示在我网站上的 table 中。当网站的登录用户点击一个人的记录时,它应该显示与该特定人相关的所有信息。
自从问我原来的问题后,我找到了一个简单的解决方案,方法是将用户 ID 作为隐藏值传递到按钮中。代码如下。
<?php
while($row = $result ->fetch_assoc()){
$rowid = $row['id'];
$firstname = $row['firstname'];
$surname = $row ['surname'];
$dob = $row['dob'];
$address = $row['address'];
$town = $row['town'];
$postcode = $row['postcode'];
echo"
<tbody>
<tr>
<td>$firstname</td>
<td>$surname </td>
<td>$dob</td>
<td>$address</td>
<td>$town</td>
<td>$postcode</td>
<td><a class = 'btn btn-danger'
href `='patientsmedication.php?editid=$rowid'>View</a></td>`
</tr>
";
}
?>
</tbody>
</table>
</div>
</div>
我完全理解这不是一种非常安全的方法,我愿意接受有关如何正确执行此操作的建议,因为我很想学习。
<?php
session_start();
//I think you are already using PDO/Mysqli prepared statements
//in this file since you call $conn->query below
include('conn.php');
if(!isset($_SESSION['40219357_user'])){
header('Location:index.php');
}
//
$username = $_SESSION['40219357_user'];
$userid = $_SESSION['40219357_id'];
//so to make this secure use place markers and bind your params
$read = "SELECT * FROM medi_users WHERE dr_id = '$userid'";
//becomes:
$read = "SELECT * FROM medi_users WHERE dr_id = :userId";
$q = $conn->prepare($read);
$q->bindParam(":userId",$userId,PDO::PARAM_INT);
$q->execute();
//now you can fetch your result set and store it in a variable
$results = $q->fetchAll();
?>
然后您可以使用 foreach
遍历结果 echo "<table>
<tr>
<th>Heading 1</th><th.....
</tr>";
foreach($results as $row) {
$rowid = $row['id'];
//I'm not sure if this is the right id,
//you would need to confirm, I would think you want to have a user id, but obviously don't know the structure
//of your database - if this is the user (patient?)
//id then it's fine
$firstname = $row['firstname'];
$surname = $row ['surname'];
$dob = $row['dob'];
$address = $row['address'];
$town = $row['town'];
$postcode = $row['postcode'];
echo "<tr>
<td>$firstname</td>
<td>$surname </td>
<td>$dob</td>
<td>$address</td>
<td>$town</td>
<td>$postcode</td>
<td><a class='btn btn-danger'
href='patientsmedication.php?patientId=$rowid'>View</a></td>//or whatever the relevant id is
</tr>";
}
echo "</table">;
我敢肯定,在 url 中传递 id 的感觉很复杂 - 就我个人而言,我不是一个忠实粉丝,但如果你有足够的其他检查,我们会在只读情况下工作到位然后它自己的 id 对任何人都不是很有用。
现在 patientsmedication.php 您可以使用 $_GET['patientId']
<?php
session_start();
include('conn.php');
if(!can_view_patient_details()) {
header('Location:error_page.php');
exit();
} else {
$patientId = isset($_GET['patientId'])??0;
//if you aren't using php7 you won't have the null coalescing operator so use a ternary style like $var = cond ? A : B
//now do your query
$q = "SELECT * FROM yourtable WHERE patientId = :patientId";
$q = $conn->prepare($q);
$q->bindParam(":patientId",$patientId,PDO::PARAM_INT);
$q->execute();
//now you can fetch your result set and store it in a variable
$results = $q->fetchAll();
}
function can_view_patient_details() {
//this should return true or false
//you would need to design your own permissions checks,
//given the nature of your project I would think you would
//do a database call to confirm the user has the right access
//to the patient, but you may just check that the correct
//sessions are set, you'd have to decide what is most appropriate
}
?>
然后根据您的结果,您可以创建您认为合适的页面 - 如果您打算使用此页面更新详细信息,我建议您使用一个表单,因为您可以使用 $_POST
方法,但该方法不会在 url 中显示信息 - 然后我建议它通过控制器对权限、数据类型等进行所有正确检查。
如果您还没有进入 MVC 模式(如果您刚刚开始,这很可能),那么至少将您的表单指向一个单独的脚本,然后 return 到此页面并提供一些反馈 -通过 url 中的标志或通过设置会话消息并将其回显。
有几件事值得注意,我假设您使用的是 PDO 而不是 Mysqli 准备好的语句,它们都很好,但语法略有不同,我的回答也只在 PDO 中使用 PDO 你不再 需要 在你的位置标记上使用分号 (:userId == userId)
但我个人更喜欢它以便在编写 sql 时提高可读性。此外,您的会话名称看起来好像在名称中包含用户 ID(它可能是一个内部代码,尽管这意味着某些东西),但如果它是 ID,则以这种方式设置它的可扩展性不是很好 - 它更简单有一个名为 'user' 的会话并为其赋予 id 的值 - 否则您如何在不查找用户的情况下知道会话的名称,这将破坏该对象。
希望这会为您指明正确的方向,我建议您阅读 PDO 和 MVC 模式