2013-10-03 3 views
0

У меня есть этот кусок кода 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 (или слово «И не имеет значения»), но подготовленное утверждение.

+0

Посмотрите на фактический запрос, который запускается на выполнение (т.е. 'PDO :: queryString'). Вы увидите, что это не так, как вы думаете, потому что '&' имеет особое значение в URL-адресах, поэтому '$ _GET ['series']' не то, что вы ожидаете. – NullUserException

+0

Пожалуйста, 'var_dump ($ _ GET)'. Я подозреваю, что вы создаете тег '' вручную, и вы не кодируете '&'. –

ответ

3

Для этого может быть несколько причин. & символа зла на нескольких уровнях, в данном случае, эти два, кажется уместным:

Это может быть, что ваш запрос выглядит следующим образом (& признаки выделены под)

http://somedomain.com/somepage.php?param=something&series=Receiving & Ministering Healing 
               ^(valid)  ^(unintended!) 

потому что название не спаслось для URL-адресов. Это означало бы, что & символ знаменует собой новое имя параметра - и будет усечь series быть Receiving вместо полного названия Receiving & Ministering, в результате запроса:

SELECT * 
FROM [Radio].[dbo].[Schedule] 
where Series like 'Receiving ' 

Вы должны, вероятно, показать нам, как вы соберите URL для запроса, чтобы иметь возможность рекомендовать более подходящее решение, но вы должны использовать urlencode() для экранирования значений, которые будут использоваться в параметрах GET.

Или проблема может быть (однако теперь не в этом случае), что вы записываете значения неправильно.

Один символ & недействителен в HTML! Правильное Экранирование &

Вы должны HTML закодировать вывод из ВЫБРАТЬ запросов с htmlentities:

echo "<h1>".htmlentities($resultComingFromQuery)."</h1>"; 

EDIT

Плохим запрос, скорее всего, приведет к плохому ответу (GIGO) ... Это:

http://www.flcbranson.org/api/radio/?series=Receiving%20%26%20Ministering Healing 

является надлежащим запросом. Это URL-адрес. Вы должны расшифровать:

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

И использовать это в запросе ...

+0

OP говорит, что запрос не возвращает никаких результатов, поэтому это первая проблема. – NullUserException

+0

Как уже упоминалось, я пробовал 'htmlspecialchars()' и 'rawurlencode()'. Я просто протестировал 'urlencode()' и 'htmlentities()' и не дал результатов. – doubleJ

+1

@doubleJ ** ваш запрос плох ** попробуйте следующее: 'http: //www.flcbranson.org/api/radio/? Series = Получение% 20% 26% 20Ministering Healing', ** и ** использовать' urldecode ($ _GET ['series']) 'в коде для его декодирования. – ppeterka

Смежные вопросы