Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   autocomplete (https://javascript.ru/forum/jquery/64976-autocomplete.html)

SEMEon85 17.09.2016 15:34

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();}
}
});
    
    
});

laimas 17.09.2016 16:02

То есть, вы полагаете, что

$searchtype=$_GET['searchtype'];

и

"SELECT DISTINCT ".$searchtype." FROM ".$searchtype." WHERE ".$searchtype."

в порядке вещей?

SEMEon85 17.09.2016 16:33

Что не так? $searchtype несет наименование таблицы и столбца таблицы они одинаковые или что вы имеете ввиду?

laimas 17.09.2016 16:48

Цитата:

Сообщение от SEMEon85
наименование таблицы и столбца таблицы они одинаковые

Ну такое только от переизбытка фантазии, ну коли нравится такой геморрой, пожалуйста.

Цитата:

Сообщение от SEMEon85
что вы имеете ввиду?

То есть безопасность, это $searchterm=mysql_real_escape_string($q); и все, а далее в запрос можно подставлять имена полей, базы, которые определяет клиент?

Такой кошмар даже комментировать слов не найти.

SEMEon85 18.09.2016 04:34

Так лучше?
$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;
}

laimas 18.09.2016 07:16

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:03.