PHP och MASSAOR av textboxar

Elektronik- och mekanikrelaterad mjukvara/litteratur. (T.ex schema-CAD, simulering, böcker, manualer mm. OS-problem hör inte hit!)
Användarvisningsbild
AndLi
Inlägg: 17044
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

PHP och MASSAOR av textboxar

Inlägg 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.
vikingen
EF Sponsor
Inlägg: 167
Blev medlem: 5 februari 2004, 15:39:43
Ort: Orust

Inlägg 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

Kod: Markera allt

INSERT INTO schema SET amne='$amne[$i]'
båda ligger i var sin loop som räknar igenom $i
pheer
EF Sponsor
Inlägg: 1283
Blev medlem: 16 januari 2005, 18:05:21

Inlägg 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)
Användarvisningsbild
AndLi
Inlägg: 17044
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Inlägg av AndLi »

Ahh tackar, verkar smidigt, får testa när jag är tillbaka på jobb efter midsommarhelgen!
Användarvisningsbild
AndLi
Inlägg: 17044
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Inlägg 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?
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg 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:

Kod: Markera allt

<pre>
<? print_r($_POST[amne]) ?>
</pre>
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]
Användarvisningsbild
AndLi
Inlägg: 17044
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Inlägg 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!
pheer
EF Sponsor
Inlägg: 1283
Blev medlem: 16 januari 2005, 18:05:21

Inlägg 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...
Användarvisningsbild
chille
Inlägg: 2469
Blev medlem: 25 juni 2003, 20:54:41
Ort: Stockholm
Kontakt:

Inlägg 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 :lol:
Användarvisningsbild
AndLi
Inlägg: 17044
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Inlägg 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 :D
Skriv svar