Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Запрос в одно поле через запятые

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
pantela
Отправлено: 20 Июля, 2011 - 10:53:01
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 765
Дата рег-ции: Авг. 2010  


Помог: 1 раз(а)




Делаю поле:
CODE (htmlphp):
скопировать код в буфер обмена
  1. <tr>
  2. <td>Профессия</td>
  3. <td>
  4. <select name="profession" class="inputbox" style="width: 244px" multiple>
  5.         <?php echo getProfessionList(); ?>
  6. </select>
  7. </td>
  8. </tr>

Как видите оно у меня multiple Задача втом что бы в БД таблицу, в поле записать все выбраные значение через запятую.

То что я погуглил я понял что надо использовать array

т.е. поле будет выглядеть так:

CODE (htmlphp):
скопировать код в буфер обмена
  1. <select name="profession[]" class="inputbox" style="width: 244px" multiple>
  2.         <?php echo getProfessionList(); ?>
  3. </select>


Далле надо рассшифровать этот поле

CODE (text):
скопировать код в буфер обмена
  1. $profession = $_POST['profession'];
  2. for ($i = 0; $i < count($profession); $i++) {
  3.     $profession_list = $profession[$i];
  4. }


Как я понял вывод есть, теперь надо всё перечислить через запятую и потом вставить в запрос.

Но тут ещё не очень понял запрос $INSERT = mysql_query("INSERT INTO... надо вставить в скобки for где перечисление или можно отдельно. Вроде вставил в скобки и тогда конечно у меня 2 запроса пошло.

Погуглил ещё и понял что вроде надо применить функцию explode только как...

+ И вывод как я понимаю этих полей надо через implode делать

спс.Ув.

(Отредактировано автором: 20 Июля, 2011 - 10:55:21)

 
 Top
LIME
Отправлено: 20 Июля, 2011 - 10:57:49
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




pantela просто implode(',',$_POST['profession']) без всяких массивов
то есть <select name="profession"...
(Добавление)
сформируется строка ее и кладете в базу
а при выводе как раз можно explode применить
 
 Top
pantela
Отправлено: 20 Июля, 2011 - 12:21:58
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 765
Дата рег-ции: Авг. 2010  


Помог: 1 раз(а)




При запросе запрос идёт, но выводиться ошибка
Warning: implode() [function.implode]: Invalid arguments passed in Z:\home\test4.ru\www\add_email.php on line 15
и в таблице поле пустое. Растерялся
Как я понял не верно передаётся $profession и переменая пуста, и функция не может обработать её?
А если у меня будет случий когда переменя будет NULL что тогда. Однако

Вот запрос.
CODE (htmlphp):
скопировать код в буфер обмена
  1. $INSERT = mysql_query("INSERT INTO email (`date`, `category`, `name`, `surname`, `sex`, `profession`, `city`, `email`, `service`) VALUES ('".$today."', '".$category."', '".$name."', '".$surname."', '".$sex."', '".implode(',',$profession)."', '".$city."', '".$email."', '".$service."')");
 
 Top
OrmaJever Модератор
Отправлено: 20 Июля, 2011 - 12:31:39
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Нужно зделать масив в селекте
CODE (htmlphp):
скопировать код в буфер обмена
  1. <select name="profession[]" class="inputbox" style="width: 244px" multiple>
  2.         <?php echo getProfessionList(); ?>
  3. </select>

вот верный вариант


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
pantela
Отправлено: 20 Июля, 2011 - 12:51:23
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 765
Дата рег-ции: Авг. 2010  


Помог: 1 раз(а)




Спасибо получилось, а вывод как сделать:
CODE (htmlphp):
скопировать код в буфер обмена
  1. $profession_list = $getProfessionType($profession);
  2.        
  3. $arr = explode(",",trim($profession_list));
  4.   for($i = 0; $i < count($arr); $i++)
  5.  {
  6.     echo $arr[$i].'<br/>';
  7.   }  

Пишется:
Fatal error: Function name must be a string in Z:\home\test4.ru\www\email.php on line 154

+
В таблице какой типо поля использовать varchar достаточно или есть какой нубудь определённый?

(Отредактировано автором: 20 Июля, 2011 - 12:52:38)

 
 Top
DeepVarvar Супермодератор
Отправлено: 20 Июля, 2011 - 13:02:11
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




А я бы сделал для выбора среди нескольких табличку чекбоксов.
Затем считал выбранные из пришедшей формы в массив.
И записал бы этот массив в поле предварительно его сериализовав.

При чтении - обратный процесс:

читаем из БД,
десериализуем,
формируем табличку чекбоксов: прогоняем по массиву всех вариантов и если у нас такие выбраны ставим чекбоксу чекед="чекед".
(Добавление)
На самом деле под такое стоит сделать отдельную табличку:
person_id | profession

И тащил бы оттуда все по WHERE person_id = $id
 
 Top
pantela
Отправлено: 20 Июля, 2011 - 13:10:34
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 765
Дата рег-ции: Авг. 2010  


Помог: 1 раз(а)




Да но на сколько я знаю лучще иметь доп. поле в таблице, и там всё хранить чем делать новую таблицу и и её грузить.

Ну конечно смотря какой момент.
А грубо если описать у меня таблица из 10 поле, и мне надо эти записи потмо выводить по критериям, навернео использую LIKE, но тут ещё вопрос через LIKE я смогу выделять запись по запятой или надо всё же вместо запятой данные заносить через %.
Но и то я понимаю что LIKE пофиг как разделять вывод.
Просто хорошый вариант хочу найти Улыбка
 
 Top
Мелкий Супермодератор
Отправлено: 20 Июля, 2011 - 13:19:10
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




pantela пишет:
лучще иметь доп. поле в таблице, и там всё хранить чем делать новую таблицу и и её грузить.

Ага, пока не надо искать по этому полю.

Вариант с LIKE:
0) если делаете LIKE '%1%', то найдёт все записи и с 100, и с 41.
1) like '%,1,%' - или следите за тем, чтобы в начале строки и в конце всегда были запятые, или теряете крайние значения. Например, строка "1,2,3,4" не подпадает под условие
2) like '1,%' or like '%,1,%' or like ',1%'. три лайка на каждую строку Однако

