Php 处理打字脚本中的空数据包装

Php 处理打字脚本中的空数据包装,php,typo3,typoscript,Php,Typo3,Typoscript,我“继承”了以下打字脚本片段,当在tx\U扩展\U域\U模型\U项记录中引用时,该片段应生成呈现的tt\U内容记录: 当引用的内容字段引用了一些实际内容时,这种方法可以正常工作。该值将是tt\U内容uid。如果情况并非如此,wrap3语句将导致uid in,正如预期的那样,这将抛出一个SQL错误 我已经尝试将required=1添加到.select.andWhere.stdWrap.cObject配置中,这会导致在没有引用任何内容时从pidInList中的pid获取所有内容,因为当该字段为空时,

我“继承”了以下打字脚本片段,当在tx\U扩展\U域\U模型\U项记录中引用时,该片段应生成呈现的tt\U内容记录:

当引用的内容字段引用了一些实际内容时,这种方法可以正常工作。该值将是tt\U内容uid。如果情况并非如此,wrap3语句将导致uid in,正如预期的那样,这将抛出一个SQL错误

我已经尝试将required=1添加到.select.andWhere.stdWrap.cObject配置中,这会导致在没有引用任何内容时从pidInList中的pid获取所有内容,因为当该字段为空时,andWhere子句将清空


当引用的内容为空时,应该如何修改上面的脚本片段,以便呈现正确的tt\u内容记录,而不呈现任何记录?

显然应该使用ifEmpty做一些事情,但我就是做不好。直到我试图从根本上改变事情。以下是我的作品:

lib.recordBasedHighlight = CONTENT
lib.recordBasedHighlight {
    table = tt_content
    select.orderBy = sorting
    select.languageField = sys_language_uid 

    select.andWhere.stdWrap.cObject = TEXT
    select.andWhere.stdWrap.cObject {
        stdWrap {
            cObject = TEXT
            cObject {
                # NOT SAFE: GET/POST parameter is passed on to the database without sanitation
                dataWrap = DB:tx_extension_domain_model_item:{GP:tx_extension_pi1|item}:referenced_content
                wrap3 = {|}
                insertData = 1
            }
            ifEmpty.cObject = TEXT
            ifEmpty.cObject.value = 0
        }
        wrap = uid IN (|)
    }
    select.pidInList.stdWrap.cObject = TEXT
    select.pidInList.stdWrap.cObject {
        # NOT SAFE: GET/POST parameter is passed on to the database without sanitation
        dataWrap = DB:tx_extension_domain_model_item:{GP:tx_extension_pi1|item}:pid
        wrap3 = {|}
        insertData = 1
    }

    renderObj < tt_content
    renderObj.list.10 >
}
当引用的内容字段为空时,这将导致andWhere为0中的uid。这导致没有tt_内容记录被呈现,这就是我所追求的

我知道这段代码将导致一个SQL查询,而事先已知该查询不会返回任何结果,但另一种方法是编写更好的打字脚本(而不是我的强项),或者将其全部重写为userFunc。在任何情况下,这将是更多的工作,而且由于TYPO3是相当资源密集型的,所以一个查询更多不会有什么坏处。因此,我对解决方案感到满意

编辑


正如在关于原始问题的第一条评论中正确指出的那样,代码片段中有一个很大的安全遗漏:使用的GET参数在传递到数据库之前没有被清除。我没有花时间重写代码段以包含建议的安全措施,尽管在使用代码段的项目中,这并不重要,请参阅我的评论以获得更详细的解释。这并不意味着代码段在所有情况下都是安全的,这让我在回答中加入了一个警告:代码段不是天生安全的!请自行决定使用此代码段

请使用intval=1来防止SQL注入!这一点很好,尽管我不确定该放在哪里,因为它唯一适用的变量是GP:tx_extension_pi1 | item。尽管没有将expicit强制转换为整数,但这段打字脚本的实现方式它的唯一执行方式是通过控制器操作属性在GET参数中传递有效UID。我确实试图通过请求一些带有GET参数的URL和一些随机内容来向脚本传递其他信息,在代码中添加了xdebug断点来检查发生了什么,但没有向数据库传递任何信息,您能指出intval应该放在哪里以确保GET/POST参数被强制转换为整数吗?毕竟,我想补充一下我会使用OrderedStdDrap来完成这项工作,这样您就可以一步一步地完成。请参阅:更好的文档:
lib.recordBasedHighlight = CONTENT
lib.recordBasedHighlight {
    table = tt_content
    select.orderBy = sorting
    select.languageField = sys_language_uid 

    select.andWhere.stdWrap.cObject = TEXT
    select.andWhere.stdWrap.cObject {
        stdWrap {
            cObject = TEXT
            cObject {
                # NOT SAFE: GET/POST parameter is passed on to the database without sanitation
                dataWrap = DB:tx_extension_domain_model_item:{GP:tx_extension_pi1|item}:referenced_content
                wrap3 = {|}
                insertData = 1
            }
            ifEmpty.cObject = TEXT
            ifEmpty.cObject.value = 0
        }
        wrap = uid IN (|)
    }
    select.pidInList.stdWrap.cObject = TEXT
    select.pidInList.stdWrap.cObject {
        # NOT SAFE: GET/POST parameter is passed on to the database without sanitation
        dataWrap = DB:tx_extension_domain_model_item:{GP:tx_extension_pi1|item}:pid
        wrap3 = {|}
        insertData = 1
    }

    renderObj < tt_content
    renderObj.list.10 >
}