我有这段 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($_GET["series"]))
了,每一个都是单独的。
在 SQL 服务器上,传递相同的查询(使用标题)就可以了。
SELECT *
FROM [Radio].[dbo].[Schedule]
where Series like 'Receiving & Ministering Healing'
我的猜测是问题出在准备好的语句的执行或绑定参数中。
我在PHP 的 Prepared Statements 页面上搜索了 &,但没有看到任何结果。
编辑:
我用它来让它工作......
$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:
我发现一个带有 WORD And in it (Graces And Places) 的系列出现了同样的问题。我最终复制了我的“修复”来接受和施助医治。
我似乎与 URL 查询(或单词 And 无关紧要)没有任何关系,而是准备好的语句。