Форма с произволен брой променливи и запис в БД.

sizif

Registered
Здравейте!

Ако сте чели въпросите, които задавам напоследък опитвам се да направя меню, чиито елементи да могат да бъдат пренареждани от потребителя.

Имам таблица в БД, със следните елементи:

id, red, data, name, sydyrzhanie, където:

id - уникалния номер на реда, ключ към полетата в таблицата, попълва се автоматично от системата
red - поредността на връзката в менюто при листване, също число
data си е датата
name - името на връзката (пример "Начална", "За нас", "контакти" и пр)
sydyrzhanie - съдържанието на страницата, което ще се зареди при кликване върху връзктата

Ето и кода, който извлича информацията от БД и създава формата за пренареждане на връзките в менюто:

<html>
<body>
<form name="" method="Post" action="prered.php">


<?
$user="***";
$password="***";
$database="***";
mysql_connect(localhost,$user,$password);
@mysql_select_db($database) or die( "Unable to select database");
$chars="SET CHARACTER SET cp1251";mysql_query($chars);

$query="SELECT * FROM sydyrzhanie order by red";
$result=mysql_query($query)
or die ("Zaqwkata ne mozhe da se izpylni!");

$broi=mysql_num_rows($result);

while ($row = mysql_fetch_array($result))
{
echo "Razdel: ";
echo $row["name"];
echo "<br>";

echo "Poreden nomer: ";
$id=$row["id"];
echo "<br>$id";

echo "<B>Red:</B> ";
$red=$row["red"];
echo <<< GAN
<INPUT TYPE="TEXT" NAME="red$id" VALUE="$red" size="4" maxlenght=2><BR><BR>
GAN;

}

echo <<< GAN
<input type="hidden" name="broi" value="$broi">
<input type="submit" name="Submit" value="Prenaredi stranicite!">
GAN;

mysql_close();

?>


</body>
</html>


С формата нямам проблем - в кода на това листване няма какво да се обърка. Проблемът е алгоритъмът, по който ще се предава и актуализира информацията в полето red, така че да бъде обвързано със стойността на id като ключ към всеки ред. И за да бъде задачката още по-мъчна, актуализацията трябва да става от втори код, т.е. да имам още един файл. (вторият файл е за по-голяма сигурност, тъй като ще трябва да въведа и междинен момент на валидация, който трябва да включва и проверка дали въведените от потребителя числа за реда на листване не се повтарят)

Аз поне срещам тук два проблема:
1)поредността на id не е гарантирана, тъй като потребителят може да изтрива редове.
2)за всеки ред трябва да се предават две променливи, чиято стойност е взаимно обвързана (id като съответен ключ и новата стойност на red).
3)Имената на променливите при н-брой полета във формата

Още снощи успях да подкарам алгоритъм, който работи успешно при последователност на id, т.е. ако след създаването на таблицата не е имало изтриване на редове.(хипотеза, на която в реална среда няма как да разчитам)
Изпозлвах фор цикъл, който да получава информацията от кода по-горе (стойността на id за всеки запис се получава динамично от поредността в цикъла) и да я вкарва в таблицата като всеки ред се записва с отделна заявка.

Опитах и код, който създава масив с новите стойности на red, в който масив името на всеки елемент е съответната стойност на id. Само че не мога да прехвърля този масив в другия файл, който ще осъществи записа. (ако някой знае възможност за пренасяне на масиви, ще ми помогне значително).
Проблема с пренасянето на масива мога да реша като използвам междинен запис във файл, от който кода за ъпдейт на полето ще вземе стойностите под формата на нов масив.

Предполагам, че записа във файл мога да избегна като всеки път създавам и изтривам някаква временна таблица в БД, но ми се струва не по-малко усложнение...

