Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用MYSQL查询根据用户输入选择列名称_Php_Mysql_Contains - Fatal编程技术网

Php 使用MYSQL查询根据用户输入选择列名称

Php 使用MYSQL查询根据用户输入选择列名称,php,mysql,contains,Php,Mysql,Contains,使用PHP,安全用户将输入Ref(例如NB093019),查询将用于确定哪些PO具有该Ref,以及它们是否具有任何数量。问题是,我们有86列要检查Ref是否在中,一旦它找到了它所在的列,如何检查包含该数量的对应列(该表无法编辑) 我可以在PHP中使用86条if-else语句,然后在每个PHP语句中使用更多if-else语句。一旦我做了初始查询,我就没有启动点了 select 'remainder'as prefix, po, *comments,*GuideRef, *Qty from rem

使用PHP,安全用户将输入Ref(例如NB093019),查询将用于确定哪些PO具有该Ref,以及它们是否具有任何数量。问题是,我们有86列要检查Ref是否在中,一旦它找到了它所在的列,如何检查包含该数量的对应列(该表无法编辑)

我可以在PHP中使用86条if-else语句,然后在每个PHP语句中使用更多if-else语句。一旦我做了初始查询,我就没有启动点了

select 'remainder'as prefix, po,  *comments,*GuideRef, *Qty
from remainder 
where  ('NB092419')IN (NWANTcomments,NWANTGuideRef,NWANTpreviouscomments,
                        NWANTpreviousGuideRef,NWANTprevious2comments,
                        NWANTprevious2GuideRef, BPrev2GuideRef, 
                        BPrev2comments, BPrevGuideRef, BPrevcomments, 
                        aGuideRef, Mcomments,MGuideRef,acomments,
                        MAGuideRef,BOGuideRef ) 
group by po

我已经删除了一些in()信息,因此它并不长,*comments、*GuideRef、*Qty将由in()语句中的哪一列返回信息来决定。这是可能的吗

您也许可以编写一个SQL来编写SQL:

 select REPLACE(
   'SELECT ''{colstub}GuideRef'' as which, {colstub}Qty FROM remainder WHERE {colstub}Ref like ''%somevalue%'' UNION ALL',
   '{colstub}',
   REPLACE(column_name, 'GuideRef', '')
 )  
 FROM information_schema.columns 
 WHERE table_name = 'remainder' and column_name LIKE '%Ref'
它就像“将所有列名从信息架构中拉出,其中列名类似于%guideref,将guideref替换为nothing以仅获取更改的列名片段:
NWANTguideref->NWANT,NWANTpreviousguideref->NWANTprevious…
然后使用此存根形成一个查询,该查询给出一个描述列名的字符串,数量列中的数量,其中相关的guideref列类似于某个值“

如果运行此命令,将生成如下结果集:

SELECT 'aGuideRef' as which, aQty FROM table WHERE aGuideRef LIKE '%lookingfor%' UNION ALL 
SELECT 'bGuideRef' as which, bQty FROM table WHERE bGuideRef LIKE '%lookingfor% ...
因此,它基本上是把一堆本身就是SQL的字符串放进去的。它可能需要一些微调,希望您的所有列都像
xQty、xGuideRef、xComments
三元组一样可靠而严格,但它基本上为您编写了大部分查询

如果随后将结果集从结果网格中复制并粘贴回查询窗口,则删除最后一个UNION ALL并运行它,它将搜索列并告诉您在哪里找到它以及数量

对于生产系统来说,它不太有用,但是您可以在php中执行相同的操作—运行查询,将字符串放入另一个sql命令,然后重新运行它

我建议你考虑改变你的表结构:

前缀、数量、指南参考、注释

你不应该有86个基本相同的列;你应该有一个86/3不同值的列,然后你可以只查询guideref和类型。如果这是一个地址表,我是说你**不应该*有HomeZipcode、WorkZipcode、UniversityZipcode、MomZipcode、DadZipcode..每次你想存储一个其他类型的地址您可以添加更多列(BoyfriendZipcode、GirlfriendZipcode、Child1Zipcode…)。相反,如果您只有一个“addresstype”列,那么您可以存储任意数量的不同类型的地址,而无需重新编译应用程序和更改数据库模式


您可以使用此技术来重新调整表的形状—编写一个SQL来编写一组UNION ALL SQL(没有WHERE子句),其中一列应该是“recordtype”列(来自colstub),而其他列应该只是“qty”、“guide”、“comments”“.一旦你有了工会的结果集,你就可以制作一张表格来容纳这4件事,然后把
插入新表格
放在工会区的最前面

@riggsfully这个问题到底是怎么重复的?这根本不可能接近我要问的——对不起,触发得有点快。”。误读了问题你可以给我们看一下你的问题的相关部分吗schema@Bookcellar我对php不是很在行,但如果我这样做的话,我可能会运行
SELECT*FROM table WHERE null=null
,得到一个空的结果集,告诉我列名,然后在应用程序中构建一个sql字符串,该字符串本质上是一个
选择'aRef'作为whichColumn,aQty从表中选择'bRef'作为whichColumn,bQty表中的bRef(如“%LookingForing%”…
)异常出色——这非常完美——必须做一些轻微的调整,但可以节省我很多时间,如果不是这样的话,很幸运,当用户从网格输入数据时,列必须保持这种状态,有时每列都包含相同SKU的不同信息。。这个表在我们的系统中使用了50次——我确实理解每个人对结构的看法,但它必须保持这种状态