Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Заявки
 
 автор: margarita   (23.04.2010 в 12:36)   письмо автору
 
 

Здравствуйте! Помогите решить задачку, вот решила для своего удобства написать программу "заявки от клиентов".
Таблица zayavki: id, id_pokupatelya, data, diametr, stenka, sostoyanie, met, ton, cena, sroki
Но у клиента может в одной завке быть несколько позиций! И вот непойму как это можно реализовать.

  Ответить  
 
 автор: sim5   (23.04.2010 в 12:44)   письмо автору
 
   для: margarita   (23.04.2010 в 12:36)
 

А что такое позиции в заявке?

  Ответить  
 
 автор: Trianon   (23.04.2010 в 12:50)   письмо автору
 
   для: margarita   (23.04.2010 в 12:36)
 

таблица заявок
id, id_pokupatelya, data, sroki, cena,
Таблица позиций
id, id_zayavki, diametr, stenka, sostoyanie, met, ton

Одной строке первой таблицы соответствуют в общем случае несколько строк второй.

Поскольку неясно, какие свойства относятся к позициям, а какие к заявке в целом, полями придется пожонглировать.
К примеру, если цена присуща каждой позиции, поле придется перенести во вторую таблицу.
Если состояние - это состояние объекта заявки, а не позиции, то поле придется перенести в первую таблицу. И т.д.

PS. Не делайте пола дата. Ставьте сразу Дата_время.
Очень много головной боли потом из-за этой никому ненужной экономии на спичках.

  Ответить  
 
 автор: margarita   (24.04.2010 в 09:14)   письмо автору
 
   для: Trianon   (23.04.2010 в 12:50)
 

спасибо! все ясно.
можете еще подсказать как реализовать (у нас трое менеджеров каждый будет заходит под свои логином и паролем) чтобы на странице при входе выводились только те заявки с которыми работает данный менеджер, а остальные заявки он их мог видет, но редактировать не имеет право...

  Ответить  
 
 автор: sim5   (24.04.2010 в 09:34)   письмо автору
 
   для: margarita   (24.04.2010 в 09:14)
 

Не понятно, что означает принадлежность.
Если с теми, которыми работает в настоящий момент времени, то таковая зависимость может быть только N-ый промежуток времени, и для остальных менеджеров можно указать "занятость" этих заявок.
Если же принадлежность, это поступление тех или иных заявок только определенному менеджеру, то записи заявок должны содержать поле указывающее принадлежность их определенному менеджеру, по их id. В этом случае запретить изменение "не родных" заявок труда не составит - если id заявки равна id менеджера, то выводим форму для редактирования, иначе просто текстовое содержимое заявки.

  Ответить  
 
 автор: Trianon   (24.04.2010 в 09:38)   письмо автору
 
   для: sim5   (24.04.2010 в 09:34)
 

для: margarita

если id заявки равна id менеджера
Хм.

Sim5 хотел сказать, если
заявка.manager_id = user.id
где manager_id - это самое дополнительное поле

  Ответить  
 
 автор: sim5   (24.04.2010 в 09:39)   письмо автору
 
   для: Trianon   (24.04.2010 в 09:38)
 

Ну да, собственно хотел сказать, что "дите папино", но... ))

  Ответить  
 
 автор: margarita   (24.04.2010 в 20:50)   письмо автору
 
   для: sim5   (24.04.2010 в 09:39)
 

спасибо!
еще вопросик, как реализовать: когда пользователь вбивает несколько строк в таблицу "позиций", была возможность тут же добавить еще одну строку без перезагрузки страницы, это реализуеться на аяксе, если не ошибаюсь... или есть другие варианты?

  Ответить  
 
 автор: Trianon   (25.04.2010 в 00:49)   письмо автору
 
   для: margarita   (24.04.2010 в 20:50)
 

а стандартный синхронный вариант Вы уже реализовали, и Вам уже успело не понравиться с ним работать?

  Ответить  
 
 автор: margarita   (26.04.2010 в 19:01)   письмо автору
6.3 Кб
 
   для: Trianon   (25.04.2010 в 00:49)
 