Като последна надежда мисля да върна стария вариант редовете в менюто да се листват по id, и да пренареждам само него... Така обаче може да стане голяма каша, особено като знам непукизма на адресата на кода :(

Моля, помогнете ми да реша задачата! Приемам всякакви идеи!
Благодаря предварително!
 
Сега не мога да мисля за някакъв алгоритъм но трудността ще дойде от валидацията.
Не от това, че потребителя ще зададе еднакви числа някъде.
Той и на всичките да натряска еднакви числа пак ще се подредят някак.
order by red ще си работи екстра и при зададени 20 еднакви числа.
Ще си намери по какво да ги подреди но ще ги листне всички.

Проблема ще дойде от това, че може да не зададе числа въобще
или числата да са с десетични запетаи и тям подобни.

Макар, че не съм се сблъсквал досега с този проблем мисля, че
трябва да не му даваш да пише числа или знаци.
Просто срещу всяко меню да има "нагоре" надолу" и някак да успееш
да направиш следното.
Като натисне "нагоре" да разменя да разменя числото от полето с числото от предишното поле.
Като натисне надолу да разменя числото от полето на менюто с това на
долното поле от таблицата.
Просто при самото записване на ново меню му задаваш в колоната red
едно уникално число, което то да може да разменя с останалите редове(менюта).

Дали ме разбра какво имам предвид?
 
Я пробвай това дали ще работи:


<html>
<body>
<form name="" method="Post" action="prered.php">


<?
$user="***";
$password="***";
$database="***";
mysql_connect(localhost,$user,$password);
@mysql_select_db($database) or die( "Unable to select database");
$chars="SET CHARACTER SET cp1251";mysql_query($chars);

$query="SELECT * FROM sydyrzhanie order by red";
$result=mysql_query($query)
or die ("Zaqwkata ne mozhe da se izpylni!");

$broi=mysql_num_rows($result);
$i=0;
while ($i<$broi) {

$razdel[$i]=mysql_result($result,$i,"name");
$nomer[$i]=mysql_result($result,$i,"id");
$red[$i]=mysql_result($result,$i,"red");
echo "Razdel: ";
echo $razdel[$i];
echo "<br>";

echo "Poreden nomer: ";
echo "<br>$nomer[$i]";

echo "<B>Red:</B> ";

echo <<< GAN
<INPUT TYPE="TEXT" NAME="red$nomer[$i]" VALUE="$red[$i]" size="4" maxlenght=2><BR><BR>
GAN;

$i++;
}

echo <<< GAN
<input type="hidden" name="broi" value="$broi">
<input type="submit" name="Submit" value="Prenaredi stranicite!">
GAN;

mysql_close();

?>


</body>
</html>
 
Здравей, Админ!

Да, разбрах те, даже снощи търсих подобен скрипт на две места: "динамик драйв" и "джаваскрипткит", но не намерих нещо, което да мога да редкатирам и изпозлвам. Всъщност, разгледах един код за галерия, който сменяше имената на снимките от списъка с кликване напред-назад, но с js съм много зле, а и нямах ясна представа как ще обвържа действието на js с рнр и се отказах. Тази вечер пак ще го пробвам. Мисля, че кода беше в "джаваскрипт кит"...

Сега докато четях поста ти осъзнах, че промените, които правя трябва да отразя и в останалия код.
В самата страница листването става по "ид", докато реда на листване в менюто е по 'ред" (полето "ред' добавих снощи)...
С БД малко трудно мисля... :(

За валидацията: смятах да забраня използването на други символи в текстовото поле освен цифри и да правя проверка за това преди да подам данните за промяна.
Моментът със сравняването на числата обаче ми е неясен - възнамерявах да ползвам масив, да го сортирам (без връзка със записа - просто за проверка на данните) и да го обхождам с два цикъла - опитвал съм нещо подобно и си мисля, че и това мога да направя. Предаването на стойностите с връзка помежду им обаче не мога да разреша :(

Принципа, който предлагаш решава всички тези проблеми, даже ще е и по-практичен... Ще потърся такъв скрипт.

Благодаря!

ЕДИТ: ей сега! Благодаря!

Това като преред.пхп - всичко в един файл?
 
Не се мъчи да ги сравняваш ами ги размени.

Просто две съседни полета ще си разменят числата в полетата.

Тези числа ще се разменят постоянно между тези полета в зависимост от това как иска потребителя да ги размества менютата.
Горния скрипт ти го написах така за да може по лесно да се оправиш.
С двумерните масиви знам, че си спец и ще ти е по лесно така.

Вече всеки елемент ти е ясен.
Имаш стойността на предишното поле и следващото.

Ако искаш да промени поле с id=$nomer[$i];
и стойност на red -> $red[$i]

ще трябва да размениш стойността $red с $red[$i-1] или $red[$i+1]

Малко ми се спи и не знам доколко вече съм в час но се надявам, че схващаш какво се опитвам да направя.

Друг е въпроса доколко успешно се справям в момента . :D
 
Малко трудно, но май разбрах :)
Дава ми някаква недомислица при листването - не получавам стойности:
http://tntm.org/probna_3/prered.php

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

Записах файла като преред.пхп, но след обяснението ти разбирам, че това е за ред.пхп. Мисля че разбрах принципа. Сега ще опитам да напиша и кода за ъпдейт.
Само един въпрос: кода би трябвало да работи и ако потребителя разбърка всички номера в полето?

Благодаря ти още веднъж!
 
Я така:

<html>
<body>
<form name="" method="Post" action="prered.php">


<?
$user="***";
$password="***";
$database="***";
mysql_connect(localhost,$user,$password);
@mysql_select_db($database) or die( "Unable to select database");
$chars="SET CHARACTER SET cp1251";mysql_query($chars);

$query="SELECT * FROM sydyrzhanie order by red";
$result=mysql_query($query)
or die ("Zaqwkata ne mozhe da se izpylni!");

$broi=mysql_num_rows($result);
$i=0;
while ($i<$broi) {

$razdel[$i]=mysql_result($result,$i,"name");
$nomer[$i]=mysql_result($result,$i,"id");
$red[$i]=mysql_result($result,$i,"red");
echo "Razdel: ";
echo $razdel[$i];
echo "<br>";

echo "Poreden nomer: ";
echo "<br>$nomer[$i]";

echo "<B>Red:</B> ";

echo '
<INPUT TYPE="TEXT" NAME="red$nomer[$i]" VALUE="'.$red[$i].'" size="4" maxlenght=2><BR><BR>';

$i++;
}

echo <<< GAN
<input type="hidden" name="broi" value="$broi">
<input type="submit" name="Submit" value="Prenaredi stranicite!">
GAN;

mysql_close();

?>


</body>
</html>
 
Изписа номерата!
Благодаря!

Само не знам защо и преди това не ми прие тази форма на запис:
echo <<< GAN
....
GAN;
а ми изписа грешка... Някога го приема, някога не :( н.з.

ПП: ако не ставам нахален, може ли да ми кажеш как ще ми изглежда заявката към бд?
Преди малко си мислих, че съм схванал принципа, но май не съм :(
 
sizif каза:
Изписа номерата!
Благодаря!

Само не знам защо и преди това не ми прие тази форма на запис:
echo <<< GAN
....
GAN;
а ми изписа грешка... Някога го приема, някога не :( н.з.

Тази форма

echo <<< GAN
....
GAN;

е за предпочитане.

Сега не става заради value или и аз не знам защо.
Но в повечето случай е доста удобна.
 
Здравей, Админ,

намерих подходящ js (по идеята от първия ти пост), но не зная как да го вкарам в работа. За падащо меню е, но изглежда се маркират повече от една или всички стойности. Доколкото успях да схвана работи с два масива - първоначален и втори, който се създава след пренареждане и мисля, че е много подходящ.

Ето връзки към източника:
http://www.javascriptkit.com/script/script2/picklist.shtml
http://www.javascriptkit.com/script/script2/picklist2.shtml

Взел съм втория скрипт, но сега си мисля дали първия няма да върши по-добра работа... ? :roll:

Идеята ми е втория js-масив да се превърне в рнр-масив (подредбата му ще дава стойността на red, а стойността ан елементите ще съдържат съответното ид). После спокойно резултата от обхождането на рнр-масива може да влезе в БД. Тогава наистина ще отпадне нуждата от валидация или валидацията ще е съвсем опростена - дали броя на елементите във втория масив отговора на броя на редовете в таблицата. Потребителя не може да пише нищо, може единствено да пренарежда елементите - струва ми се съвсем възможно и безопасно цялата операция да се върши от един файл...

Съвсем откровено признавам, че не мога да създам кода, от който се нуждая, затова разчитам на помощ. Може би картината донякъде ще ми се изясни, ако разбера какво точно връща js-та по пост метода, но не успях да го листна, а гет заявката е някаква каша :(

Преди малко направих елементарна компилация между РНР-кода и js-та, за да илюстрирам идеята:

<HTML>
<HEAD>

<script type="text/javascript">

function move(fbox, tbox) {
var arrFbox = new Array();
var arrTbox = new Array();
var arrLookup = new Array();
var i;
for(i=0; i<tbox.options.length; i++) {
arrLookup[tbox.options.text] = tbox.options.value;
arrTbox = tbox.options.text;
}
var fLength = 0;
var tLength = arrTbox.length
for(i=0; i<fbox.options.length; i++) {
arrLookup[fbox.options.text] = fbox.options.value;
if(fbox.options.selected && fbox.options.value != "") {
arrTbox[tLength] = fbox.options.text;
tLength++;
} else {
arrFbox[fLength] = fbox.options.text;
fLength++;
}
}
arrFbox.sort();
arrTbox.sort();
fbox.length = 0;
tbox.length = 0;
var c;
for(c=0; c<arrFbox.length; c++) {
var no = new Option();
no.value = arrLookup[arrFbox[c]];
no.text = arrFbox[c];
fbox[c] = no;
}
for(c=0; c<arrTbox.length; c++) {
var no = new Option();
no.value = arrLookup[arrTbox[c]];
no.text = arrTbox[c];
tbox[c] = no;
}
}

function selectAll(box) {
for(var i=0; i<box.length; i++) {
box.selected = true;
}
}
</script>


</HEAD>
<BODY>


<form method="POST" name="combo_box" ACTION="prered_1.php>
<table cellpadding="4" cellspacing="0" border="0">
<tr>
<td>
<select multiple size="10" name="list1" style="width:150" onDblClick="move(document.combo_box.list1,document.combo_box.list2)">

<?
$user="tntmorg_gan";
$password="ganpass";
$database="tntmorg_test";
mysql_connect(localhost,$user,$password);
@mysql_select_db($database) or die( "Unable to select database");
$chars="SET CHARACTER SET cp1251";mysql_query($chars);

$query="SELECT * FROM sydyrzhanie order by red";
$result=mysql_query($query)
or die ("Zaqwkata ne mozhe da se izpylni!");

$broi=mysql_num_rows($result);

while ($row = mysql_fetch_array($result))
{
$id=$row["id"];
$name=$row["name"];
echo "<option value='$id'>$name</option>";
}


mysql_close();

?>

</select>
</td>
<td align="center" valign="middle">
<input type="button" onClick="move(this.form.list2,this.form.list1)" value="<<" id=button1 name=button1>
<input type="button" onClick="move(this.form.list1,this.form.list2)" value=">>" id=button2 name=button2>
</td>
<td>
<select multiple size="10" name="list2" style="width:150" onDblClick="move(document.combo_box.list2,document.combo_box.list1)">
</select>
</td>
</tr>
<tr><td align="center" colspan="3"><input type="submit" name="submit_button" value="Submit" onClick="selectAll(document.combo_box.list2);"></td></tr>
</table>
</form>

</BODY>
</HTML>



Тъй като при създаване на първия js-масив се листват имената на връзките няма значение каква му е подредбата, което означава, че за стойност на всяка връзка може да се сложи нейното id. При пренареждането елементите във втория масив ще пазят съответното id (за определяне мястото на всеки запис), а поредността им в масива ще дава стойността на red.

Ето и пример на кода по-горе:
http://tntm.org/probna_3/red_2.php

Реда за сортиране в червено (кой масив точно сортира не знам) съм го махнал, защото иначе подреждаше елементите по азбучен ред.

Благодаря предварително!
 
sizif каза:
Малко трудно, но май разбрах :)
Дава ми някаква недомислица при листването - не получавам стойности:
http://tntm.org/probna_3/prered.php
Само един въпрос: кода би трябвало да работи и ако потребителя разбърка всички номера в полето?

Благодаря ти още веднъж!

Той може да ги разбърка но това няма значение.
Сортира се полето ред.
В зависимост от това как ги разбърква (разменя) ще се подрежда различно.

Не трябва да има редове с еднаква стойност на но и да има няма проблем.
 
Здравей!

По кода, който ми пусна снощи не съм правил нищо. Мъчих се да листна резултата от js-та за пренареждане, но не успях.

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

Онова, което ми харесва при него е, че потребителя и да иска, няма какво да обърка. Това, което ме притеснява е, че може информацията, която връща, да е доста по-абстрактна, отколкото си я представям и да не може да се обработи... :(
Но ако представлява масив, подобен на изходния (както силно се надявам) би могъл да се преобразувам в рнр-масив, от който да се осъществява записа в БД.

Знам че си много зает, а и снощи реагира своевременно по същата задача с друго решение, но ако имаш някакви идеи и по този скрипт, ще ми помогнеш значително, а и предполагам, че той би бил полезен и на други.

Благодаря предварително!
 
sizif каза:
Здравей!

По кода, който ми пусна снощи не съм правил нищо. Мъчих се да листна резултата от js-та за пренареждане, но не успях.

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

Онова, което ми харесва при него е, че потребителя и да иска, няма какво да обърка. Това, което ме притеснява е, че може информацията, която връща, да е доста по-абстрактна, отколкото си я представям и да не може да се обработи... :(
Но ако представлява масив, подобен на изходния (както силно се надявам) би могъл да се преобразувам в рнр-масив, от който да се осъществява записа в БД.

Знам че си много зает, а и снощи реагира своевременно по същата задача с друго решение, но ако имаш някакви идеи и по този скрипт, ще ми помогнеш значително, а и предполагам, че той би бил полезен и на други.

Благодаря предварително!

Ти как ги свързваш js с php?

С php може да генерираш JS код но обратното не става.
 
Въпросния js изпраща нещо по пост метода от ХТМЛ форма - ако е масив може да се листне в хтмл (текст плюс тагове), от който да се извлече информацията, ако е някакъв списък от променлвии подхода би могъл да бъде същия.
Не знам, какво връща той, за да говоря конкретно. В неудобния сценарий на следващата страница получаваме резултата в нова ХТМЛ-форма, даваме и "само за четене", потребителя я одобрява (пращаме към РНР кода) или я отказва (връщаме го към изходната страница).
Така мисля, но е възможно и да греша. Не съм си представял обаче, че резултата от js може директно да бъде пратен към сървъра :)

Мислиш ли, че така би могло да стане?
 
sizif каза:
Въпросния js изпраща нещо по пост метода от ХТМЛ форма - ако е масив може да се листне в хтмл (текст плюс тагове), от който да се извлече информацията, ако е някакъв списък от променлвии подхода би могъл да бъде същия.
Не знам, какво връща той, за да говоря конкретно. В неудобния сценарий на следващата страница получаваме резултата в нова ХТМЛ-форма, даваме и "само за четене", потребителя я одобрява (пращаме към РНР кода) или я отказва (връщаме го към изходната страница).
Така мисля, но е възможно и да греша. Не съм си представял обаче, че резултата от js може директно да бъде пратен към сървъра :)

Мислиш ли, че така би могло да стане?

Прекалено сложно ми се вижда.
Защо не оставиш този проблем с менютата.
Дай нататък с кода пък после пак ще пробваме.
Усложняваш доста нещата.

//ОФФ

pisalka.jpg

Това не е обикновенна писалка.
С тази писалка може да пишеш в космоса.
Нейното мастило не се разлива и работи перфектно във
вакум и пълна безтегловност.
Създадена е от NASA.
Разработката е отнела 2 години и 140 милиона долара.

Сега натисни тук за да видиш

как руснаците са решили проблема.
//OFF
:)
 
С молив :)
Зная отговора :)
Но мисля по това вече... втрои? Не, трити ден. Кажи ми поне как да разбера какво връща скрипта. Смятам, че ще може да се обработи...
Иначе за страницата, която работя (като изключим това) ми остана само да вържа рнр кода с хтмл-а...

Е и още нещо трябва да направя - ъплоуд на снимки и рисайз, но тук нямам никакъв опит (или само отрицателен) и съм го оставил за финал...

Иначе за js-та видях, че снощи съм пропуснал да сложа едни кавички в адреса към който трябва да прати данните, така че днес започвам да го мъча отначало с нова надежда :)
 
