DB2错误字符串列、主机变量、常量或函数的使用不当


DB2 error Improper use of a string column, host variable, constant, or function

我正在尝试搜索所有表和列中的某个值,并使用php连接到IBMDB2数据库。我想知道这个错误是否是由于多次使用联合引起的。

这是我的错误信息:

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."%'";

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

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

其他几点:

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