что смогла, знания то у меня не большие. проверьте... пароль на email отправила...

  Ответить  
 
 автор: sim5   (26.04.2010 в 12:34)   письмо автору
 
   для: margarita   (24.04.2010 в 20:50)
 

>когда пользователь вбивает несколько строк в таблицу "позиций", была возможность тут же добавить еще одну строку

Это как? Можно пояснить эту хиромантию? )

  Ответить  
 
 автор: margarita   (26.04.2010 в 19:06)   письмо автору
 
   для: sim5   (26.04.2010 в 12:34)
 

ну во общем наша фирма торгует трубами (стальными), и в заявке бывает несколько труб разных диаметров ("позиций") (=
а я смогла только реализовать возможность добавление одновременно только одной "позиции" в заявку...

  Ответить  
 
 автор: sim5   (26.04.2010 в 20:06)   письмо автору
 
   для: margarita   (26.04.2010 в 19:06)
 

Есть списки (элемент select) с мультивыбором, есть чекбоксы... Если позиция отличается только диаметром, то что мешает использовать любой удобный из этих элементов для указания позиций?

  Ответить  
 
 автор: margarita   (29.04.2010 в 17:26)   письмо автору
 
   для: sim5   (26.04.2010 в 20:06)
 

спасибо!
еще вопрос: есть форма добавление заявки, далее - передаем данные файлу к-й будет их заносить в базу, и тут как лучше получить id этой заявки, чтобы использовать его в дальнейшем для передачи другому файлу?

  Ответить  
 
 автор: sim5   (29.04.2010 в 17:40)   письмо автору
 
   для: margarita   (29.04.2010 в 17:26)
 

Ну об этом можно в матчасти узнать:
mysql_insert_id() - возвращает id, сгенерированный предыдущей операцией INSERT.

Мануал РНР - это настольной книгой вашей должно быть ;-)

  Ответить  
 
 автор: margarita   (29.04.2010 в 18:10)   письмо автору
 
   для: sim5   (29.04.2010 в 17:40)
 

спасибо!

  Ответить  
 
 автор: margarita   (29.04.2010 в 20:06)   письмо автору
 
   для: margarita   (29.04.2010 в 18:10)
 

1.php
<form name="form1" method="post" action="2.php">
<?php
$result 
mysql_query("SELECT * FROM `buyers` ORDER BY `shortNameOrganization` ASC");
$myrow mysql_fetch_array($result);
echo 
"<p><b>Заказчик:</b></p>";
echo 
"<select name=\"id_buyer\" size=\"5\" multiple align=\"center\">";
do {
printf ("<option value=\"%s\">%s</option>",$myrow["id"],$myrow["shortNameOrganization"]);
} while (
$myrow mysql_fetch_array ($result));
echo 
"</select>";
?>
<p>Количество позиций: <input type="text" name="kolvo"></p>
<p><input type="submit" name="submit" value="Продолжить"></p>

2.php
<?php
$result 
mysql_query ("INSERT INTO `demand` (`id_buyer`) VALUES ('$id_buyer'");
$iii mysql_insert_id();
$iii2 $_POST['kolvo'];
if (
$result == 'true') {echo "<p>Запись успешно добалена!</p>";}else{echo "<p>Запись не добалена!</p>";}
echo 
"<form name=\"form1\" method=\"post\" action=\"3.php\">";
echo 
"<table align=center border=1>";
for (
$i=1$i<=$_POST['kolvo']; $i++)
{
echo 
"<input name=id_demand type=hidden value=\"$iii\">";
echo 
"<input name=kolvo type=hidden value=\"$iii2\">";
echo 
"<tr><td>№ $i</p></td>";
echo 
"<td>Диаметр: <input value=\"\" type=\"text\" name=\"diameter_$i\"></p></td>";
echo 
"<td>Стенка: <input value=\"\" type=\"text\" name=\"wall_$i\"></p></td>";
echo 
"<td>Состояние: <input value=\"\" type=\"text\" name=\"condition_$i\"></p></td>";
echo 
"<td>Метраж: <input value=\"\" type=\"text\" name=\"metric_$i\"></p></td>";
echo 
"<td>Тоннаж: <input value=\"\" type=\"text\" name=\"tonnage_$i\"></p></td>";
echo 
"<td>Цена: <input value=\"\" type=\"text\" name=\"price_demand_$i\"></p></td>";
echo 
"<td>Статус: <input value=\"\" type=\"text\" name=\"status_$i\"></p></td></tr>";
}
echo 
"<tr><td colspan=8 align=\"center\"><p><input type=\"submit\" name=\"submit\" id=\"submit\" value=\"Добавить\"></p></td></tr>";
echo 
"</table></form>";
?>

  Ответить  
 
 автор: margarita   (29.04.2010 в 20:07)   письмо автору
 
   для: margarita   (29.04.2010 в 20:06)
 