Честно да ти призная не разбрах за какво служи този JS и защо трябва да изпраща данни.

Всъщност се оплетох още на предпоследния ти въпрос.
 
Листанх го най-сетне, виж това:

http://tntm.org/probna_3/red_2.php

Кода на преред.пхп:
<HTML>
<HEAD>
</HEAD>
<BODY>

<?
$list=$HTTP_POST_VARS['list2'];
echo "$list";
?>

</BODY>
</HTML>

Името на второто падащо меню от формата е list2. Още не мога да разбера каква е стойността която получава след разместването - връща ми числа, но и аз съм и задал числа. Сега ще сменя с текст, за да разбера какво прави :)
Има останало още едно сортиране в джскрипта, ще махна и него, но първо ще се опитам да разбера как образува стойността.

ПП: всъщност от едно падащо меню във формата създава ново. Съдържанието на първото меню може да се създаде динамично, както съм го направил и аз: всяка опция със стойност... Лошото на падащите менюта е, че имат само един избор, т.е. връща само една стойност от всички възможни. Скрипта обаче позволява маркирането на повече стойности. Вече знам, че връща поне една стойност, която се променя в зависимост от пренареждането, но още не знам, как я образува...
 
Ха.
Ама това много хитро бе. :)

Може да стане май така и ще е доста интересно.
Добре.. добре.
Дай да видя какво ще направиш и да гепна кода после, че и аз
мога да го ползвам за други цели.
 
Само да го подкарам... :)
Едно време така се въртях със сорса на алтависта, да разбера как търси :)) Дано имам по-голям успех от тогава...

ПП: връща стойността на първия избор. Имаш ли идея как може да се обработи, за да стане пренареждането?

Сега ще се опитам да подкарам скрипта през текстареа или текстово поле с имената им... реда отново ще стойността на "ред", но ще имам на всички, а не само първата...

Стойността на падащото меню е мултипъл - т.е. повече от една опции. Как се обработва с рнр такова падащо меню?

На път съм да реша проблема без да се опитвам да сменям формата:

http://bg2.php.net/manual/en/faq.html.php
 

Горе