3

我正在尝试在所有表和列中搜索某个值,并且我正在使用 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."%'";
4

1 回答 1

2

在此处查看有关该错误消息的信息。问题似乎NAMABARANG是长字符/ clob 类型之一,在执行分组的查询中使用它是非法的。此查询执行分组,因为其中一个子查询使用UNION而不是UNION ALL. UNION删除重复行时进行分组。

像这样的查询可能不应该返回所有列 ( SELECT *)。相反,只返回你真正需要的东西。可能是一个 ID 列,可以识别匹配的每一行,以及匹配的列和表的名称。这将消除错误。

其他几点:

  • 您的代码非常不安全!您直接从表单中获取参数并将其插入 SQL。有人可以用它来做各种邪恶的事情,甚至从你的数据库中删除表。请查看此问题的第一个答案,了解在查询中使用用户输入数据的安全方式。
  • 您正在合并来自两个不同表的行 是否USERANDPASSWORD具有与 完全相同的列INVENTORY?否则,这个工会将无法运作。通过不选择 解决此问题*,而是从每个表中选择一组相似的列。
  • 联合还是联合所有?如果多列包含搜索字符串,是否要从单行返回多个匹配项?如果是这样,请使用UNION ALL. 否则,用于UNION删除重复项。
于 2013-04-02T13:49:27.757 回答