英寸引号和空格在 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 ''
的问题
我真的相信你对引号没有问题。使用准备好的语句时,请注意转义这些字符。
我有一长串电气设备清单,其中有一列用于详细信息,其中包含每个电气组件的信息。 (大约 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 ''
的问题我真的相信你对引号没有问题。使用准备好的语句时,请注意转义这些字符。