Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.09.2016, 15:34
Новичок на форуме
Отправить личное сообщение для SEMEon85 Посмотреть профиль Найти все сообщения от SEMEon85
 
Регистрация: 11.09.2015
Сообщений: 4

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();}
}
});
    
    
});
Ответить с цитированием
  #2 (permalink)  
Старый 17.09.2016, 16:02
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

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

$searchtype=$_GET['searchtype'];

и

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

в порядке вещей?
Ответить с цитированием
  #3 (permalink)  
Старый 17.09.2016, 16:33
Новичок на форуме
Отправить личное сообщение для SEMEon85 Посмотреть профиль Найти все сообщения от SEMEon85
 
Регистрация: 11.09.2015
Сообщений: 4

Что не так? $searchtype несет наименование таблицы и столбца таблицы они одинаковые или что вы имеете ввиду?
Ответить с цитированием
  #4 (permalink)  
Старый 17.09.2016, 16:48
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

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

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

Такой кошмар даже комментировать слов не найти.
Ответить с цитированием
  #5 (permalink)  
Старый 18.09.2016, 04:34
Новичок на форуме
Отправить личное сообщение для SEMEon85 Посмотреть профиль Найти все сообщения от SEMEon85
 
Регистрация: 11.09.2015
Сообщений: 4

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

Последний раз редактировалось SEMEon85, 18.09.2016 в 04:38.
Ответить с цитированием
  #6 (permalink)  
Старый 18.09.2016, 07:16
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

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=>значение).

Если оперировать именами, то клиенту максимум что может быть доступно, это часть имени поля/таблицы, а в запросы подставляется полное имя, как имя от клиента плюс префикс, который известен только серверу.

Последний раз редактировалось laimas, 18.09.2016 в 07:28.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
autocomplete обрезается в dialog sniffysko jQuery 3 30.05.2016 18:27
JQuery UI Autocomplete клонируется. Как исправить? Prorab337 jQuery 1 09.01.2016 18:59
виджет autocomplete() aj-nik jQuery 9 31.10.2014 21:47
Autocomplete в динамически созданной форме Nobas Events/DOM/Window 7 24.03.2014 15:05
Autocomplete c url (js+pl) DavydovPK jQuery 0 11.02.2014 14:15