在 phpmyadmin 中,我如何将单个数据库中两个不同表中的两个特定行相互链接并保持自动化?
Posted
技术标签:
【中文标题】在 phpmyadmin 中,我如何将单个数据库中两个不同表中的两个特定行相互链接并保持自动化?【英文标题】:In phpmyadmin, how would I link two specific rows to each other from two different tables inside a single database and keep it automated? 【发布时间】:2019-11-24 15:42:01 【问题描述】:我在一个 phpmyadmin 数据库中有 2 个表 - 一个存储用户注册时的基本用户帐户信息(用户名、电子邮件等),另一个存储用户在输入名称的文本字段中输入的任何内容他们的类,但也从第一个表中获取用户名,并将其存储在第二个表中所有类旁边的另一行中。第一个表做了它应该做的事情,用户数据在他们点击注册后出现在那里。用户单击注册后,他们将被定向到类页面,在其中键入第二个表的数据。但是,单击提交后,会出现“找不到对象”错误消息,并且第二个表完全为空。甚至第一个表中的用户名也没有出现在第二个表中。供参考 - 无论用户在类框中键入什么内容,都会在网页的 URL 内显示,但 URL 的结尾显示“submit =”。
我尝试搜索了几个小时,但真的找不到解决方案(因此是什么让我来到这里)。我对我的代码进行了很多修改,但仍然无法找出问题所在。据我所知,一切似乎都是正确的——但显然结果并非如此。我有我的连接文件,它将我的代码连接到 phpymadmin 数据库,我的 html 文件提供了基本的文本布局,因为一切都出现了,它必须工作正常,最后我的文件提供了专门用 PHP 编写的后端机制——这就是我我猜测最有可能的问题是/是。我已经尝试了几个小时无济于事,观看了视频以试图获得更好的想法,但仍然无法改变结果 - 甚至没有错误“找不到对象”。我还这样做了,用户必须在课程页面上重新输入他们的用户名,这也以完全相同的结果结束。作为参考,我使用的是 sublimetext3,它是 PHPmyadmin 附带的最新版本的 XAMPP(运行 Apache 和 mysql)(我的数据库和表是存储用户信息的地方)。
这是我的后端 PHP 代码(我有一些定义按钮的必需文件,以及像“class1”这样的名称。
if (isset($_GET['submit']))
$box1 = $_GET['class1'];
$box2 = $_GET['class2'];
$box3 = $_GET['class3'];
$box4 = $_GET['class4'];
$username = $_POST['uid'];
$stmt = mysqli_stmt_init($conn);
$result = mysqli_stmt_get_result($stmt);
if ($row = mysqli_fetch_assoc($result))
$userCheck = username_verify($username, $row['uid']);
if ($userCheck == true)
header("Location: ../class_result.php?");
exit();
/n 重新创建用户键入的文本字段称为“类”,请参见下面的代码(注意这是一个单独的文件):
<form action="classcreation.inc.php" method="GET">
<input type="text" name="uid" placeholder="Username">
<input type="text" name="class1" placeholder="">
<input type="text" name="class2" placeholder="">
<input type="text" name="class3" placeholder="">
<input type="text" name="class4" placeholder="">
<input type="text" name="class5" placeholder="">
<input type="text" name="class6" placeholder="">
<input type="text" name="class7" placeholder="">
<input type="text" name="class8" placeholder="">
<button type="submit" name="submit">Submit</button>
</form>
//最后是我的连接文件-虽然我几乎可以肯定这是正确的,但我发布它是为了让回答者看到我已经建立了连接以及我这样做的方法:
$dbservername = "localhost";
$dBUsername = "root";
$dBPassword = "";
$dBName = "loginsystem";
$conn = mysqli_connect($dbservername, $dBUsername, $dBPassword, $dBName);
如前所述,在用户单击课程页面上的提交后,他们在称为“课程”的文本字段中输入的任何内容都应该出现在相应的第二个表格中。除此之外,第二个表应该接收输入信息的用户的用户名——这些信息已经从第一个表中收集。但相反,第二张桌子完全是空的。此外,他们将被引导到另一个页面,现在只显示“欢迎!” (对消息使用简单的回显语句),而是收到“找不到对象错误。最后一部分是否与数据库空虚有关我不是 100% 确定,但我相信它是。
【问题讨论】:
你从来没有写过 SQL 查询。 在这种情况下你会写什么作为你的 SQL 查询?我试过“SELECT users.uidUsers; INSERT INTO user_classes.usernames;”无济于事。我错过了一个简单的语法错误还是我的整个逻辑都错了? phpMyAdmin 是用 PHP 编写的 MySQL 管理工具,它本身不是数据库。您可能正在使用 MySQL 或 MariaDB 作为数据库。 【参考方案1】:您从未使用类数据执行 SQL 查询。
我建议更改 HTML,以便将所有类输入字段命名为 name="class[]"
。这将使$_GET['class']
成为一个可以循环的数组。
if (isset($_GET['submit']))
$username = $_GET['uid'];
$stmt = $conn->prepare("SELECT username FROM users WHERE username = ?");
$stmt->bind_param("s", $username);
$stmt->execute();
$stmt->bind_result($result_user);
$userCheck = username_verify($username, $result_user);
if ($userCheck)
$stmt = $conn->prepare("INSERT INTO user_classes (username, class) VALUES (?, ?)");
$class = null;
$stmt->bind_param("ss", $username, $class);
foreach ($_GET['class'] AS $class)
if (!empty($class)) // skip empty input fields
$stmt->execute();
当然,更改查询中的表名和列名以匹配您的实际表。
从登录页面创建表单时,您可以像这样填写uid
输入:
<input type="text" name="uid" value="<?php echo $username; ?>" placeholder="Username">
但是,将用户名放在表单中是一个坏主意,因为用户可以对其进行编辑以提交其他用户的数据。将其设为只读或隐藏并没有多大帮助,因为用户仍然可以使用开发者工具对其进行更改。
如果登录页面将它放在会话变量中,并在所有后续页面上使用它会更好。这不能由用户修改。
【讨论】:
是的,但是即使在我使用类数据进行 SQL 查询之后,我仍然必须自动化 phpmyadmin 以从第一个表中获取用户在第一页(注册页面)上输入的数据,并将其分配给用户在字段中键入的任何内容,以便我知道哪个用户正确?这样每一行对于特定用户来说都是唯一的? 这和phpmyadmin有什么关系?这是一个手动查看和编辑数据库的工具,它与编写处理表单的 PHP 脚本无关。 您应该在用户登录时将用户名放在会话变量中。在第二页中使用它,而不是从表单中获取。 好吧-我有点需要它以它的方式工作,或者至少有在用户注册后立即出现的原则。我不是在征求意见,但是,除了缺少对类数据的 SQL 执行之外,在将用户在类文本字段中输入的任何内容保留为分配给键入的特定用户方面,您是否可以想到任何其他问题他们? 我不确定是什么问题。是否要使用第一个表单中的用户名填写uid
输入,而不是让用户手动填写?以上是关于在 phpmyadmin 中,我如何将单个数据库中两个不同表中的两个特定行相互链接并保持自动化?的主要内容,如果未能解决你的问题,请参考以下文章
在单个 MySQL 查询中使用多个临时表(适用于 phpMyAdmin,但不适用于 PHP)