Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Быстрый подбор, JS + MySQL + PHP 
V
    Опции темы
Date
Дата 13.4.2009, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 22.3.2006
Где: Алматы

Репутация: нет
Всего: 3



Добрый день! 

Столкнулся со следующей проблемой:

Есть таблица в MySQL в ней количество записей переросло за 26 000. 
В  web-форму данные из этой таблицы попадают следующим образом 

Код

<select name="D1" size="48" multiple="multiple" class="textfield">
<?
$query = "SELECT * FROM  goods";
$n=0;
$result=mysql_query($query, $link);
print mysql_error();
while ($row = mysql_fetch_array($result)) { print '<option value='.$row['id'].'>'.substr($row['name'], 0, 40).'</option>'; };
?>
</select>


Передается 1.6 Мб. Это очень долго особенно если клиент сидит на dial-up’е.

Предполагаю сделать так, положить на форму:

  <input type="text" name="name" size="20">

Когда пользователь вводит туда название в <select> попадают те записи первые символы которых соответствуют в веденным в  <input>. 

Но знаний по JS нет совсем. и как решить проблему не знаю, время жмет. 

Заранее благодарю!

--------------------
Люди не будьте свиньями, Бросайте мусор в урны.
PM MAIL WWW   Вверх
comtat
Дата 13.4.2009, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1310
Регистрация: 2.5.2006
Где: Россия, Казань

Репутация: 7
Всего: 71



А если просто сделать постраничный вывод ???


--------------------
Рожденный в СССР !!!
ExtJS - мой фреймворк 
PM   Вверх
Date
Дата 13.4.2009, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 22.3.2006
Где: Алматы

Репутация: нет
Всего: 3



Цитата(comtat @  13.4.2009,  12:33 Найти цитируемый пост)
А если просто сделать постраничный вывод ??? 


я делал но там очень много страниц получатся. пользователи ругаются. 

--------------------
Люди не будьте свиньями, Бросайте мусор в урны.
PM MAIL WWW   Вверх
Michael.de
Дата 13.4.2009, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 22.3.2005
Где: Deutschland

Репутация: 4
Всего: 9



Date, требуется просто прочитать значение <input> и передать на сервер или что-то ещё?
Посмотри, может эта тема пригодится: http://forum.vingrad.ru/topic-237800.html
PM MAIL   Вверх
Date
Дата 14.4.2009, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 22.3.2006
Где: Алматы

Репутация: нет
Всего: 3



Michael.de, я посмотрел ваш пример. переделал его под свои нужды получилось вот что:

сначала заполняем массив:

Код

$query = "SELECT * FROM  goods limit 1000";
$n=0;
$arr=array();
$result=mysql_query($query, $link);
print mysql_error();
while ($row = mysql_fetch_array($result)) 
{ $arr[]="'".$row['name']."'"; };
$str = implode(" , ",$arr);


Код

<script type='text/javascript'>
var field, array;
function init(){
 field=document.getElementById('f');
 array=[
<? print $str?>
 ];

}
</script>



далее функция поиска: 

Код

<script type='text/javascript'>
/ Функция использует массив 'array' и значение input-а 'field'.
// Возвращает список элементов, начинающихся со значения input-а.
function getList(){
 var ret=[], text=field.value, i;
 for (i=0; i<array.length; i++){
  if (array[i].substr(0,text.length).toLowerCase() == text.toLowerCase()){
   ret.push(array[i]);
  }
 }
 // <-- This part of the code is not needed. Only to check. //////////////////////////////
 var show='Full array:\n';
 for (i=0; i<array.length; i++) {show+='\"'+array[i]+'\"'; (i+1)%5?show+=', ':show+='\n';}
 show+='\nFind:\n'; for (i=0; i<ret.length; i++) 
 document.selectForm.D1.options[i].text=ret[i]; 
 ////////////////////////////// This part of the code is not needed. Only to check. --> //
 return ret;
}
</script>


вставляю <input id='f' onkeyup='getList();'  size="20">

страница грузиться быстро и все работает как надо. 
НО если я делаю поиск например по 500 элемент, страница подвисает.

