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

Kod: Markera allt

INSERT INTO schema SET amne='$amne[$i]'
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:

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]

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 :lol:

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 :D