Показать полную графическую версию : [решено] [PHP, MySQL, JS]Использование селекта в регистрации
blackmane
09-01-2012, 20:59
Может вопрос покажется глупым, но все же, как создать динамически зависимые селекты (значения которых хранятся в БД), чтобы потом их записать в новую талицу?
В поисках ответа я наткнулся на Динамические селекты JS (http://javascript.ru/forum/misc/16489-dinamicheskijj-selekt.html), и даже умудрился сделать два уровня с выборкой из бд (но мне нужно три), потом я понял что не смогу внести в конечную таблицу выбранные данные, так как вывод выглядит вот так:
<?php
include "../data/dbconfig.php";
//if($conect == true) {echo 'Conect DB';}
//if($select == true) {echo 'Select TABLE';}
//selet all data from DB test
$result = mysql_query("select * from mod_print where (id_firm='1')");
//if($result == true){echo 'TRUE DB<br>';}
//Poluchenie massiva
$array = mysql_fetch_array($result);
echo " '1':{ ";
do {
printf("
'do_%s':'%s',
"
,$array['id'],$array['model_p']);
}
while($array = mysql_fetch_array($result));
echo "},"
?>
Может какой form action =' ' добавить?
Речь о регистрации оборудования.
Я хочу сделать так что бы вместо поля "Модель" было два списка (первый "Фирма", второй "Модель принтера", который зависит от выбранной фирмы), тоже самое с этажем и кабинетом, и простой список матответственных лиц.
При этом существуют три таблицы:
firm_printer (id, firm)
mod_printer (id, id_firm, model_p, cartrige)
printer (id, firm, model, sn, inv_num, cartrige, et, depar, mat_face)
И хотелось бы сделать так чтобы при выборе определенной модели значение поля cartrige в таблице print копировалось из значения поля cartrige таблицы mod_print выбранной модели.
http://content.foto.mail.ru/bk/legolas-91/118/s-119.jpg
<form name="myForm" action="add_print.php" method="post" onSubmit="return splash();">
<input type="hidden" name="action" value="add">
<table width="100%" border="0" cellspacing="3" cellpadding="0">
<tr>
<td>Модель</td>
<td>Серийный номер</td>
<td>Инвентарный номер</td>
<td>Картридж</td>
<td>Этаж</td>
<td>Кабинет</td>
<td>Мат. лицо</td>
</tr>
<tr>
<td><input name="model" maxlength=30 size=22> </td>
<td><input name="sn" maxlength=30 size=22></td>
<td><input name="inv_num" maxlength=60 size=22></td>
<td><input name="cartrige" maxlength=60 size=22></td>
<td><input name="et" maxlength=60 size=22></td>
<td><input name="depar" maxlength=60 size=22></td>
<td><input name="mat_face" maxlength=60 size=22></td>
</tr>
</table>
<table width="100%" border="0" align="center"><tr colspan=2><center><input type="submit" value="Отправить"></center></tr></table>
</form>
Смотря на этот хтмл код я вообще не могу понять как в эту форму запихать такое количество других форм.
P.S. хорошо знаю только CSS да HTML, PHP начинаю изучать, не говоря уж про jQuery, AJAX, JS...
P.S.S. если что то не понятно уточняйте, как то сложно объяснить то, что видишь в своей голове (
это походу отсюда http://www.tigir.com/javascript_select.htm (см. исходный код, там все видно)
http://php.net/manual/ru/language.variables.external.php (основы)
http://docs.php.net/manual/ru/function.mysql-fetch-array.php (while вместо do-while, см. примеры внизу)
http://docs.php.net/manual/ru/function.mysql-real-escape-string.php (экранируем перед вставкой).
blackmane
09-01-2012, 21:56
это походу отсюда http://www.tigir.com/javascript_select.htm (см. исходный код, там все видно)
Да это, но:
во-первых значения вносятся в файл, а не из таблицы.
во-вторых не описанно как их занести в другую таблицу
в-третьих, исходя из первых, я не понимаю как вывести третий уровень :gulp:
А почему лучше использовать while???, я понимаю что не использую первую часть - do, честно мне пока сложно все это разобрать, дык еще и в перемешку с изучением С++
Я кстати несколько изменил первое сообщение.
И еще вопрос, если, допустим, я буду в таблице хтмл писать в каждой ячейке form, то может быть ли обработаны все запросы сразу (ведь если я правильно понял, все это не сможет выстроиться в один запрос)?
А почему лучше использовать while???, »лишняя строка
//Poluchenie*massiva
$array*=*mysql_fetch_array($result); »
в каждой ячейке form »
нужно сформировать get или post запрос, а как это делать - решать вам - формой, ссылкой; отправлять ajax или обычным запросом. Вариантов масса.
blackmane
10-01-2012, 10:39
Цитата blackmane: А почему лучше использовать while???, » »
К сожалению do необходимо, т.к. без него не идет цикл :(
do-while делает минимум 1 цикл, даже если выборки нет, в результате чего внутри цикла будут неопределенные переменные.
blackmane
10-01-2012, 11:12
Вроде как что начинает получатся (правда пока не на динамическом селекте ( ), но выдает ошибку:
Warning: Invalid argument supplied for foreach() in Z:\home\itr.itr\www\print\add_print.php on line 35
You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1 INSERT INTO print (mat_face) values ('Столбенко Г.Н.') )
$mat_face = $_POST['mat_face'];
if(!empty($mat_face))
{
// Начинаем формировать переменную, содержащую этот список
// в формате "(3,5,6,7)"
$query = "(" ;
foreach($mat_face as $val) $query.= "$val,";
// Удаляем последнюю запятую, заменяя ее закрывающей скобкой)
$query = substr($query, 0, strlen($query) - 1 ). ")" ;
// Завершаем формирование SQL-запроса на удаление
$query = "INSERT INTO print (mat_face) values ('$mat_face') ".$query;
// Выполняем запрос
if(!mysql_query($query))
{
echo mysql_error()."<br>";
echo $query."<br>";
}
}
header("Location: insert_print.php");
<form name="myForm" action="add_print.php" method="post" onSubmit="return splash();">
<input type="hidden" name="action" value="add">
<table width="100%" border="0" cellspacing="3" cellpadding="0">
<tr>
<td>Модель</td>
<td>Серийный номер</td>
<td>Инвентарный номер</td>
<td>Картридж</td>
<td>Этаж</td>
<td>Кабинет</td>
<td>Мат. лицо</td>
</tr>
<tr>
<td><input name="model" maxlength=30 size=22> </td>
<td><input name="sn" maxlength=30 size=22></td>
<td><input name="inv_num" maxlength=60 size=22></td>
<td><input name="cartrige" maxlength=60 size=22></td>
<td><input name="et" maxlength=60 size=22></td>
<td><input name="depar" maxlength=60 size=22></td>
<td><!--<input name="mat_face" maxlength=60 size=22>-->
<?php
include "../data/dbconfig.php";
//if($conect == true) {echo 'Conect DB';}
//if($select == true) {echo 'Select TABLE';}
//selet all data from DB test
$result = mysql_query("select * FROM mat_face");
$array = mysql_fetch_array($result);
echo "<select size='1' name='mat_face' ><option value='all'>*Выбрать проблему...*</option>";
do {
printf("
<option class='cat-title' name='mat_face[]' value='%s'>%s</option>
"
,$array['name'],$array['name']);
}
while($array = mysql_fetch_array($result));
echo "</select>"
?>
</td>
</tr>
</table>
<table width="100%" border="0" align="center"><tr colspan=2><center><input type="submit" value="Отправить"></center></tr></table>
</form>
Попытался сделать на основе удаления выбранных строк, но как то не сильно (
do-while делает минимум 1 цикл, даже если выборки нет, в результате чего внутри цикла будут неопределенные переменные. »
Я убрал do и после обновления страницы в списке осталось только одно значение, вместо 5...
blackmane
10-01-2012, 12:18
Таки получилось (на не динамическом):
<?php
///////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
///////////Скрипт добавления в базу инвентаризации (print)/////////////
///////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
include "../data/dbconfig.php";
//if($conect == true) {echo 'Conect DB';}
//if($select == true) {echo 'Select TABLE';}
// получаем переменные из формы
$model = $_REQUEST['model'];
$sn = $_REQUEST['sn'];
$inv_num = $_REQUEST['inv_num'];
$cartrige = $_REQUEST['cartrige'];
$et = $_REQUEST['et'];
$depar = $_REQUEST['depar'];
$value = $_REQUEST['mat_face'];
$action=$_REQUEST['action'];
if ($action=="add")
{
// добавление данных в БД
$sql="INSERT INTO print(model, sn, inv_num, cartrige, et, depar, mat_face) VALUES ('$model', '$sn', '$inv_num', '$cartrige', '$et', '$depar', '$_POST[mat_face]')";
$r=mysql_query ($sql);
};
header("Location: insert_print.php");
?>
blackmane
10-01-2012, 14:27
А как сделать чтобы в поле мат ответственное лицо вводилось значение id_face (1.2.3), а форме выводилось значение name???
Сейчас записывается в конечную таблицу то, что я напишу в value (сейчас стоит поле name), хотелось бы чтобы записывался id_face, а при запросе отобразить - name.
<?php
include "../data/dbconfig.php";
//if($conect == true) {echo 'Conect DB';}
//if($select == true) {echo 'Select TABLE';}
//selet all data from DB test
$result = mysql_query("select * FROM mat_face");
$array = mysql_fetch_array($result);
echo "<select size='1' name='mat_face' ><option value='all'>Выбрать...*</option>";
do {
printf("
<option class='cat-title' name='mat_face[]' value='%s'>%s</option>
"
,$array['name'],$array['name']);
}
while($array = mysql_fetch_array($result));
echo "</select>"
?>
blackmane
10-01-2012, 20:37
Sham, может подскажете?
Я понял что нужно сделать, чтобы из динамических селектов передавать данные в таблицу, НО передача не возможна, так как в option второго уровня нет атрибута name, там в принципе во втором уровне нет тега option, где я должен указать "model[]".
Как мне добавить этот атрибут?
http://www.w3.org/wiki/HTML/Elements/option
в option не может быть name вообще, поскольку name указывается в select, чтобы выбранное значение (option value) попало в переменную.
недопонял я ваши выкладки.
рулите скрытыми полями <input type="hidden" name="" value="" />
blackmane
10-01-2012, 22:28
Спасибо :)
Вы окозались правы по поводу нэйма, просто я допустил маленькую ошибку из-за чего не добовлялась информация :(
недопонял я ваши выкладки. »
В смысле?
рулите скрытыми полями <input type="hidden" name="" value="" /> »
По поводу скрытости поля не могу ничего говорить, так как такой вариант я нашел просторах интернета, а без поля инфа просто не добовляется :(
Вы часом мне не подскажите как сделать следующее:
при выборе принтера из таблицы mod_print для добавления в таблицу print значение поля cartrige выбранного принтера копировалось в поле cartrige таблицы print. Если я правильно понял (хотя последнее время мне кажется что я вообще ничего не понимаю) нужно использовать JOIN, но как его использовать с уже существующим запросом:
INSERT INTO print(model, sn, inv_num, cartrige, et, depar, mat_face) VALUES ('$_POST[model]', '$sn', '$inv_num', '$cartrige', '$et', '$depar', '$_POST[mat_face]')
???
при выборе принтера из таблицы mod_print для добавления в таблицу print значение поля cartrige выбранного принтера копировалось в поле cartrige таблицы print. »
на словах не надо, нужен код. Что есть, что надо.
мануал по синтаксису запросов тут (http://dev.mysql.com/doc/refman/5.6/en/sql-syntax-data-manipulation.html) (на примерах понятно все).
blackmane
11-01-2012, 18:40
Используя динамические селекты я столкнулся с проблемой, в первом списке в value выводится ID, что облегчает подключение подчиненных списков
'ЗНАЧЕНИЕ VALUE ГЛАВНОГО СПИСКА':{
'ie_win':'Windows',
'ie_mac':'Mac'
},, но чтобы подключить более одного вторичного списка приходится копировать все это:
<?php
include "../data/dbconfig.php";
$result = mysql_query("select * from mod_print where (id_firm='1')");
$array = mysql_fetch_array($result);
echo " '1':{ ";
do {
printf("
'%s':'%s',
"
,$array['model_p'],$array['model_p']);
}
while($array = mysql_fetch_array($result));
echo "},"
?>
И изменять значение в select * from mod_print where (id_firm='1') и echo " '1':{"; на следующую цифру.
Я попытался сделать цикл на echo " '1':{";, но столкнулся с проблемой в select * from mod_print where (id_firm='1'), как сделать так чтобы
<?php
include "../data/dbconfig.php";
$result = mysql_query("select * from mod_print where (id_firm='1')");
$array = mysql_fetch_array($result);
echo " '1':{ ";
do {
printf("
'%s':'%s',
"
,$array['model_p'],$array['model_p']);
}
while($array = mysql_fetch_array($result));
echo "},"
?>, "копировалось" и изменялось значение выше указанных "полей" на +1?
ну определите какие ID нужны и вперед
$result = mysql_query( "SELECT * FROM `mod_print` WHERE `id_firm` IN (1,3,5,7,8,9,23)" );
$arr = $arr2 = array();
while ($array = mysql_fetch_array($result))
$arr[$array['id_firm']][] = sprintf("'%s':'%s'", $array['model_p'], $array['model_p']);
if ($arr)
foreach ($arr as $k => $i)
$arr2[] = "'" . $k . "':{" . implode(',', $i) . "}";
echo implode(',', $arr2);
blackmane
14-01-2012, 00:33
Все работает. Спасибо!
Я бы хотел спросить как оно работает, я понял только строку с выборкой, вижу цикл foreach, if, while. Что означает $k и $i????
Что означает $k и $i? »
почитайте про foreach (http://php.net/manual/ru/control-structures.foreach.php)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.