autocomplete
Доброе время суток всем, проблема в следующем есть форма
<form id="myform" action="results.php" method="get" target="result">
Выберите тип поиска:<br />
<select name="searchtype" id="searchtype" onclick="getText()">
<option value="alkashka">Алкоголь</option>
<option value="mineralka">Минеральная</option>
</select>
<br />
Введите информацию для поиска:<br />
<input name="searchterm" id="searchterm" type="text" autocomplete="off" />
<br />
<input class="button" name="" type="submit" value="Найти" />
</form>
файл autocomplete.php
$q=$_GET['q'];
$searchterm=mysql_real_escape_string($q);
$searchtype=$_GET['searchtype'];
$mysqli=mysqli_connect('***', '***', '***', '***') or die("Ошибка базы данных.");
$sql="SELECT DISTINCT ".$searchtype." FROM ".$searchtype." WHERE ".$searchtype." LIKE '%".$searchterm."%'";
$result = mysqli_query($mysqli,$sql) or die(mysqli_error());
if(!empty($result))
{
while($row=mysqli_fetch_array($result))
{
echo $row[$searchtype]."\n";
}
break;
}
в базе данных есть две таблицы alkashka, mineralka с такими же наименованиями полей Автозаполнение работает но не корректно, если мы искали по таблице alkashka все ищет, но при выборе mineralka он все равно ищет в таблице alkashka да и скрипт экстра параметра
$().ready(function(){
$('#searchterm').autocomplete('autocomplete.php',{
cacheLength: 100,
matchSubset: 1,
minChars:1,
selectFirst: false,
extraParams: {
searchtype: function(){return $('#searchtype').val();}
}
});
});
|
То есть, вы полагаете, что
$searchtype=$_GET['searchtype']; и "SELECT DISTINCT ".$searchtype." FROM ".$searchtype." WHERE ".$searchtype." в порядке вещей? |
Что не так? $searchtype несет наименование таблицы и столбца таблицы они одинаковые или что вы имеете ввиду?
|
Цитата:
Цитата:
Такой кошмар даже комментировать слов не найти. |
Так лучше?
$searchtype=isset($_GET['searchtype']) ? htmlspecialchars($_GET['searchtype']) : '';
$searchterm=isset($_GET['searchterm']) ? htmlspecialchars($_GET['searchterm']) : '';
$searchterm = trim ($searchterm);
if (!get_magic_quotes_gpc())
{
$searchtype = addslashes ($searchtype);
$searchterm = addslashes ($searchterm);
}
@ $db = new mysqli ('****', '***', '***', '***');
if (mysqli_connect_errno())
{
echo 'Ошибка базы данных.';
exit;
}
$query="SELECT DISTINCT * FROM ".$searchtype." WHERE ".$searchtype." LIKE '%".$searchterm."%'";
$result = $db -> query($query);
if(!empty($result))
{
while($row=mysqli_fetch_array($result))
{
echo $row[$searchtype]."\n";
}
break;
}
|
htmlspecialchars к безопасности sql-запросов никакого отношения не имеет, а волшебные кавычки надо еще настройками сервера резать на корню. addslashes в рамках mysqli, это анахронизм, mysqli может оперировать подготовленными запросами.
А вот в параметре для LIKE нужно экранировать символы % и _ функцией addcslahes, так как эти символы используются LIKE как спец. символы. Афишировать же структуру базы данных, именование их таблиц и полей, это табу, ни в коем случае пользователь не должен определять этого, чтобы потом подставлять в запросы. Если $_GET['q'] определяет параметр поиска, то почему для обращения к таблице и ее полям также не используются GET параметры, а производятся опасные операции оперированием реальной структурой таблицы? Ведь поля таблицы можно задавать в GET параметрах даже их индексами. Например в таблице есть поля перечисленные в таком порядке - A, B, C, D, то есть под индексами 0 - 3. При этом форма клиента может иметь следующее именование полей расположенных хв таком порядке - field[3], field[0], field[2]. При получении формы нужно отсортировать значения ключа field по ключу, и объединить с массивом имен полей таблицы полученным пересечением по ключу этого массива с массивом полей формы. На выходе получим array(A=>значение, C=>значение, D=>значение). Если оперировать именами, то клиенту максимум что может быть доступно, это часть имени поля/таблицы, а в запросы подставляется полное имя, как имя от клиента плюс префикс, который известен только серверу. |
| Часовой пояс GMT +3, время: 22:27. |