У меня есть этот кусок кода PHP (сокращенном для краткости) как подготовленное заявление, которое позволяет пользователю осуществлять поиск по базе данных, используя название серии ...«и» А «и» В подготовленном заявлении Failing
$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's Prepared Statements page за &, но не получил никаких результатов.
Edit:
Я использовал это, чтобы заставить его работать ...
$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";
Я уверен, что это ужасный способ сделать это, но никакой другой вариант не работает. Конечно, это работает только в этом конкретном случае. Я приветствую лучшее решение.
Edit 2:
Я обнаружил, что ряд с СЛОВОМ И в нем (грации и мест) представляет один и тот же вопрос. Я закончил тем, что дублировал мое «исправление» для получения &.
Я, похоже, не имеет ничего общего с запросом URL (или слово «И не имеет значения»), но подготовленное утверждение.
Посмотрите на фактический запрос, который запускается на выполнение (т.е. 'PDO :: queryString'). Вы увидите, что это не так, как вы думаете, потому что '&' имеет особое значение в URL-адресах, поэтому '$ _GET ['series']' не то, что вы ожидаете. – NullUserException
Пожалуйста, 'var_dump ($ _ GET)'. Я подозреваю, что вы создаете тег '' вручную, и вы не кодируете '&'. –
'http://www.flcbranson.org/api/radio/?series=Receiving & Ministering Healing' (введенный в адресную строку моего веб-браузера) является адресом, о котором идет речь. В данный момент я не пытаюсь связать что-либо (в этот момент я бы назвал htmlentities() »). Но '&' не будет успешным в запросе 'SELECT * FROM [Radio]. [Dbo]. [Schedule], где Series напоминает« Получение & «Превращение в исцеление», поэтому я не вижу, что это вариант. – doubleJ