не могу сообразить как добавить их в базу =(

  Ответить  
 
 автор: sim5   (29.04.2010 в 20:14)   письмо автору
 
   для: margarita   (29.04.2010 в 20:06)
 

И что это означает?
Кстати multiple означает, что список позволяет выбрать в нем несколько значений, а несколько значений, это массив, и имя такого списка должно отражать это, то есть - id_buyer[]. А если пользователь выберет несколько значений (диаметров), то каким образом они вот этой операцией:

$result = mysql_query ("INSERT INTO `demand` (`id_buyer`) VALUES ('$id_buyer'");

попадут в базу? Причем записанную с ошибкой.

  Ответить  
 
 автор: margarita   (29.04.2010 в 20:21)   письмо автору
 
   для: sim5   (29.04.2010 в 20:14)
 

без multiple надо) ошиблась) можно выбрать только одного заказчика.

  Ответить  
 
 автор: margarita   (29.04.2010 в 20:26)   письмо автору
 
   для: margarita   (29.04.2010 в 20:21)
 

ну а дальше пользователь ввел кол-во позиций и передал их файлу 2.php, допустим 4:
http://savepic.ru/1098472.png
и вот тут я не пойму как мне их добавить все в базу.

  Ответить  
 
 автор: sim5   (29.04.2010 в 20:36)   письмо автору
 
   для: margarita   (29.04.2010 в 20:26)
 

Прежде чем добавлять, надо знать как организована структура таблицы, которая содержит эти позиции (диаметры). А содержать можно как совокупность записей связанных по id с "трубой-родителем", как строка с разделителем, как битовая маска...
А вот просто так записать массив в одно поле таблицы нельзя.

  Ответить  
 
 автор: margarita   (29.04.2010 в 20:50)   письмо автору
 
   для: sim5   (29.04.2010 в 20:36)
 

-- 
-- Структура таблицы `positionsDemand`
-- 

