我正在尝试搜索所有表和列中的某个值,并且使用 php 连接到 IBM DB2 数据库。我想知道该错误是否是由于多次使用联合造成的。
这是我的错误消息:
Improper use of a string column, host variable, constant, or function "NAMABARANG". SQLSTATE=42907 SQLCODE=-134
这是我的代码:
$keyword=$_GET['keyword'];
$query="SELECT * FROM INVENTORY WHERE NAMABARANG LIKE '%".$keyword."%'".
" UNION ALL SELECT * FROM INVENTORY WHERE ARRIVALDATE LIKE '%".$keyword."%'".
" UNION ALL SELECT * FROM INVENTORY WHERE PAPERNUMBER LIKE '%".$keyword."%'".
" UNION ALL SELECT * FROM INVENTORY WHERE SERIALNUMBER LIKE '%".$keyword."%'".
" UNION SELECT * FROM INVENTORY WHERE CONDITION LIKE '%".$keyword."%'".
" UNION ALL SELECT * FROM INVENTORY WHERE LOCATION LIKE '%".$keyword."%'".
" UNION ALL SELECT * FROM INVENTORY WHERE CONFIRMATIONDATE LIKE '%".$keyword."%'".
" UNION ALL SELECT * FROM INVENTORY WHERE BARCODE LIKE '%".$keyword."%'".
" UNION ALL SELECT * FROM USERANDPASSWORD WHERE USERNAME LIKE '%".$keyword."%'";
" UNION ALL SELECT * FROM USERANDPASSWORD WHERE ACCESS LIKE '%".$keyword."%'";
查看有关该错误消息的信息here http://publib.boulder.ibm.com/infocenter/db2luw/v9r5/index.jsp?topic=/com.ibm.db2.luw.messages.sql.doc/doc/msql00134n.html。问题似乎是NAMABARANG
是长字符/clob 类型之一,在执行分组的查询中使用它是非法的。此查询执行分组,因为子查询之一使用UNION
而不是UNION ALL
. UNION
删除重复行时进行分组。
像这样的查询可能不应该返回所有列(SELECT *
)。相反,只返回您真正需要的内容。可能是一个 ID 列,可以标识匹配的每一行,以及匹配的列和表的名称。这将消除错误。
其他几点:
-
你的代码非常不安全!您直接从表单获取参数并将其插入到 SQL 中。有人可以利用它来做各种邪恶的事情,甚至从数据库中删除表。请看一下这个问题的第一个答案 https://stackoverflow.com/questions/60174/how-to-prevent-sql-injection-in-php在查询中使用用户输入的数据的安全方法。
-
您正在合并两个不同表中的行 Does
USERANDPASSWORD
具有与完全相同的列INVENTORY
?否则,这个联盟就无法运作。通过不选择来解决这个问题*
,而是从每个表中选择一组相似的列。
-
联合还是全部联合?如果多列包含搜索字符串,您是否希望从单行返回多个匹配项?如果是这样,请使用
UNION ALL
。否则,使用UNION
删除重复项。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)