Амперсанд и хэш сбой мой MYSQL Query - PullRequest
0 голосов
/ 24 февраля 2012

Я использую этот код для получения данных из запроса MySQL.

    if ($filter == "All" && $filter != "") {date_default_timezone_set('America/Denver');
$todays123 = date("Y-m-d H:i");
$query = "SELECT * FROM events WHERE events.name LIKE '%".$search."%' AND events.user = '".$_SESSION['username']."' AND events.end > '".$todays123."'";
}else{ $todays123 = date("Y-m-d H:i");
$query = "SELECT * FROM events WHERE  events.name LIKE '%".$search."%'   AND events.price = '".$filter."' AND events.user = '".$_SESSION['username']."' AND events.end > '".$todays123."' OR events.description LIKE '%".$search."%'    AND events.price = '".$filter."' AND events.user = '".$_SESSION['username']."' AND events.end > '".$todays123."' OR events.user = '".$_SESSION['username']."' AND events.address LIKE '%".$search."%'   AND events.price = '".$filter."' AND events.end > '".$todays123."'  ";
} 

Вот мой код JavaScript

function user_display() {

var search = document.getElementById("search").value;

if (search == "" || search == null) {
    search="";
} 

var filter = document.getElementById("filter").value;

if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
    xmlhttp=new XMLHttpRequest();
} else {// code for IE6, IE5
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}

xmlhttp.onreadystatechange=function() {
    if (xmlhttp.readyState==4 && xmlhttp.status==200) {
        document.getElementById("table-content").innerHTML=xmlhttp.responseText;            
    }
}
    xmlhttp.open("GET","./xxx.php?action=display&search="+search+"&filter="+filter, true);
xmlhttp.send();

}

Правильно совпадает, если искомое значение не содержит «&» и «#». Когда я ввожу символ амперсанда или хеша, запрос падает и ничего не отображается.

Любые предложения о том, почему он это делает? Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 24 февраля 2012

Вы, вероятно, должны использовать encodeURIComponent() в своем JavaScript.Вполне вероятно, что вы не получаете результаты, потому что он ничего не передает в переменную поиска (или сокращает ее).Подумайте, если поиск "a & foo = c &".Запрашиваемый вами URL-адрес теперь xxx.php?action=display&search=a&foo=c&filter=..., поэтому вы получите еще одну переменную GET с именем foo

var search = encodeURIComponent(document.getElementById("search").value);

Сделайте то же самое для filter, если пользователь предоставит ее.

0 голосов
/ 24 февраля 2012

измени свой код, чтобы он выглядел как минимум

 $search = mysql_real_escape_string($search);
 $filter = mysql_real_escape_string($filter);
 // hopefully username in $_SESSION is clean else repeat above for that and rerun your query 
 if ($filter == "All" && $filter != "") {date_default_timezone_set('America/Denver');
 $todays123 = date("Y-m-d H:i");
 $query = "SELECT * FROM events WHERE events.name LIKE '%".$search."%' AND events.user = '".$_SESSION['username']."' AND events.end > '".$todays123."'";
 }else{ $todays123 = date("Y-m-d H:i");
$query = "SELECT * FROM events WHERE  events.name LIKE '%".$search."%'   AND events.price =   '".$filter."' AND events.user = '".$_SESSION['username']."' AND events.end >   '".$todays123."' OR events.description LIKE '%".$search."%'    AND events.price =  '".$filter."' AND events.user = '".$_SESSION['username']."' AND events.end >  '".$todays123."' OR events.user = '".$_SESSION['username']."' AND events.address LIKE  '%".$search."%'   AND events.price = '".$filter."' AND events.end > '".$todays123."'  ";
  } 

Вышеуказанное изменение по крайней мере позволит избежать инъекций SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...