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, время: 16:45. |