И это при том, что like вычисляется для каждой строки, да и не самая дешёвая операция. И, на сколько помню, не использует индексы. Я однозначно за таблицу связей.


-----
PostgreSQL DBA
 
 Top
pantela
Отправлено: 20 Июля, 2011 - 13:23:21
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 765
Дата рег-ции: Авг. 2010  


Помог: 1 раз(а)




А если а базе держать данные так

%1%2%3%%7%5%11%
И по LIKE делать проверку на вывод тех данных каторые находятся между %%

Но всё же думаю можно тоже самое осуществить и запятыми, LIKE ведь не имеет значение чем там будет делится...
 
 Top
Slavenin
Отправлено: 20 Июля, 2011 - 19:28:09
Post Id



Посетитель


Покинул форум
Сообщений всего: 285
Дата рег-ции: Май 2010  
Откуда: Тверь


Помог: 4 раз(а)




однозначно использовать доп таблицу, отказаться от like, кроме самых крайних случаев.
pantela, поищите про оптимизацию sql и поймете что все, что вам говорили выше, правильно. Я так понимаю что у вас уже устроено это самое доп поле в таблице и теперь вам не хочется все менять, НО настанет такой момент, когда вам ПРИДЕТСЯ это сделать. может не стоит его дожидаться и сделать сразу ПРАВИЛЬНО пока данных не очень много? Подмигивание
 
 Top
pantela
Отправлено: 21 Июля, 2011 - 10:02:19
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 765
Дата рег-ции: Авг. 2010  


Помог: 1 раз(а)




Я согалсен лучще переделать щас чем потом, тогда у меня немного такой вопрос...
напр. я сделаю новое поле где и буду хранить эти записи для данного пользователя
т.е. делаю поле profession и мне хранить по одной професии по одной записи?
тогда при запросе среди 1000 записей надо выводить только те записи ктаорые WHERE и каков лимит я укажу еслия не знаю его, или для LIMIT ещё отдельно сделать поле?

Просто с стороны оптимизации чем делать доп. запрос на новую таблицу, далле искать среди 1000 записей только несколько записей каторые мне надо, я думал проще сделать доп. поле в той же таблице куда идёт запрос и от туда же выводить данные.

(Отредактировано автором: 21 Июля, 2011 - 10:09:31)

 
 Top
DeepVarvar Супермодератор
Отправлено: 21 Июля, 2011 - 10:56:08
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Таблица персон (юзеров):
id | name | age | etc
-----
1 | вася | 23 | трудоголик

Таблица профессий:
person_id | profession
-----
1 | шахтер

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT p.person_id,COUNT(p.profession) cnt,u.id,u.name
  2.         FROM professions p
  3.         LEFT JOIN users u ON (u.id = p.person_id)
  4.         WHERE p.person_id = $id
  5.         GROUP BY p.person_id ORDER BY cnt DESC

Даже считает сколько профессий у человека "выбрато" Радость
Не проверял...
 
 Top
pantela
Отправлено: 21 Июля, 2011 - 13:59:46
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 765
Дата рег-ции: Авг. 2010  


Помог: 1 раз(а)




Ну код примерно понял, отлько в работе надо проверить, а где тут для запроса задан LIMIT ?
т.к. пользователей будет более 2000 у некоторых большую часть будет проффесия, даже по нескольки получается что в таблице професии будет более 4000 записи, а тут если у пользователя при запросе только одна професия запрос будет пересматривать все записи, вот и спомощю LIMIT вроде оптимизация будет, так вот с твоём случии приведёном коде как я поянл тут лимит можно если и в тблице персон сделать поле где и будет считатся количество професии так?
 
 Top
DeepVarvar Супермодератор
Отправлено: 21 Июля, 2011 - 14:10:36
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Нет - запрос выбирает все профессии из второй таблицы которые отметил о себе конкретный пользователь для вывода информации только о нем.
Какие тут лимиты нафик???

(Отредактировано автором: 21 Июля, 2011 - 14:11:52)

 
 Top
pantela
Отправлено: 21 Июля, 2011 - 14:29:11
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 765
Дата рег-ции: Авг. 2010  


Помог: 1 раз(а)




Так откуда запрос знает сколько професии у данного пользователя, елси професия одна он будет среди 5000 записей исктаь одну да? и наидёт ту одну и помто не отстоновится да? Потмоу я и хочу LIMIT

Хммм помоему мы друг друга не понимаем Растерялся
Если не сложно может ПМ может номер АСки скинешь или скаипа )) поможешь...
Тут задача простая 2 файл только один добавляет пользователей, второй выводит...

(Отредактировано автором: 21 Июля, 2011 - 15:19:33)

 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB