gpt4 book ai didi

mysql - 从多个 MySQL 表中选择字段,(1=2) 是什么意思?

转载 作者:行者123 更新时间:2023-12-01 00:13:35 26 4
gpt4 key购买 nike

我试图了解在我必须更新的以下 Coldfusion/MySQL 查询中发生了什么(我在 CF/MySQL 的第一个月)。

我在搜索之前运行了一个查询,它将变量 pl(价格表)设置为如下所示:

<cfif variables.module IS "yes"> 
<cfquery datasource="ds" name="qp">
<!--- selects pricelist and seller --->
</cfquery>
<cfset variables.pl = "LEFT JOIN pricelist p ON ">
<cfoutput query="qp" >
<cfif qp.preislist IS ''>
<cfset variables.pl= variables.pl & '(p.iln = a.iln AND p.preislist = "AAA" AND p.ean = a.ean AND p.iln = "#qp.seller#") OR '>
<cfelse>
<cfset variables.pl= variables.pl & '(p.iln = a.iln AND p.preisliste = "#qp.preislist#" AND p.ean = a.ean AND p.iln = "#qp.seller#") OR '>
</cfif>
</cfoutput>
<cfset variables.pl = variables.preislisten & "(1=0)">
</cfif>

然后这被“移植”到搜索查询中,像这样增加了我的困惑:

<cfquery datasource="ds" name="getArt">
SELECT a.* <cfif variables.module IS "yes">, p.ek, p.vk, p.waehrung, p.onlinepreis</cfif>
FROM artdata a
<cfif variables.module IS "yes">
<cfqueryparam cfsqltype="cfsql_varchar" value="#variables.pl#">
</cfif>
....

很多问题:
- 不需要 cfparam 查询字段,例如 qp.seller,还是有?
- 我不应该总是像在 artdata AS a 中那样使用 ALIAS 还是只使用 artdata a
- 我可以像这样选择 p.ek, p.vk, ... 虽然价目表只会在稍后通过变量 variables.pl 声明(variables.pl em>LEFT JOIN pricelist p ON...)
- (1=0) 怎么了?它的目的是什么? Dito (3=2), (1=2).

多谢指教!

最佳答案

there is no need to cfparam query fields such as qp.seller, or is there?

这不是 cfparam,而是 cfqueryparam - 这是执行不同任务的两个不同标签。

使用 cfqueryparam 有两个主要原因:

1) 安全 - 如果输入最初可能来自任何第三方,或者如果您不能保证输入是已知值,请使用 cfqueryparam 以确保不会发生 SQL 代码注入(inject)(有意或无意)。

2) 对于性能 - 查询参数会产生一个执行计划,该计划可以缓存并应用于多个查询(即参数不同的地方),因此通常会提高性能。

如果 qp.seller 是一个保证安全的数字外键,您不需要它来保证安全,但从性能方面来看它仍然可能有有益的影响。

一般来说,如果有疑问,就使用它

(偶尔有人声称它会导致糟糕的执行计划,从而导致更差的性能,但我对这些说法持谨慎态度,无论如何都必须逐案处理 -案例基础 - 安全很重要。)


shouldn't I always use ALIAS as in artdata AS a vs only using artdata a?

如果你喜欢多打字。 :)

表名的 AS 关键字没有区别/好处。


Can I select p.ek, p.vk, ... like this

是的,那行得通。

可能希望将它们放在多行中以使其更具可读性。


although the pricelist table will only be declared later on through the variable > variables.pl (being LEFT JOIN pricelist p ON...)

这是一个错误的假设。

使用 cfqueryparam 专门防止 SQL 代码被注入(inject),这正是您在这里尝试用它做的。

您应该将此生成的 SQL 直接输出到将使用它的 cfquery 标记中,而不是创建 variables.pl。

(如果您不确定我的意思,我可以为此举个例子吗?)


What's up with the (1=0)? What is the purpose of it is? Dito for (3=2), (1=2).

正如 Romain 的评论所解释的那样,这是表示 false 的常见方式,在您进行动态查询时使用。括号是可选的。

然而,更常见的做法是将它放在开始 - 即 WHERE 1=0JOIN 1=0 - 然后之后开始 OR ... 的动态语句。

关于mysql - 从多个 MySQL 表中选择字段,(1=2) 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10684230/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com