【问题标题】:SQL - Query fails *unless* string is broken up into number and letters and then concatenatedSQL - 查询失败*除非*字符串被分解为数字和字母然后连接
【发布时间】:2023-12-07 21:28:01
【问题描述】:

我有以下 SQL 查询,它返回 DocNumber 的发票:

"SELECT * FROM Invoice WHERE DocNumber = '" . $id . "'"

这里,$id 包含一个类似于以下示例的字符串:

M10045
M10046
M10046 

此查询失败除非我将$id 分成'M''10045' 并在查询中连接它们,如下所示:

preg_match('/\d+/', $id, $id_number, PREG_OFFSET_CAPTURE);
preg_match('/[A-Z]+/', $id, $id_letter, PREG_OFFSET_CAPTURE);

"SELECT * FROM Invoice WHERE DocNumber = '" . $id_letter[0][0] . $id_number[0][0] . "'"

什么可能导致这种问题?

注意,在查询中使用$id 会返回一个空数组,因为没有找到匹配项。拆分$id 的字母和数字部分会返回一个发票对象。

【问题讨论】:

  • 你确定 $id 中没有换行符/制表符吗?
  • 你的数据是什么样的? M 和数字之间可能有空格
  • echo count($id);的返回值是多少?
  • 如果您看不到 $id 末尾的尾随空格或其他空格,您可能需要修剪()该值。
  • 一定有某种奇怪的字符,因为使用 preg_match 和 /\w+/ 也可以。

标签: php mysql sql quickbooks-online


【解决方案1】:

请尝试

$id =  trim($id);

$id =  preg_replace('/[^\w]/', '', $id);
$query = "SELECT * FROM Invoice WHERE DocNumber = '$id'";

删除所有不是 AlphaNum 破折号或下划线的字符。

【讨论】:

  • 我认为 trim() 是最好的解决方案。
  • 上面的解决方案还会删除元数据,例如回车和换行符,请记住这一点。