может можно выйти из этой ситуации?
--------------------
Люди не будьте свиньями, Бросайте мусор в урны.
PM MAIL WWW   Вверх
Michael.de
Дата 14.4.2009, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 22.3.2005
Где: Deutschland

Репутация: 4
Всего: 9



Date, я уже совсем запутался:
1. строки 11-16 из твоего последнего листинга для чего нужны? У меня они служили только для того, чтобы сгенерировать alert() для юзера... массив получался замечательно и без них smile
2. 
Код

 // а это точно работает (скрипт в скрипте) ???
 array=[
  <? print $str?>
 ];

Предлагаю следующее: юзер ввёл что-то в поле ввода. Из БД достаются все подходящие к первой букве (знаку) записи и отсылаются юзеру (как массив значений). На его компьютере (в соответствии с напечатанным в инпуте) к уже существующему select-у добавляются option-ы со значениями из array. Если юзер стёр всё написанное (изменился первый знак в инпуте) - запрашивается новый массив. Как из уже существующего массива достать нужные нам значения - я показал в том примере. Вот пример для добавления option-ов к select-y:
Код
<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01//EN' 'http://www.w3.org/TR/html4/strict.dtd'>
<html>
<head>
<title>JavaScript: add option</title>
<script type='text/javascript'>
var field, array;
function init(){
 field=document.getElementById('f');
 array=[
  'Alabama','Alaska','Arizona','Arkansas','California','Colorado','Connecticut',
  'Delaware','Florida','Georgia','Hawaii','Idaho','Illinois','Indiana','Iowa',
  'Kansas','Kentucky','Louisiana','Maine','Maryland','Massachusetts','Michigan',
  'Minnesota','Mississippi','Missouri','Montana','Nebraska','Nevada','New Hampshire',
  'New Jersey','New Mexico','New York','North Carolina','North Dakota','Ohio',
  'Oklahoma','Oregon','Pennsylvania','Rhode Island','South Carolina','South Dakota',
  'Tennessee','Texas','Utah','Vermont','Virginia','Washington','West Virginia',
  'Wisconsin','Wyoming'
 ];
}

function showSelect(){
 var arr=[], text=field.value, s, o, i;
 for (i=0; i<array.length; i++){
  if (array[i].substr(0,text.length).toLowerCase()==text.toLowerCase()) arr.push(array[i]);
 }
 s=document.getElementById('s');
 var lCh=s.lastChild;
 while (lCh!=null){
  i=lCh.previousSibling;
  s.removeChild(lCh);
  lCh=i;
 }
 for (i=0; i<arr.length; i++){
  o=document.createElement('option');
  o.innerHTML=arr[i];
  s.appendChild(o);
 }
}
</script>
</head>
<body onload='init();'>
<select id='s' style='position:absolute;left:100px;top:100px;border:1px solid #AAE'></select>
<input id='f' onkeyup='showSelect();' style='background-color:#EEF; border:1px solid #00A'>
</body>
</html>

P.S. Исправил ф-цию showSelect() - перед добавлением новых option-ов необходимо было удалить уже существующие smile

Это сообщение отредактировал(а) Michael.de - 14.4.2009, 18:57
PM MAIL   Вверх
Date
Дата 16.4.2009, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 22.3.2006
Где: Алматы

Репутация: нет
Всего: 3



Цитата(Michael.de @  14.4.2009,  19:51 Найти цитируемый пост)
1. строки 11-16 из твоего последнего листинга для чего нужны? У меня они служили только для того, чтобы сгенерировать alert() для юзера... массив получался замечательно и без них

да можно и без них.. но кушать не просят пусть будут  smile 


Цитата(Michael.de @  14.4.2009,  19:51 Найти цитируемый пост)
 array=[  <? print $str?> ];

точно работает, зря бы не писал... изврат конечно ну на первое время пойдет;

Дорогие друзья, проблема была решена немного по другому...

был создан скрипт на php для поиска... если кому интересно могу сбросить код пишите в личку... 
писать не буду потому что не по теме...

Всем спасибо! 
Michael.de, отдельное спасибо за то что повозился со мной и кодом! 
--------------------
Люди не будьте свиньями, Бросайте мусор в урны.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0498 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.