Амперсанд и хэш сбой мой MYSQL Query
Я использую этот код для получения данных из запроса 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 ответа
Вы, вероятно, должны использовать 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
если это что-то, что пользователь предоставит.
Измени свой код, чтобы он выглядел так
$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-инъекций можно избежать.