基于文本输入和下拉选项的 PHP 查询 - 忽略空格?

标签 php mysql

我有一个包含两个表的数据库,两个表都包含 zip ,即“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

<?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';
        }
    }

最佳答案

假设数据库中的邮政编码格式正确(即包含空格),那么您需要对用户输入进行一些验证(无论如何这是个好主意)。

这里有验证的例子: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?

关于基于文本输入和下拉选项的 PHP 查询 - 忽略空格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24000494/

相关文章:

php - 为什么我无法使用准备函数通过 PDO 更新行?

php - 我怎样才能使这个 PHP $_POST 更安全? - 或者它已经安全了吗?

javascript - 数据库数据重新排列/转换的最佳实践?

mysql - 如何通过 data.stackexchange.com 获取每个标签的问题和答案?

mysql - 使用选择联合构建 MySQL View

mysql - 加入两个选择查询,但一个被分组

php - mysql 获取数组(LIKE%)

php - 如何测试生成的 php 文件?

php - CakePHP:防止 URL 中的 GET 表单字段

mysql - 多对多关系连接表不保存数据