MySQL收集结果而不考虑空格

时间:2014-09-30 14:26:57

标签: php mysql pdo

我有一个小应用程序,我收集用户输入并根据输入返回一组结果。输入是邮政编码,例如,pl4 7by。它之间有空格。这是存储数据的格式。我希望从搜索返回适用的邮政编码,即使用户输入时没有空格或多个空格。

这是我现在所拥有的。

<?php
$input = $_GET["input"] . "%";
try{
    $handler = new PDO();
}
catch (PDOException $e){
    echo "Connection failed: " . $e->getMessage();
}

$stmt = $handler -> prepare("
    SELECT * FROM `LSOA_postcodes` WHERE postcode LIKE :input LIMIT 20
");
$stmt -> execute([
    ":input" => $input
]);

echo "<table>";
echo "<tr><th>Postcode</th><th>LSOA Code</th><th>LSOA Name</th></tr>";

while($row = $stmt -> fetchObject()){
    echo "<tr>";
    echo "<td>", $row -> postcode, "</td>";
    echo "<td>", $row -> code, "</td>";
    echo "<td>", $row -> name, "</td>";
    echo "</tr>";
}
echo "</table>";

这是有效的,无论大小写都会返回结果。我可以存储没有空格的数据,但我希望向用户显示正确的格式。

3 个答案:

答案 0 :(得分:0)

更新

突然想到并想出了这个:

SELECT * FROM `LSOA_postcodes` WHERE REPLACE(postcode, ' ', '') LIKE REPLACE(:input,' ', '') LIMIT 20

这是第一眼看到的计划。有什么问题我不能用这个看到吗?

答案 1 :(得分:0)

您可以修剪=符号两侧的空格:

SELECT * 
FROM   `LSOA_postcodes` 
WHERE  REPLACE(postcode, ' ', '') LIKE REPLACE(:input, ' ', '') 
LIMIT  20

注意:

  1. 如果你有一个索引,你将对postcode上的索引使用任何好处。
  2. 我和OP建议的like运营商呆在一起,虽然因为这里没有外卡,一个简单的=应该可以做到这一点 - 没注意到使用%在线2,根据以下评论。

答案 2 :(得分:0)

根据LSOA_postcodes的大小,您可能会遇到使用REPLACE的性能问题,因为它不太可能使用索引扫描。

我会检查$ input以查看它是否包含空格,如果其长度为&gt;则添加一个空格。 3 - 所有在PHP中然后让SQL按照原始问题进行搜索。