"获取"功能不起作用,因为并非所有的连字符都应该被替换

时间:2015-04-15 17:03:18

标签: php mysql pdo get str-replace

我使用Get函数在url中查找字段model但是当模型包含空格和连字符时我遇到了问题。 示例:我在网址中的模型是" this-f-example "数据库中的模型是" 这个例子" (所以没有第一个连字符)。

我编写了以下php代码,但这还不够。它只会在我的数据库中查找this f examplethis-f-example,因此它不会返回任何内容,因为这些模型不存在。

我应该如何更改代码,以便查找模型this-f examplethis f-example

完整网址:http//:www.example.com/test.php?model=this-f-example

数据库中的对应模型:this f-example

<?php
    $pdo = new PDO ('mysql:host.....');    
    $model1 = str_replace ('-', ' ', $_GET['model']);
    $model2 = $_GET['model'];

    $sql = "SELECT DISTINCT brand, model FROM `exampletable` WHERE model = :model1 OR model = :model2";

    $stmt = $pdo->prepare($sql);
    $stmt->bindParam(":model1", $model1);
    $stmt->bindParam(":model2", $model2);
    $stmt->execute();

    if($result = $stmt->fetch(PDO::FETCH_ASSOC))
    {
      echo $result['brand']; 
      echo $result['model'];
    }
?>

2 个答案:

答案 0 :(得分:3)

如果您在网址中发送的变量model必须为this-f-example,则可以使用preg_replace代替str_replace来获取model1 model2 }和$modelUrl= $_GET['model']; $model1 = preg_replace('/-/', ' ', $modelUrl, 1);//remove the first hyphen $occ = preg_match_all('/-/', $modelUrl, $matches, PREG_OFFSET_CAPTURE); if ($occ !== false && $occ > 1) { //remove the second hyphen $model2 = substr_replace($modelUrl, ' ', $matches[0][2][1], strlen('-')); } $params = array(":model1"=> $model1, ":model2"=> $model2); $sql = "SELECT DISTINCT brand, model FROM `exampletable` WHERE model=:model1 OR model=:model2"; $stmt = $pdo->prepare($sql); $stmt->execute($params); 表示网址中的模型。

尝试使用此代码:

+

但如果您的问题只是变量中的空格,我认为更好的解决方案是使用urlencode()函数,该函数将使用echo urlencode('this f-example'); // output : this+f-example 对varibale中的空间进行编码:

$GET['model']

当您使用+获取时,只需使用urldecode()函数解码varibale并删除echo urldecode($GET['model']); // output : this f-example

{{1}}

希望这可以提供帮助。

答案 1 :(得分:2)

您可以使用 Regular Expressions

// turn 'this-f-model' to 'this[- ]f[- ]example'
$model = str_replace ('-', '[- ]', $_GET['model']);

$sql = "SELECT DISTINCT brand, model FROM `exampletable` WHERE model REGEXP :model";

$stmt = $pdo->prepare($sql);
$stmt->bindParam(":model", $model);
$stmt->execute();