Sida 1 av 1
PHP och MASSAOR av textboxar
Postat: 23 juni 2005, 14:19:39
av AndLi
Mjukvara som mjukvara eller?
Har ett litet problem... Har typ en websida med MASSOR av textboxar, (en för varje dag (21 st) * antalet projekt(som varierar från 1-2 till 20-30st).
Dessa ska man knappa in tid i och sen trycka på typ "Spara".
Och det är ju då det börjar bli jobbigt, finns det nått smart sätt att läsa av värdet i dessa hundratals textboxar? Lägga upp dem i nån typ av tvådimmad array eller nått?
Kör PHP4, värdet ska sen in i en mysql databas, fast det borde kvitta i detta läget...
Har försökt komma på några bra sökfraser på google, men utan nån direkt tur.
Postat: 23 juni 2005, 15:55:03
av vikingen
Så här gjorde jag när jag skulle lägga in massa lektioner i en schemadatabas.
I edit-filen
Kod: Markera allt
<input type=text name=amne[$i] value=\"$amne[$i]\" size=30>
och i update-filen
båda ligger i var sin loop som räknar igenom $i
Postat: 23 juni 2005, 16:57:57
av pheer
Antar att det är timmar som ska vara i textboxarna. Om du i projekttabellen har kolumnerna id, name och day0-day21 så kan du ha någon liknande kod för att visa sidan med textboxarna för ett projekt:
Kod: Markera allt
<FORM METHOD="post" ACTION="change.php">
<TABLE>
<?php
$id = ...;
mysql_query("SELECT * FROM projects WHERE id='$id'", $db);
$nrofprojects = mysql_num_rows($query);
print "<input type=\"hidden\" name=\"nrofprojects\" value=\"$nrofprojects\">";
while ( ($row = mysql_fetch_array($query)) != FALSE ) {
print "<TR><TH>{$row['name']</TH></TR>"
for ( $i = 0; $i < 21; $i++ ) {
print "<TR><TD>Day {$i+1} <input type=text name=\"hours_p{$row['id']}}_day$i\" value=\"{$row["day$i"]}\" size=30></TD></TR>";
}
}
?>
<TR><TD COLSPAN=<?php print $nrofprojects; ?><INPUT TYPE="submit"></TD></TR>
</TABLE>
</FORM>
Koden för change.php ser då ut såhär:
Kod: Markera allt
<?php
for ( $i = 0; $i < $form['nrofprojects']; $i++ ) {
for ( $j = 0; $j < 21; $j++ ) {
mysql_query("UPDATE projects SET day$j={$form["hours_p{$i}_day{$j}"]} WHERE id = $i", $db);
}
}
?>
(koden innehåller säkert något/några syntaxfel)
Postat: 23 juni 2005, 19:09:16
av AndLi
Ahh tackar, verkar smidigt, får testa när jag är tillbaka på jobb efter midsommarhelgen!
Postat: 27 juni 2005, 18:08:48
av AndLi
Nu har jag misshandlat era exempel "lite"
test.php
Kod: Markera allt
<FORM METHOD="post" ACTION="change.php">
<?php
$i=10;
print "Day $i <input type=text name=\"hours_day$i\" value=\"00\" size=30>";
?>
<INPUT TYPE="submit">
</FORM>
Ritar ut en jättefin textbox med namnet hours_day10.
change.php
Kod: Markera allt
<?php
$i=10;
echo "<br><br>form hours_day$i = {$form["hours_day$i"]}";
echo "<br>get hours_day$i = {$_GET["hours_day$i"]}";
echo "<br>post hours_day$i = {$_POST["hours_day$i"]}";
?>
Det är här det börjar bli skumt, som jag tolkar pheer:s kodexempel skulle jag få ut värdet på det översta sättet att skriva, det får jag inte... utan bara via $_POST varianten, att inte $_GET funkar kan kan köpa.
I vinkings exempel förstår jag inte riktigt hur värdet skulle hamna i 'amne[$i]' Sker detta automagisgt? Finns det alltid en variabel för varje input man har på ett formulär? Vad är då vinsten med att använda _POST/_GET istället?
Postat: 27 juni 2005, 19:17:36
av cykze
Har man register_globals avslaget i sin php.ini så måste man använda $_GET, $_POST osv. för att komma åt variabler som kommer från användaren på något sätt. Det är en säkerhetsgrej.
I pheers exempel är du tvungen att använda $_POST eftersom forumulärdatan skickas via POST-metoden och du nog har register_globals avslaget (numera standard).
I vikings exempel måste du också använda $_POST för att komma åt datan av samma anledning. Lägg in:
på "mottagarsidan" för att se var värdena sparas i arrayen. Som du kanske luskar ut av utskriften från print_r() så kan du komma åt värdena genom $_POST[amne][$i]
Postat: 27 juni 2005, 19:43:11
av AndLi
Aha, det var så man skulle skriva $_POST för att komma åt dem i arrayen... Nu ligger de med namn som pheers exempel istället.
Eftersom det är en standard debian ap-get php4 installation så kan man nog rätt säkert misstänka att register_globals är avslaget.
Tackar för hjälpen!
Postat: 27 juni 2005, 22:08:45
av pheer
Sorry, det var lite otydligt jag använder själv en funktion som automatiskt lägger $_GET eller $_POST i $form samtidigt som en säkerhetskontroll görs...så i ditt fall ska det stå $_POST...
Postat: 27 juni 2005, 22:54:26
av chille
Ett annat alternativ är att köra $_REQUEST[...], det tar data från både GET/POST.
Och vad du än gör, slå inte på register_globals.
Sen kan du ju akta dig för att klämma in någon SQL-injection-exploit.
Säg att du har kod som ser ut såhär:
$id = $_GET['id'];
$q = mysql_query("SELECT tilte,body,date,author FROM news WHERE id='$id'") or die();
BAM... du har fått in en exploit i koden... räcker med att man skriver något i stil med ?id=';UPDATE useres SET admin='true' WHERE user='chille'; eller något liknande
Postat: 27 juni 2005, 23:49:45
av AndLi
chille:
Tänkte inte slå på register_globals, du kan vara lugn
Har tittat lite på det där med säkerheten, och visst finns det många fina misstag man kan göra. Borde väll i detta fallet vara rätt säkert att klippa ner alla textsträngar till 2 tecken... Bortklippning av div specialtecken borde väll också säkra lite...
Men visst ska jag erkänna att koden idag är full av sql-injection-exploits