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
Форумы портала PHP.SU :: Версия для печати :: Запрос в одно поле через запятые
Форумы портала PHP.SU » » Вопросы новичков » Запрос в одно поле через запятые

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

1. pantela - 20 Июля, 2011 - 10:53:01 - перейти к сообщению
Делаю поле:
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 делать

спс.Ув.
2. LIME - 20 Июля, 2011 - 10:57:49 - перейти к сообщению
pantela просто implode(',',$_POST['profession']) без всяких массивов
то есть <select name="profession"...
(Добавление)
сформируется строка ее и кладете в базу
а при выводе как раз можно explode применить
3. pantela - 20 Июля, 2011 - 12:21:58 - перейти к сообщению
При запросе запрос идёт, но выводиться ошибка
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."')");
4. OrmaJever - 20 Июля, 2011 - 12:31:39 - перейти к сообщению
Нужно зделать масив в селекте
CODE (htmlphp):
скопировать код в буфер обмена
  1. <select name="profession[]" class="inputbox" style="width: 244px" multiple>
  2.         <?php echo getProfessionList(); ?>
  3. </select>

вот верный вариант
5. pantela - 20 Июля, 2011 - 12:51:23 - перейти к сообщению
Спасибо получилось, а вывод как сделать:
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 достаточно или есть какой нубудь определённый?
6. DeepVarvar - 20 Июля, 2011 - 13:02:11 - перейти к сообщению
А я бы сделал для выбора среди нескольких табличку чекбоксов.
Затем считал выбранные из пришедшей формы в массив.
И записал бы этот массив в поле предварительно его сериализовав.

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

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

И тащил бы оттуда все по WHERE person_id = $id
7. pantela - 20 Июля, 2011 - 13:10:34 - перейти к сообщению
Да но на сколько я знаю лучще иметь доп. поле в таблице, и там всё хранить чем делать новую таблицу и и её грузить.

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

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

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

И это при том, что like вычисляется для каждой строки, да и не самая дешёвая операция. И, на сколько помню, не использует индексы. Я однозначно за таблицу связей.
9. pantela - 20 Июля, 2011 - 13:23:21 - перейти к сообщению
А если а базе держать данные так

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

Но всё же думаю можно тоже самое осуществить и запятыми, LIKE ведь не имеет значение чем там будет делится...
10. Slavenin - 20 Июля, 2011 - 19:28:09 - перейти к сообщению
однозначно использовать доп таблицу, отказаться от like, кроме самых крайних случаев.
pantela, поищите про оптимизацию sql и поймете что все, что вам говорили выше, правильно. Я так понимаю что у вас уже устроено это самое доп поле в таблице и теперь вам не хочется все менять, НО настанет такой момент, когда вам ПРИДЕТСЯ это сделать. может не стоит его дожидаться и сделать сразу ПРАВИЛЬНО пока данных не очень много? Подмигивание
11. pantela - 21 Июля, 2011 - 10:02:19 - перейти к сообщению
Я согалсен лучще переделать щас чем потом, тогда у меня немного такой вопрос...
напр. я сделаю новое поле где и буду хранить эти записи для данного пользователя
т.е. делаю поле profession и мне хранить по одной професии по одной записи?
тогда при запросе среди 1000 записей надо выводить только те записи ктаорые WHERE и каков лимит я укажу еслия не знаю его, или для LIMIT ещё отдельно сделать поле?

Просто с стороны оптимизации чем делать доп. запрос на новую таблицу, далле искать среди 1000 записей только несколько записей каторые мне надо, я думал проще сделать доп. поле в той же таблице куда идёт запрос и от туда же выводить данные.
12. DeepVarvar - 21 Июля, 2011 - 10:56:08 - перейти к сообщению
Таблица персон (юзеров):
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

Даже считает сколько профессий у человека "выбрато" Радость
Не проверял...
13. pantela - 21 Июля, 2011 - 13:59:46 - перейти к сообщению
Ну код примерно понял, отлько в работе надо проверить, а где тут для запроса задан LIMIT ?
т.к. пользователей будет более 2000 у некоторых большую часть будет проффесия, даже по нескольки получается что в таблице професии будет более 4000 записи, а тут если у пользователя при запросе только одна професия запрос будет пересматривать все записи, вот и спомощю LIMIT вроде оптимизация будет, так вот с твоём случии приведёном коде как я поянл тут лимит можно если и в тблице персон сделать поле где и будет считатся количество професии так?
14. DeepVarvar - 21 Июля, 2011 - 14:10:36 - перейти к сообщению
Нет - запрос выбирает все профессии из второй таблицы которые отметил о себе конкретный пользователь для вывода информации только о нем.
Какие тут лимиты нафик???
15. pantela - 21 Июля, 2011 - 14:29:11 - перейти к сообщению
Так откуда запрос знает сколько професии у данного пользователя, елси професия одна он будет среди 5000 записей исктаь одну да? и наидёт ту одну и помто не отстоновится да? Потмоу я и хочу LIMIT

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

 

Powered by ExBB FM 1.0 RC1