我有一个小应用程序,我收集用户输入并根据输入返回一组结果。输入是邮政编码,例如,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>";
这是有效的,无论大小写都会返回结果。我可以存储没有空格的数据,但我希望向用户显示正确的格式。
答案 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
注意:
postcode
上的索引使用任何好处。like
运营商呆在一起,虽然因为这里没有外卡,一个简单的=
应该可以做到这一点%
在线2,根据以下评论。答案 2 :(得分:0)
根据LSOA_postcodes的大小,您可能会遇到使用REPLACE的性能问题,因为它不太可能使用索引扫描。
我会检查$ input以查看它是否包含空格,如果其长度为&gt;则添加一个空格。 3 - 所有在PHP中然后让SQL按照原始问题进行搜索。