gpt4 book ai didi

php - 英寸引号和空格在 MySQL 内部造成麻烦

转载 作者:行者123 更新时间:2023-11-29 05:14:41 27 4
gpt4 key购买 nike

我有一长串电气设备 list ,其中有一列用于详细信息,其中包含每个电气组件的信息。 (大约 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% 的原因是因为我的客户使用多个空格添加了一些数据,所以我有一些这样的变量:LG LED 32'' (我什至不知道他为什么这样做)当我想选择这种类型的详细信息时,这个空间会出错。

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

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 '' 在选择和更新时造成了一些麻烦,因此不胜感激。

他们有什么方法可以去除每个单元格内的多余空间吗?以及如何解决 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。删除空格

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

编辑 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。以及如何解决inches quote ''的问题

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

关于php - 英寸引号和空格在 MySQL 内部造成麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34737064/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com