从多个MySQL表中选择字段,(1=2)意味着什么?

从多个MySQL表中选择字段,(1=2)意味着什么?,mysql,coldfusion,Mysql,Coldfusion,我正在试图理解下面的Coldfusion/MySQL查询中发生了什么,我必须更新它(我在CF/MySQL的第一个月) 我在搜索之前运行了一个查询,它将变量pl(pricelists)设置为: 然后将其“移植”到搜索查询中,这样会增加我的困惑: <cfquery datasource="ds" name="getArt"> SELECT a.* <cfif variables.module IS "yes">, p.ek, p.vk, p.waehrung, p

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

我在搜索之前运行了一个查询,它将变量pl(pricelists)设置为:


然后将其“移植”到搜索查询中,这样会增加我的困惑:

<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>
    ....

选择*、p.ek、p.vk、p.waehrung、p.onlinepreis
来自artdata
....
问题很多:
-不需要cfparam查询字段,例如qp.seller,或者是否存在?
-我是否应该始终使用ALIAS as in artdata as a而不是仅使用artdata a?
-我可以选择p.ek,p.vk。。。尽管pricelist表稍后将仅通过variable variables.pl声明(保持JOIN pricelist p on…)
-(1=0)是怎么回事?它的目的是什么?同上(3=2),(1=2)

谢谢你的启发

不需要cfparam查询字段,例如qp.seller,或者是否存在

这不是cfparam,而是cfqueryparam——这是两个执行不同任务的不同标记

使用cfqueryparam有两个关键原因:

1) 出于安全考虑-如果输入最初可能来自任何第三方,或者如果无法保证输入是已知值,请使用cfqueryparam确保不会发生SQL代码注入(故意或意外)

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

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

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

(偶尔会有人声称这会导致糟糕的执行计划,从而导致更糟糕的绩效,但我对这些说法持谨慎态度,而且在任何情况下都必须逐案处理——安全性很重要。)


我不应该总是在artdata中使用ALIAS as,而不是只使用artdata a吗

如果你喜欢多打字。:)

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


我可以选择p.ek,p.vk。。。像这样

是的,那会有用的

不过,可能希望将它们放在多行上,以使其更具可读性


尽管pricelist表稍后将仅通过变量>variables.pl声明(保持JOIN pricelist p打开…)

这是一个错误的假设

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

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

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


(1=0)是怎么回事?它的目的是什么?同上(3=2),(1=2)

正如Romain的评论所解释的,这是一种常见的表示false的方式,在动态查询中使用。括号是可选的


然而,更常见的是将其放在开头,即
其中1=0
JOIN 1=0
,然后让动态语句在后面开始
或…

-不需要对诸如qp.seller之类的查询字段进行参数设置,或者是否存在?

首先,这是
cfqueryparam
,而不是
cfparam
cfqueryparam
用于数据清理
cfparam
用于确保存在具有某种值的变量。有必要使用它吗?如果您显式地创建/设置variables.pl,则不会。但这仍然是一个很好的实践。cfqueryparam如果您或其他人稍后更改设置代码,则对数据进行参数化可以确保数据的完整性。它还可以帮助您一目了然地了解变量包含的数据类型

-我是否应该始终使用ALIAS作为artdata中的一个,而不是仅使用artdata a?

据我所知,你应该这样做。我使用的所有数据库都支持
tablename alias
语法,但我相信ANSI标准是使用
AS
,这将使您的代码更易于移植

-我可以选择p.ek、p.vk、。。。类似于此,尽管价格表仅在稍后通过variable variables.pl声明(保留JOIN pricelist p on…)

对。这是相当普遍的(至少在我工作的地方)

-这(1=0)是怎么回事?它的目的是什么?同上(3=2),(1=2)。

罗曼的评论很好地回答了这一问题。这是一个强制的真/假值。它通常在动态生成SQL语句时使用,以确保至少生成一个
WHERE
子句

关于“不需要cfparam查询字段,例如qp.seller,或者是否存在?”:有一点我还没有提到,即cfqueryparam仅在cfquery标记的上下文中有效。由于您在cfquery标记上下文之外构造SQL块,因此无法在那里为qp.seller使用cfqueryparam。因此,你有一些选择-

  • 将SQL代码移动到cfquery块中并使用cfqueryparam
  • 在数据库中创建以qp.seller为参数的存储过程或函数
  • 使用某种数据验证正则表达式来验证#qp.seller#是否为有效值
  • 什么都不做,并且相信因为您可以控制用作查询输入的数据源,所以您不必担心SQL注入(您仍然会失去一个可能的机会)
    <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>
        ....