Php &引用&&引用;及;及;在事先准备好的声明中

Php &引用&&引用;及;及;在事先准备好的声明中,php,sql,pdo,prepared-statement,Php,Sql,Pdo,Prepared Statement,我将这段PHP代码(为简洁起见进行了删节)作为一条准备好的语句,允许用户使用一个系列标题在数据库中搜索 $series = null; if (isset($_GET["series"])) $series = $_GET["series"]; try { $dbh = new PDO("sqlsrv:Server=localhost;Database=Radio", "", ""); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::

我将这段PHP代码(为简洁起见进行了删节)作为一条准备好的语句,允许用户使用一个系列标题在数据库中搜索

$series = null;
if (isset($_GET["series"])) $series = $_GET["series"];

try {
    $dbh = new PDO("sqlsrv:Server=localhost;Database=Radio", "", "");
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    if (isset($series)) {
        $sql = "SELECT *
            FROM dbo.Schedule
            WHERE dbo.Schedule.Series LIKE :series
            ORDER BY dbo.Schedule.Date ASC";
    }
    $stmt = $dbh->prepare($sql);
    if (isset($series)) {
        $stmt->execute(array(":series" => $series));
    }
    $stmt->setFetchMode(PDO::FETCH_ASSOC);
    $dbh = null;
}
catch(PDOException $e) {
    echo $e->getMessage();
}
对于不包含&的任何系列标题,它都可以正常工作,但对于包含&的任何系列标题,它都会失败(不产生任何结果)

例如,丰富的能力可以工作,但接收和服务治疗却不能(即使两者都在数据库的系列字段中)

我尝试了
htmlspecialchars(rawurlencode($\u GET[“series”])
,并且每个都是单独的

在SQL server上,传递相同的查询(使用标题)效果很好

SELECT *
FROM [Radio].[dbo].[Schedule]
where Series like 'Receiving & Ministering Healing'
我的猜测是,问题在于预处理语句的执行或参数绑定

我在上搜索了&,但没有看到任何结果

编辑:

我用这个让它工作

$series = null;
if (isset($_GET["series"])) $series = $_GET["series"];
$queries = parse_url($_SERVER['QUERY_STRING']);
if (substr($queries["path"], 7) == "Receiving%20&%20Ministering%20Healing") $series = "Receiving & Ministering Healing";
我相信这是一个可怕的方法,但没有其他选择是有效的。当然,这只适用于这种特殊情况。我欢迎更好的解决方案

编辑2:

我发现一个有单词和单词的系列(Graces和Places)呈现了相同的问题。我最终复制了我的“修复”来接受和服务治疗


我似乎与URL查询(或单词和无关紧要)无关,但与准备好的语句无关。

这可能有多个原因。
&
字符在多个层面上都是邪恶的,在这种情况下,这两个似乎相关:

您的请求可能是这样的(
&
在下面突出显示的符号)

因为URL的标题没有转义。这意味着(&C)字符将标记一个新的参数名称,并将
系列
截断为
接收
,而不是完整的标题
接收和管理
,从而导致查询:

SELECT *
FROM [Radio].[dbo].[Schedule]
where Series like 'Receiving '
您可能应该向我们展示如何组合请求的URL,以便能够推荐更合适的解决方案,但您应该使用来转义GET参数中使用的值

或者问题可能是(但现在不是这种情况)您将值写错了

单个
&
字符在HTML中无效!正确的转义是
&

您应该对选择查询的输出进行HTML编码,包括:

是正确的请求。这是URL编码的。您必须对其进行解码:

$decodedTitle = urldecode($_GET['series']);

在查询中使用…

可能有多个原因。在多个层面上,
&
字符是邪恶的,在这种情况下,这两个似乎是相关的:

您的请求可能是这样的(
&
在下面突出显示的符号)

因为URL的标题没有转义。这意味着(&C)字符将标记一个新的参数名称,并将
系列
截断为
接收
,而不是完整的标题
接收和管理
,从而导致查询:

SELECT *
FROM [Radio].[dbo].[Schedule]
where Series like 'Receiving '
您可能应该向我们展示如何组合请求的URL,以便能够推荐更合适的解决方案,但您应该使用来转义GET参数中使用的值

或者问题可能是(但现在不是这种情况)您将值写错了

单个
&
字符在HTML中无效!正确的转义是
&

您应该对选择查询的输出进行HTML编码,包括:

是正确的请求。这是URL编码的。您必须对其进行解码:

$decodedTitle = urldecode($_GET['series']);

在查询中使用它…

看看实际执行的查询(即:
PDO::queryString
)。你会发现它不是你想象的那样,因为
&
在URL中有特殊的含义,所以
$\u GET['series']
不是你所期望的。请
var\u dump($\u GET)
。我怀疑您正在手动创建一个
标记,并且您没有编码
&
http://www.flcbranson.org/api/radio/?series=Receiving &Ministing Healing
(输入到我的web浏览器的地址栏)就是所讨论的地址。目前我不想链接任何内容(此时,我将使用前面提到的“htmlentities()”),但是
&;
在查询
SELECT*FROM[Radio].[dbo].[Schedule]时不会成功where系列,如“接收和管理治疗”
,因此我不认为这是一个选项。
&;
是一个HTML实体。URL需要
%26
。@doubleJ在将结果写入HTML时需要htmlentities,而不是在组装查询字符串时…查看执行的实际查询(即:
PDO::queryString
)。你会发现它不是你想象的那样,因为
&
在URL中有特殊的含义,所以
$\u GET['series']
不是你所期望的。请
var\u dump($\u GET)
。我怀疑您正在手动创建一个
标记,并且您没有编码
&
http://www.flcbranson.org/api/radio/?series=Receiving &Ministing Healing
(输入到我的web浏览器的地址栏)就是所讨论的地址。目前我不想链接任何内容(此时,我将使用前面提到的“htmlentities()”),但是
&;
在查询
SELECT*FROM[Radio].[dbo].[Schedule]时不会成功where系列,如“接收和管理治疗”
,所以我不认为这是一个选项。
&;
是一个HTML实体。URL需要
%26
。@doubleJ在将结果写入HTML时需要htmlentities,而不是在组合查询字符串时…OP说查询没有返回结果,所以是第一个如前所述,我尝试了
htmlspecialchars()
rawur
$decodedTitle = urldecode($_GET['series']);