基于文本输入和下拉选项的 PHP 查询 - 并忽略空格?
Posted
技术标签:
【中文标题】基于文本输入和下拉选项的 PHP 查询 - 并忽略空格?【英文标题】:PHP Query based on text input and dropdown option - and ignoring whitespace? 【发布时间】:2014-06-02 17:55:34 【问题描述】:我有一个包含两个表的数据库,两个表都包含邮政编码,即“SY25 6WB”我已经构建了一个查询,如果邮政编码在数据库中,该查询将在数据库中查询在文本框中输入的邮政编码,它会做一些 jquery - 一切正常,
我的目标是,首先根据邮政编码运行查询,然后如果找不到,则在下一个表中搜索邮政编码,如果下拉列表中填充了某个值。我也在寻找一种忽略空格的方法,所以如果用户输入“SY256WB”或“SY25 6WB”,它会得到相同的结果。
我在下面粘贴了我的代码。
表格:
<form action="" method="post">
Search: <input type="text" name="term" />
<select name="options">
<option value="YES">YES</option>
<option value="NO">NO</option>
</select>
<p>Enter your full postcode with spaces i.e. SA1 3XL</p>
<br />
<input type="submit" value="Submit" />
</form>
<?php
if (!empty($_REQUEST['term']))
$term = mysql_real_escape_string($_REQUEST['term']);
$benefit = mysql_real_escape_string($_REQUEST['YES']);
$sql = "SELECT * FROM cscopc WHERE POSTCODE LIKE '".$term."'";
$r_query = mysql_query($sql);
if ( mysql_num_rows($r_query) > 0 )
echo 'YES';
else if ( mysql_num_rows($r_query) == 0 )
$sqltwo = "SELECT * FROM cscowb WHERE PCODE LIKE '".$term."'";
$nextab = mysql_query($sqltwo);
if ( mysql_num_rows($nextab) > 0 )
echo 'YES WITH OPTION';
else
echo 'NO';
?>
如果有人能阐明我如何做到这一点或指出正确的方向以供参考,将不胜感激!
使用 PDO 更新了新查询:
try
$conn = new PDO('mysql:host=localhost;dbname=cscoapp', $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
catch(PDOException $e)
echo 'ERROR: ' . $e->getMessage();
$id = $_POST['term'];
if (!empty($_REQUEST['term']))
$stmt = $conn->prepare('SELECT * FROM cscopc WHERE POSTCODE = :id');
$stmt->execute(array('id' => $id));
if ($row = $stmt->fetch(PDO::FETCH_OBJ))
echo 'YEP';
else if ($_POST['benefits'] == 'yes')
$stmtwb = $conn->prepare('SELECT * FROM cscowb WHERE POSTCODDE = :id');
$stmtwb->execute(array('id' => $id));
if ($row = $stmtwb->fetch(PDO::FETCH_OBJ))
echo 'YEP';
else
echo 'nope';
【问题讨论】:
用str_replace
或preg_replace
删除空格
除非你也想删除连续的空格,否则你需要一些正则表达式
【参考方案1】:
假设您数据库中的邮政编码格式正确(即包含空格),那么您需要对用户输入进行一些验证(无论如何这是个好主意)。
这里有验证示例:United Kingdom (GB) postal code validation without regex
验证用户输入后,您可以轻松设置邮政编码格式,以便在数据库中查找。这是一个简单的例子:
// remove all spaces and upper case
$userInput = strtoupper(preg_replace('/\s+/', '', $_REQUEST['term']));
if (isValidPostcode($userInput))
// Basic postcode formatting - add a space before the last 3 characters
$formatted = substr($userInput, 0, -3) . ' ' . substr($userInput, -3);
// now look up in db using $formatted
else
// invalid postcode!
但是,如果您的数据库中的数据不是那么干净,那么您需要找到一种方法来 (a) 提高数据质量,或者 (b) 使用正则表达式搜索表:
// create a regex for your lookup: turns 'SA13XL' into 'SA1\s*3XL'
$regex = sprintf('%s\s*%s', substr($userInput, 0, -3), substr($userInput, -3));
// now look up using the regex
$statement = $db->prepare('SELECT * FROM cscopc WHERE POSTCODE REGEXP :postcode');
$statement->bindParam(':postcode', $regex);
注意:上面的例子使用了 PDO,你应该真的看看使用它,因为 mysql_
函数已被弃用。看到这个问题:Why shouldn't I use mysql_* functions in PHP?
【讨论】:
感谢您的信息!今晚我阅读了很多关于 PDO 的内容,但我无法完全理解它,因为我对 PHP/MYSQL 很陌生我的研究和报告。如果你有任何我能找到在 mysql 上使用 PDO 的好例子,他们将不胜感激。 我似乎已经完全理解了 PDO(我希望!)很快就会进行验证。我将在此处发布我的更新代码以供参考以及任何其他有类似问题的查看者,如果您可以让我知道我使用了最佳实践等,因为这对我来说是全新的 看起来不错。如果您将更新后的 PDO 更改与上面创建$formatted
邮政编码的逻辑结合起来,您应该是赢家 :-)【参考方案2】:
您可以使用 str_replace 或 preg_replace 函数删除每个出现的空格(' ')。我希望您使用 str_replace 功能。在这里,我为您提供了一些示例以寻求帮助。希望这能解决您的问题。
<?php
$str1="SY25 6WB";
$new=str_replace(' ', '', $str1);
echo "<b>Case I:</b><br>Old String : $str1<br>New String : $new";
$str2=" SY25 6WB ";
$new=str_replace(' ', '', $str2);
echo "<br><b>Case II:</b><br>Old String : $str2<br>New String : $new";
$str3="SY256WB";
$new=str_replace(' ', '', $str3);
echo "<br><b>Case III:</b><br>Old String : $str3<br>New String : $new";
$str4=" SY256WB ";
$new=str_replace(' ', '', $str4);
echo "<br><b>Case IV:</b><br>Old String : $str4<br>New String : $new";
?>
/*The output will be -
Case I:
Old String : SY25 6WB
New String : SY256WB
Case II:
Old String : SY25 6WB
New String : SY256WB
Case III:
Old String : SY256WB
New String : SY256WB
Case IV:
Old String : SY256WB
New String : SY256WB
*/
【讨论】:
以上是关于基于文本输入和下拉选项的 PHP 查询 - 并忽略空格?的主要内容,如果未能解决你的问题,请参考以下文章