- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在寻找连接两个表,条件是如果用户表的分支代码字段中有任何内容,那么 SQL 查询将只返回其分支代码。
但是,如果用户表的分支代码框中包含 NULL,它将返回分支表中的所有分支代码。
下面是我正在尝试的,我知道不起作用,但应该给出我正在使用的表格和字段的一些倾向。
SELECT IF(u.BranchCode IS NOT NULL THEN b.BranchCode ELSE u.BranchCode END ) AS BranchCode, b.BranchName, b.BranchAddress1, b.BranchAddress2
FROM users AS u
LEFT JOIN branches AS b ON u.BranchCode = b.BranchCode
WHERE u.Username = '$_SESSION[USERNAME]'
一些表格示例:
用户
UserName | BranchCode
---------|------------------
bob | NULL
sam | AW3456
dave | NULL
alison | NULL
fred | NULL
分支机构
BranchCode| BranchName |BranchAddress1 |BranchAddress2
----------|-------------|---------------|-------------------
AQ3459 | Northmore |1 Northmore Rd |Northmore Village
AW3456 | Middleton |28 Main Rd |Middleton Stoney
DE5689 | Western |451 Station Rd |Western
FR3278 | Easterly |12 Acacia Dr |Easterly Estate
例如,如果 bob 是登录用户,它将返回所有 BranchCode 信息:
BranchCode| BranchName |BranchAddress1 |BranchAddress2
----------|-------------|---------------|-------------------
AQ3459 | Northmore |1 Northmore Rd |Northmore Village
AW3456 | Middleton |28 Main Rd |Middleton Stoney
DE5689 | Western |451 Station Rd |Western
FR3278 | Easterly |12 Acacia Dr |Easterly Estate
如果 sam 是登录的用户,它将仅返回其在用户表中指定的 BranchCode 信息的查找:
BranchCode| BranchName |BranchAddress1 |BranchAddress2
----------|-------------|---------------|-------------------
AW3456 | Middleton |28 Main Rd |Middleton Stoney
最佳答案
也许更擅长 SQL 的人会以纯 SQL 方式回答这个问题,但我倾向于保持查询相当简单,因为我喜欢在编码中遵循 KISS 规则。我希望他们会这样做,因为这个答案并不能 100% 以您想要的方式回答您的问题。
根据您提供给我们的 SQL,我可以假设您使用 PHP 进行此查询。另外,从您的查询中可以看出您之前已调用过 users 表。在该调用中,将 BranchId
列存储在 session 中,就像使用用户名变量一样。
假设设置了$_SESSION['branchId']
(即使它可能为NULL)并且您的mysqli_connect()
调用存储在名为的变量中$con
,然后你可以执行如下操作:
$sql = "SELECT * FROM branches";
if($_SESSION['branchId']!==null){
$sql.= " WHERE BranchCode='".mysqli_real_escape_string($con,$_SESSION['branchId'])."'";
}
$result = mysqli_query($con,$sql);
//Fetch rows as usual.
如果您的表已有 ID 列,则可以忽略下一部分。
现在,我真的不确定为什么你的表是这样构造的。我知道每个分行在交谈时可能有一个字母数字调用号码(例如,如果您调用另一个分行,您会说“我是来自 AW2011 分行的 Jack,...”)但是 SQL Injection是真实的,对抗它的最好和最简单的方法之一是对引用变量进行类型转换,以便删除任何额外的输入。但是,这仅对整数类型的引用列有用,因为字符串列仍然需要转义。考虑到这一点,您会注意到我在branchId周围使用了mysqli_real_escape_string()
,因为我知道它将是一个字符串值。
很多人会推荐像 Prepared Statements 这样的东西虽然我可能已经为您提供了它的链接,但有时它可能会非常令人困惑,而且我并不完全是 PHP 的 PDO 连接的忠实粉丝。 MySQLi 扩展还提供了自己的语句准备版本,这两个版本都没有立即让我感到惊讶。它们看起来都很复杂,我觉得没有必要这么复杂。但如果您需要使用字符串数据,它们绝对是避免 SQL 注入(inject)的最佳方法。
如果您的表没有更多引用,我无法确定您的数据实际上是什么样子,但我的逻辑是,如果您有 user_id 列,则不会传入 username 列。因此,我建议您创建的任何表上的每条记录都具有 ID 列。这简化了对 SQL 注入(inject)的防范,因为我可以将 if()
语句中的文本缩短为
mysql_real_escape_string()
调用。
$sql .= 'WHERE branch_id='.(int)$_SESSION['branchId'];
在大多数情况下,这几乎就是您防范 SQL 注入(inject)所需的全部内容。如果有人要更改您的 session 数据(我确信这是可能的,尽管从未决定尝试),他们尝试输入的任何额外文本都将被删除或导致 SQL 运行不正确。 (不过,不要引用我的话。我很久以前读过有关 PHP 类型转换变量的内容,所以我可能完全错了)。
如果您不清楚 ID 列是什么或如何使用它,请随时提出另一个问题,希望有人比我更准确地向您解释。
关于mysql - 带条件的 SQL 连接表查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25659468/
我在 GlassFish (J2EE_1.4) 上的 NetBeans 中开发企业项目。我的项目中有一些实体 bean、一些 session bean 和消息驱动 bean。我以如下方式使用 serv
什么在速度方面更好...... 我正在尝试确定用户是否已将某个 URL 添加到他们的快捷方式列表中。如果他们添加了 URL,页面上就会有一个链接,用于从快捷方式中删除该页面,否则他们可以将其添加到快捷
我的问题如下: 我打开一个Excel-File,但我不知道我的客户在模板文件中使用了哪些可能的标头变量。它们可以是:#DATE,#TIME,#NAME等。因此,我需要查找这些变量,以及是否已使用过:替
我有一堆以“-e”结尾的文件要删除。 $ find . -name "*-e" exec rm {} \; find: exec: unknown primary or operator 正则表达式是
我有一个简单的问题:是否可以在 TypeScript 中获取联合的一部分的类型? 例如,您可以经常使用如下查找类型: interface Person { name: string; } type
我正在尝试设置 Point Cloud Library启用 CUDA 选项的主干构建。 我相信我已经按照 these instructions 正确安装了 CUDA . 在 PCL 构建的 cmake
我将首先说我所知道的唯一 VBA 是操作录制的宏的反复试验。我是一名注册会计师,试图以艰难的方式学习 VBA(并希望我去学校学习计算机编程!)。 我有带有多个工作表的大型工作簿。 G 列中以黄色突出显
当文件数达到阈值时,我试图删除目录中最旧的文件。 list_of_files = os.listdir('log') if len([name for name in list_of_files
我有一个数组,它有一些重复的值。 我必须计算每个重复项的数量及其索引。 打印如: Index of b: 1 Index of b: 4 Index of c: 2 Index of c: 3 Ind
我已经搜索了我的问题的解决方案,但没有成功。热键 ctrl+F 找到的 eclipse 查找/替换功能不起作用。注意:通过 Eclipse 菜单 Edit>Find Replace(不工作我的意思是
我想检查 div 是否包含类为“error”的子级,但条件是错误类显示不等于无。 (意味着错误类必须可见。 如何更改我的以下代码: $(".related_field").each(function
这个问题已经有答案了: 已关闭13 年前。 Possible Duplicate: Can jQuery provide the tag name? 嗨! 这个问题太基础了,我不好意思问,但我尝试了
我一直听说这是 cygwin 的路径问题。它阻止了 emacs 在我的 cygwin 中工作。当我在 cli(不是 bash/cygwin)上执行 find 时,无论我输入什么,我都会得到同样的错误。
我正在使用此变量来获取一个或多个与我需要的值相匹配的值。 var mail = $("#dat").contents().find("td:contains('" + name + "')" ).si
请原谅这个长问题。我只是不确定解决这个问题的最佳方法是什么。 我有一个电子表格(Google 表格),其中包含用户和地址列表,我需要从中创建邮寄标签。该电子表格是从我们的学生信息系统导出的。这些地址应
我正在 Excel VBA 中创建一个公式,以解析单元格中以逗号分隔的“部分”列表。在另一个工作表中查找具有该零件名称的单元格,然后使用找到的该单元格的地址来获取同一行不同列的零件成本。我为此工作了数
我被要求在网络应用程序上实现一些电子邮件地址验证 - 我确信我们都已经经历过一千次了...但是,这一次我被要求在域上进行 MX 查找查看它是否接受电子邮件。 有人知道这样做有任何潜在的问题吗? mx
我有一个切换按钮,可读取.wave文件,并且字符串更改为暂停,然后..... 我的问题是,当用户播放声音时,按钮字符串更改为暂停,结束声音后,该字符串仍为暂停状态,我想将其更改为播放。但是我不知道如何
对于令人困惑的标题提前表示歉意。我的问题如下,我在大约 600 个文件中有以下文本: $_REQUEST['FOO'] 我想将其替换为以下内容: $this->input->post('FOO') 为
我正在使用 Ansible 的查找功能查找 INI 文件中的值。这是文档中的示例: - debug: msg="User in integration is {{ lookup('ini', 'use
我是一名优秀的程序员,十分优秀!