2014-09-30 69 views
2

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

这是目前我所拥有的。

<?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

UPDATE

刚刚有了一个突然的想法,并与此想出了:

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

这个工作从第一眼计划。有没有我用这个看不到的问题?

0

你可以修剪空间上=标志两侧:

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

注:

  1. 你使用任何利益上的指数postcode,如果你有一个。
  2. 我留在了 like运营商像OP建议,虽然因为在这里没有外卡,一个简单的 =应该做的伎俩 - 没有注意到使用%在线2,按照下面的评论。
+0

我使用LIKE,因为我相信这会使其不敏感。这不是这种情况吗? – 2014-09-30 14:42:45

+0

@Darryl不,事实并非如此。大小写(in)的敏感度由[字符串的排序规则](http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html)控制,该函数同时影响“like”和“=”。 – Mureinik 2014-09-30 14:45:53

+0

谢谢。很高兴知道。我还记得我使用LIKE的另一个原因,这是因为我在第2行使用了通配符,以允许用户输入邮编的开头。 – 2014-09-30 14:54:30

0

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

我会检查$ input以查看它是否包含空格,如果其长度大于3,则添加一个 - 全部在php中,然后让SQL按照原始问题执行搜索。

+0

表格将大约200,000行。 – 2014-09-30 14:58:14

+1

有没有邮政编码的索引?如果是这样,你**会想要利用它。如果您控制应用程序正在访问的数据库并且没有索引,请考虑添加一个索引。 – 2014-09-30 15:06:33

+0

我已经为该表添加了一个索引。非常感谢。 – 2014-10-01 19:10:58