CREATE TABLE `positionsDemand` (
  `id` int(11) NOT NULL auto_increment,
  `id_demand` text NOT NULL,
  `diameter` text NOT NULL,
  `wall` text NOT NULL,
  `condition` text NOT NULL,
  `metric` text NOT NULL,
  `tonnage` text NOT NULL,
  `price_demand` text NOT NULL,
  `status` text NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=28 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=28 ;

  Ответить  
 
 автор: sim5   (29.04.2010 в 20:54)   письмо автору
 
   для: margarita   (29.04.2010 в 20:50)
 

Думайте. В поле diameter` в вашем случае можно записать, например: 15|25|35|50. Но в случае поиска... А можно и по иному.

  Ответить  
 
 автор: margarita   (29.04.2010 в 21:03)   письмо автору
 
   для: sim5   (29.04.2010 в 20:54)
 

del

  Ответить  
 
 автор: margarita   (29.04.2010 в 20:51)   письмо автору
 
   для: sim5   (29.04.2010 в 20:36)
 

А вот просто так записать массив в одно поле таблицы нельзя.
нужно записать не в одно поле, а столько сколько указал пользователь в 1 форме.

  Ответить  
 
 автор: sim5   (29.04.2010 в 21:00)   письмо автору
 
   для: margarita   (29.04.2010 в 20:51)
 

Так вы не сможете записать в данную таблицу (вернее можно, но с дубликатами лишних данных), нужна будет отдельная таблица тогда, связанная с этой.

  Ответить  
 
 автор: margarita   (29.04.2010 в 21:07)   письмо автору
 
   для: sim5   (29.04.2010 в 21:00)
 

-- 
-- Структура таблицы `demand`
-- 

CREATE TABLE `demand` (
  `id` int(11) NOT NULL auto_increment,
  `id_buyer` text NOT NULL,
  `id_manager` text NOT NULL,
  `date_time` text NOT NULL,
  `delivery` text NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=47 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=47 ;

  Ответить  
 
 автор: margarita   (29.04.2010 в 21:23)   письмо автору
 
   для: margarita   (29.04.2010 в 21:07)
 

<?php
for ($i=1$i<=$_POST['kolvo']; $i++)
{
$id_demand $_POST['id_demand'];
$diameter $_POST["diameter_$i"];
$result mysql_query ("INSERT INTO `positionsDemand` (`id_demand`, `diameter`) VALUES ('$id_demand', '$diameter')");
if (
$result == 'true') {echo "<p>Запись успешно добалена!</p>";}else{echo "<p>Запись не добалена!</p>";}
}
?>


а если такой вариант добавления использовать?

  Ответить  
 
 автор: sim5   (30.04.2010 в 06:11)   письмо автору
 
   для: margarita   (29.04.2010 в 21:23)
 

Не пойдет такой вариант добавления. Да и вообще, вся логика (последовательность) заказа ни к черту. Судя по ранее представленным примерам 1.php и 2.php, у вас яйцо бежит впереди курицы.
Но это еще не все. Если таким образом формировать заказ (последовательно), то при вашем сценарии велика вероятность того, что в конечном итоге в базе могут появляться "полузаказы" - что-то добавлено от некой формы, на некотором этапе, а потом заказчик толи раздумал, толи еще чего, и закрыл браузер, и в итоге заказ оказался неполноценным. И без лишних хлопот вам уже не обойтись - нужно будет удалять такой мусор из базы.
Другими словами, если заказ формируется последовательно, то данные, полученные от форм заказа на каждом этапе, требуют временного промежуточного хранения, и только при получении всех требуемых для заказа данных производится их запись в базу.

Но совсем не обязательно разбивать заказ на этапы, тем более, если номенклатура изделий не велика. Все вполне можно сделать одной формой. Но в любом случае, формы (выбор данных в форме) должны следовать по старшинству, от первичного ко вторичному, а не наоборот, как у вас.

Если номенклатура изделий велика, то конечно лучше задействовать Ajax технологию, если же не очень, то можно обойтись и просто JS-сценарием, отдавая пользователю наборы данных, по которым на стороне клиента можно реализовать связанные списки.

Допустим, что в базе есть предложения - трубы различные по типу: пластик, стеклопластик, сталь, чугун. Каждые из этих типов могут быть различных диаметров, длиной, и иметь другие характерные параметры. Все эти параметры должны быть связаны по id своих труб-родителей, или же, таблица описывающая трубы, должна иметь поле, в котором указано наличие, например, определенных диаметров, у данного типа труб.

А в единой форме заказа, пользователь может выбирать из списков все имеющиеся характеристики товара, и эти списки обязательно должны быть связаны по id. К примеру, если трубы стальные записаны в базе под id=16, то список описыващий возможные их диаметры, должен отражать этот id, то есть: <select name="id_buyer[16]" multiple>. При этом, если диаметры, это отдельная таблица, то значением опшенов этого списка должны быть не диаметры труб, а id под которыми записаны эти диаметры в таблице.
В этой же форме должен находится и элемент <input type="text[16]" name="kolvo">, и все другие поля необходимые для заказа.

Таким образом вы получите одну форму, одну форму будете обрабатывать. А ведь возможны и ошибки ввода пользователем (кстати, проверка которых у вас не наблюдается), а это значит нужно будет возвращать форму пользователю (если не задействовать Ajax) при их наличии. В случае, если ввод параметров заказа произведен успешно, то данные этой формы записываются в базу. При этом, для параметров заказа описывающих множественный выбор, нужно сформировать строку запроса для многострочного оператора INSERT, и одним запросом к базе произвести запись, а о таком способе:
for ($i=1; $i<=$_POST['kolvo']; $i++) {
$id_demand = $_POST['id_demand'];
....
mysql_query ("INSERT INTO `positionsDemand`....
лучше забыть.

Я не специалист по трубам, не знаю досканально все их параметры, как они связаны между собой, могут ли некие из этих параметров принадлежать множеству типов труб, да и существует ли у вас это множество... Посему, чего-то конкретно верного советовать трудно. Но могу сказать уверенно - взаимосвязь всех параметров, типов, удачно описанная структурой таблиц связанных, вот она и определит и облик формы заказа, и способ выбора параметров, и способ записи их как оформленный заказ. С этого надо начинать, а у вас все как-то разрозненно получается, вы просто "приклеиваете" очередной совет вам к своей задаче.

  Ответить  
 
 автор: sim5   (29.04.2010 в 21:24)   письмо автору
 
   для: margarita   (29.04.2010 в 21:07)
 

Первая таблица содержит собственно заявки (я так понимаю). Эта таблица - это кому они принадлежат (менеджерам), так?
А вот таблица диаметров, и прочих возможных разновидностей труб, которые может выбрать заказчик, это должна быть отдельная таблица. Только так можно записать каждую выбранную позицию как отдельную запись.
Если разница только в диаметре, то либо вы записываете как строкой в одном ее поле выбранные позиции (как, я приводил выше), либо можно связать все диаметры с некой битовой маской, в которой лог. 1 будет означать выбранную позицию (диаметр), которую также можно хранить в отдельном поле.

  Ответить  
 
 автор: margarita   (29.04.2010 в 21:38)   письмо автору
 
   для: sim5   (29.04.2010 в 21:24)
 

Первая таблица содержит собственно заявки (я так понимаю). Эта таблица - это кому они принадлежат (менеджерам), так?
да вы все правильно поняли)

А вот таблица диаметров, и прочих возможных разновидностей труб, которые может выбрать заказчик, это должна быть отдельная таблица. Только так можно записать каждую выбранную позицию как отдельную запись.
ну так у меня и есть две таблицы, как советовал Trianon еще выше...

Если разница только в диаметре
там разница не только в диаметре, но там еще стенка, цена, длина...


спасибо, что помогли;)

  Ответить  
 
 автор: Trianon   (30.04.2010 в 09:25)   письмо автору
 
   для: margarita   (29.04.2010 в 21:38)
 

две таблицы, о которых я говорил, лишь позволяют управлять заказами с несколькими позициями.
В Вашем случае этого явно мало. То, что позиции имеют структуру четкую характеристик, эти две таблицы не передают.

Я вижу сейчас структуру примерно так. Таблица( поле, поле,.... поле)

клиент(ид, дата_время_создания, имя, адрес, банк, р_счет, т.п.)

менеджер(ид, дата_время_создания, имя, ид_поз_штатного_расписания)

заказ(ид, ид_клиента, ид_отв_менеджера, дата_время_создания, дата_время_модификации, дата_время_исполнения)

материал(ид, название)

условия(ид, название)

товар(ид, ид_материала, ид_условий,длина,тоннаж,базовая_цена)

позиция(ид,ид_заказа,порядковый_номер,ид_товара,цена,кол_во_заказанное,кол_во_отгруженное, дата_время_включения в заказ, дата_время_изготовления)

счет(ид_клиента, ид_заказа, дата_время, сумма, назначение)

оплата(ид_клиента, ид_счета, дата_время, сумма)

  Ответить  
 
 автор: margarita   (29.04.2010 в 21:43)   письмо автору
 
   для: sim5   (29.04.2010 в 21:24)
 

может еще подскажиет?)
как сделать, чтобы была правильная сортировка?
<?php  
$result 
mysql_query ("SELECT * FROM price ORDER BY `diameter`,`wall` ASC");
?>

выводит: http://savepic.ru/1100512.png
а надо: 60, 320, 530, 666, 1220

  Ответить  
 
 автор: Trianon   (29.04.2010 в 21:53)   письмо автору
 
   для: margarita   (29.04.2010 в 21:43)
 

Это потому, что `diameter` - совсем таки не text, а вовсе даже int

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования