我的数据库结构如下
目前,字符,组和保险库表都有数据。但游戏表是空的。
是否有可能在游戏桌上编写内部联接,即使游戏桌中没有数据,也可以让php搜索框从其他三个表中获取数据?
还有其他方法可以做到这一点,我可能不知道吗?
例如,我想为搜索游戏桌的网页编写一个php搜索脚本。如果用户输入'Allistair Tenpenny',它将从字符表中提取数据并将其显示在搜索页面中,其中包含字符名称及其历史记录,如果有人搜索某个保险库,它将显示保险库表格中的数据。
根据我所读到的内连接,每个连接表上的数据必须匹配才能显示。还有另一种方法可以解决这个问题吗?
答案 0 :(得分:2)
无需内连接即可获取所需数据。您可以简单地使用php来使用SQL根据用户输入搜索相应的表。
如果页面上有多个搜索字段,只需以不同方式命名提交按钮,然后让PHP检查表单中是否存在每个提交按钮的POST数据,然后执行相应的搜索。示例表单可能是:
<form action="" method="post">
Search Character Name:<input type="text" name="charactername">
<input type="submit" name="charsubmit" value="Search">
</form>
<form action="" method="post">
Search Vault Name:<input type="text" name="vaultname">
<input type="submit" name="vaultsubmit" value="Search">
</form>
您的PHP代码可以结构化为:
if (isset($_POST['charsubmit']))
{
$stmt = $db->prepare("SELECT * FROM character_table WHERE character_name = ':mydata'");
$stmt->bindParam(':mydata',$_POST['charactername']);
}
elseif (isset($_POST['vaultsubmit']))
{
$stmt = $db->prepare("SELECT * FROM vault_table WHERE vault_name = ':mydata'");
$stmt->bindParam(':mydata',$_POST['vaultname']);
}
$stmt->execute();
使用这样的预处理语句是防止SQL注入攻击的好方法,从而确保用户输入的数据 NEVER 直接放入SQL语句。
答案 1 :(得分:0)
自己想一想。规范化的相对数据库中不应存在冗余信息。所有数据表都有一列history
。它不应该有冗余数据,您可以使用它来标识其他表中的行,但是应该使用自己的表中的记录集的描述。我们不知道vault_number
是什么。所有其他表可能会直接连接到vault
表,具体取决于您的数据结构。只有你知道,你建立这种结构的意图是什么。
您还通过包含games
的冗余列将groups
与group_name
连接起来了。您应该避免任何冗余,并为groups
id
提供帮助。然后通过外部games
密钥将其连接到group_id
。想象一下,如果一个群组中有100个游戏并且你决定重命名一个群组或只是想纠正一个错字,会发生什么。
答案 2 :(得分:0)
为什么不尝试将它们添加到数组中而不是加入表?
编辑:
数组可以包含4个元素:
示例查询将是:
select vault_number, charactor_name as name, history, 'charactor' as type from charactor
select vault_number, group_name as name, history, 'group' as type from groups
您只需继续将其添加到阵列中,然后就可以显示所有结果
考虑到Quasimodo的克隆解释了你的数据库规范化以及中士AJ给出的方法可能会有很长的路要走。