ユーザーがシリーズのタイトルを使用してデータベースを検索できるようにする準備済みステートメントとして、この 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 のプリペアド ステートメント ページで &を検索しましたが、結果が表示されませんでした。
編集:
私はそれを機能させるためにこれを使用しました...
$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 を含むシリーズ (Graces And Places) でも同じ問題が発生することがわかりました。私は、そのためのレシーブ&ミニスタリング・ヒーリングの「修正」を複製することになりました。
URL クエリ (または And という単語は重要ではありません) とは何の関係もないように思われますが、準備されたステートメントとは関係ありません。