英寸引号和空格在 MySQL 内制造麻烦

Inches quotes and spaces making troubles inside MySQL

我有一长串电气设备清单,其中有一列用于详细信息,其中包含每个电气组件的信息。 (大约 1k 行)。

所以对于 LG,我有这样的详细信息:LG SCREEN 40''

现在我的 PHP 页面中有这个查询:

$type = $_REQUEST['type'];
$details = $_REQUEST['details'];
$quantity = $_REQUEST['quantity'];
$price = $_REQUEST['price'];
$update = "SELECT * FROM purchases
              WHERE sale_type = :type AND sale_details LIKE %:details%";
$prepUpd = $conn->prepare($update);
$prepUpd->bindValue(':type', $type);
$prepUpd->bindValue(':details', $details);
$prepUpdExec = $prepUpd->execute();
$result = $prepUpd->fetchAll();

我添加 LIKE %:details% 的原因是因为我的客户使用多个 space 添加了一些数据,所以我有一些这样的变量:LG LED 32''(我什至不知道为什么他做了这个)和这个space当我想要select这种类型的细节时出错。

所以使用 % 给我这个错误:

PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%'LED SAMSUNG 40\'\'''

而且我认为数据库中的 inches '' 在 select 更新和更新时遇到了一些麻烦,因此非常感谢您的帮助。

他们有什么方法可以删除每个单元格中多余的 space 吗?以及如何解决inches quote ''的问题,当然还有关于like % :...

的错误

1.使用 like

您必须将 % 添加到要查询的值,而不是您的 sql 语句。

$details = '%' . $_REQUEST['details'] .'%';
$update = "SELECT * FROM purchases WHERE sale_type = :type AND sale_details LIKE :details";
$prepUpd = $conn->prepare($update);

2。删除 spaces

最佳解决方案是 "normalize" 您的类型列。用单个 space 替换任何 space 序列。在 table 中存储数据时应该这样做。如果没有多个 space,一切都会变得容易得多。

编辑 1: 如果您想手动清理数据,可以使用以下 sql 命令

update purchases set sale_type = replace(sale_type,'  ',' ');

重复多次,直到不再有行受到查询的影响。

可能您不喜欢这样做...那么让我们看看替代方案。

MySql 提供 replace()trim() 用于字符串替换和删除 leading/trailing spaces.

trim() 示例:

select trim('     XXX     '); # result 'XXX'

这是一个很好的结果,很有用,但现在问题来了...

replace() 例子

# Replace two spaces by one space
select replace('     XXX     ','  ',' '); # result'   XXX   '

如您所见,这确实会将两个 space 替换为一个 space,但结果可能会令人惊讶。输出字符串仍然会有多个 spaces.

使用多个 replace() 调用以获得更好的结果可能很诱人:

# replace three spaces by one space, than replace two spaces by one space
select replace(replace('     XXX     ','   ',' '),'  ',' '); # result: ' XXX '

还剩下 space :-(

您可以在 replace() 中使用尽可能多的 replace(),但您永远不会得到适用于所有情况的解决方案。

结论:可能在很多情况下有效,但在所有情况下都无效。

如果你仍然想将 replace() 应用到你的代码中,那么可以这样尝试:

$update = "SELECT * FROM purchases
          WHERE replace(sale_type,'  ',' ') = replace(:type,'  ',' ') AND sale_details LIKE %:details%";

编辑 2 您可以从 = 切换到 like

// Replace each sequence of spaces with "% %"
$type = preg_replace('/\s+/','% %',$type);
$update = "SELECT * FROM purchases WHERE sale_type like :type AND sale_details LIKE %:details%";

3。以及如何解决 inches quote ''

的问题

我真的相信你对引号没有问题。使用准备好的语句时,请注意转义这些字符。