在MySQL内部引用麻烦的引号和空格

时间:2016-01-12 06:39:05

标签: php mysql pdo replace trim

我有一长串电气设备列表,详细信息中包含每个电气元件的信息。 (大约1k行)。

因此,对于LG,我有一个类似的细节:LG SCREEN 40''

现在我有了这个查询inisde my PHP page:

$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%的原因是因为我的客户端使用多个空格添加了一些数据所以我有一些类似的变量:LG LED 32''(我不知道他为什么这么做)这个当我想选择这种类型的细节时,空格会出错。

因此%的使用给了我这个错误:

  

PDOException:SQLSTATE [42000]:语法错误或访问冲突:1064   您的SQL语法有错误;检查手册   对应于您的MySQL服务器版本,以便使用正确的语法   靠近'%'LED SAMSUNG 40 \'\'''

我认为数据库中的inches ''在选择和更新时遇到了一些麻烦,所以我们非常感谢您的帮助。

他们有什么方法可以消除每个细胞内的额外空间?以及如何解决英寸引用''的问题,当然还有关于like % :...的错误

1 个答案:

答案 0 :(得分:3)

<强> 1。使用like

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

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

<强> 2。删除空格

最佳解决方案是“规范化”您的类型列。用单个空格替换任何空间序列。这应该在将数据存储在表中时完成。如果没有多个空格,一切都会变得更容易。

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

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

多次重复此操作,直到查询不再影响任何行。

可能你不喜欢这样做......所以让我们来看看其他选择。

MySql提供replace()trim()用于字符串替换和删除前导/尾随空格。

trim()示例:

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

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

replace()示例

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

正如您所看到的,这确实会用一个空格替换两个空格,但结果可能会有些令人惊讶。输出字符串仍然有多个空格。

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

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

还剩一个空间: - (

您可以在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。如何解决英寸引用'

的问题

我真的相信你对引号没有问题。当使用预备语句时,需要注意避免这些字符。