[PHP] Input form naar een variabele

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • duifi
  • Registratie: Januari 2010
  • Laatst online: 15-03-2024
Beste Devvers

Voor een informatica opdracht moeten wij een online kruiswoordpuzzel maken.

Nu komt er uit de webpagina een aantal inputs.

Zoals je kan zien ben ik vanaf regel 26 begonnen met inputs naar variable om te zetten, maar om dit voor uiteindelijk 30 variable te doen lijkt me een beetje te veel van het goede.

Ik vroeg me af of het mogelijk was om de naam van de input, direct om te zetten naar variabelen.
Dus bijvoorbeeld input: R1K1 wordt gelijk $R1K1 .

Als tweede vroeg ik me af of het mogelijk was om de voledige input, dus R1K1 t/m R1K8 in een variable te zetten, met de naam $woord1 bijvoorbeeld.


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<html>
<head>
<title>Kruiswoordpuzzel</title>
</head>
<body>
<?php
$mysql = mysql_connect("localhost","root") or die("Fout: Er is geen verbinding met de MySQL-server tot stand gebracht!");
mysql_select_db("kruiswoord",$mysql) or die("Fout: Het openen van de database is mislukt!");
$antwoorden = mysql_query("SELECT * FROM antwoorden",$mysql) or die("De query antwoorden op de database is mislukt!");
$vragen = mysql_query("SELECT * FROM vraag", $mysql)  or die ("De query vragen op de database is mislukt!");
mysql_close($mysql) or die("Het verbreken van de verbinding met de MySQL-server is mislukt!");
?>

<?php      
     while(list($vak,$antwoord,$antwoordnr) = mysql_fetch_row($antwoorden))
     {
    }
?>


<form action="maarten.php" method="post">
<p><input type="text" name="R1K1" size="1%" /><input type="text" name="R1K2" size="1" /><input type="text" name="R1K3" size="1" /><input type="text" name="R1K4" size="1" /><input type="text" name="R1K5" size="1"/><input type="text" name="R1K6" size="1"/><input type="text" name="R1K7" size="1" /><input type="text" name="R1K8" size="1" /></P>
<p><input type="submit" name="submit" value="Controleren"/> </P>
</form>

<?php
$test1 = $_REQUEST["R1K1"];
$test2 = $_REQUEST["R1K2"];

$test3 = "$test1$test2";


echo "$test3" ;
?>



</form>
</body>
</html>

Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Als je nou gewoon twee nested for-loops maakt, een voor de kolommen en een voor de rijen, en daarin dan een een tweedimensionale array vult?

Of, beter nog, dit in je form al gewoon regelen door een control array te gebruiken.

[ Voor 23% gewijzigd door CodeCaster op 05-04-2012 14:45 ]

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • Wim-Bart
  • Registratie: Mei 2004
  • Laatst online: 10-01-2021

Wim-Bart

Zie signature voor een baan.

Heel simpel eigenlijk:

PHP:
1
2
3
4
5
for ($i=1;i<=30;$i++)
{
  $varname= "test".$i
  $$varname= $_REQUEST["R1K".$i]
}


Let op de $$.

Of je kan het volgende doen als het in 1 var moet komen:
PHP:
1
2
3
4
5
$langestring= "";
for ($i=1;i<=30;$i++)
{
  $langestring= $langestring.$_REQUEST["R1K".$i];
}


Of netter (de wijze waarop PHP omgaat met geheugen is soms niet zo netjes):
PHP:
1
2
3
4
5
6
7
$langestring= "";
for ($i=1;i<=30;$i++)
{
  $tempvar=$langestring.$_REQUEST["R1K".$i];
  $langestring= $tempvar;
  $tempvar= "";
}

Beheerders, Consultants, Servicedesk medewerkers. We zoeken het allemaal. Stuur mij een PM voor meer info of kijk hier De mooiste ICT'er van Nederland.


Acties:
  • 0 Henk 'm!

  • phex
  • Registratie: Oktober 2002
  • Laatst online: 06-10 02:12
Je kan gewoon arrays posten

HTML:
1
2
<input type="text" name="field[0]" value="" />
<input type="text" name="field[1]" value="" />


en dat met php joinen tot 1 string

PHP:
1
$string = join('', $_GET['field']);

[ Voor 11% gewijzigd door phex op 05-04-2012 15:24 ]


Acties:
  • 0 Henk 'm!

  • duifi
  • Registratie: Januari 2010
  • Laatst online: 15-03-2024
phex schreef op donderdag 05 april 2012 @ 15:19:
Je kan gewoon arrays posten

HTML:
1
2
<input type="text" name="field[0]" value="" />
<input type="text" name="field[1]" value="" />


en dat met php joinen tot 1 string

PHP:
1
$string = join($_GET['field']);
Is het in bovengenoemd verhaal dan ook mogelijk om dat input text gedeelte te verkorten,
Dus dat een waarde uit de database aangeeft hoeveel input forms er moeten worden gemaakt?

Acties:
  • 0 Henk 'm!

  • Bee.nl
  • Registratie: November 2002
  • Niet online

Bee.nl

zoemt

Wim-Bart schreef op donderdag 05 april 2012 @ 14:55:
Heel simpel eigenlijk:

PHP:
1
2
3
4
5
for ($i=1;i<=30;$i++)
{
  $varname= "test".$i
  $$varname= $_REQUEST["R1K".$i]
}
Hmm, ik ben niet echt gecharmeerd van zulke oplossingen.

Ik zie dat de method POST is, dus dan zou ik gewoon de variabelen opvangen via $_POST ipv $_REQUEST.
Je kunt gebruik maken van arrays in je form, dan krijg je in php de rij-kolomdata ook in een array geserveerd.

HTML:
1
2
3
4
5
6
<!-- rij 1 kolom 1 t/m 2 -->
<input type="text" name="puzzle[1][1]" size="1" />
<input type="text" name="puzzle[1][2]" size="1" />
<!-- rij 2 kolom 1 t/m 2 -->
<input type="text" name="puzzle[2][1]" size="1" />
<input type="text" name="puzzle[2][2]" size="1" />


Let ook even op je html, want size moet een integer zijn, geen percentage. Ik mis ook nog een doctype.

PHP:
1
2
3
4
5
6
if ($_POST) {
   $data = $_POST['puzzle'];
   // $data[1][1] is karakter in rij 1 kolom 1
   // validatie hier
   $woord = implode('', $data[1]); // woord(en) van rij 1
}


Met implode() zou je bijvoorbeeld stukken aan elkaar kunnen plakken om de (horizontale) woorden te krijgen. Door de array te transponeren kun je makkelijk de verticale woorden vinden. De rest laat ik aan jou over :)

Vergeet niet om de inputdata te valideren. Denk daarbij oa aan de toegestane karakters.

mysql_close() is doorgaans niet nodig, want dat wordt aan het eind van het script automatisch gedaan. Minder code is minder kans op fouten.

Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Wim-Bart schreef op donderdag 05 april 2012 @ 14:55:
Heel simpel eigenlijk:

PHP:
1
2
3
4
5
for ($i=1;i<=30;$i++)
{
  $varname= "test".$i
  $$varname= $_REQUEST["R1K".$i]
}


Let op de $$.
Wat is er mis met arrays?
Of netter (de wijze waarop PHP omgaat met geheugen is soms niet zo netjes):
PHP:
1
2
3
4
5
6
7
$langestring= "";
for ($i=1;i<=30;$i++)
{
  $tempvar=$langestring.$_REQUEST["R1K".$i];
  $langestring= $tempvar;
  $tempvar= "";
}
Kun je uitleggen wat je hier doet, en wat er "netter" aan is dan gewoon de string aan dezelfde variabele concatenaten?

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • phex
  • Registratie: Oktober 2002
  • Laatst online: 06-10 02:12
Ik snap het probleem niet helemaal

PHP:
1
2
3
4
5
for ($y = 0; $y < 32; $y++) {
    for ($x = 0; $x < 32; $x++) {
       echo '<input type="text" name="field[' . $x . '][' . $y . ']" value="" />';
    }
}


Zoiets?

Maar voordat wij jouw huiswerk gaan maken probeer eerst alle eisen/problemen op een rij te zetten voordat je direct aan het scripten slaat.

Acties:
  • 0 Henk 'm!

  • duifi
  • Registratie: Januari 2010
  • Laatst online: 15-03-2024
Bee.nl schreef op donderdag 05 april 2012 @ 15:25:
[...]

Hmm, ik ben niet echt gecharmeerd van zulke oplossingen.

Ik zie dat de method POST is, dus dan zou ik gewoon de variabelen opvangen via $_POST ipv $_REQUEST.
Je kunt gebruik maken van arrays in je form, dan krijg je in php de rij-kolomdata ook in een array geserveerd.

HTML:
1
2
3
4
5
6
<!-- rij 1 kolom 1 t/m 2 -->
<input type="text" name="puzzle[1][1]" size="1" />
<input type="text" name="puzzle[1][2]" size="1" />
<!-- rij 2 kolom 1 t/m 2 -->
<input type="text" name="puzzle[2][1]" size="1" />
<input type="text" name="puzzle[2][2]" size="1" />


Let ook even op je html, want size moet een integer zijn, geen percentage. Ik mis ook nog een doctype.

PHP:
1
2
3
4
5
6
if ($_POST) {
   $data = $_POST['puzzle'];
   // $data[1][1] is karakter in rij 1 kolom 1
   // validatie hier
   $woord = implode('', $data[1]); // woord(en) van rij 1
}


Met implode() zou je bijvoorbeeld stukken aan elkaar kunnen plakken om de (horizontale) woorden te krijgen. Door de array te transponeren kun je makkelijk de verticale woorden vinden. De rest laat ik aan jou over :)

Vergeet niet om de inputdata te valideren. Denk daarbij oa aan de toegestane karakters.

mysql_close() is doorgaans niet nodig, want dat wordt aan het eind van het script automatisch gedaan. Minder code is minder kans op fouten.
Ook bij deze nog de vraag, is het mogelijk om de input list te verkleinen? door gewoon per rij aan te geven hoeveel invulvakken er nodig zijn, bij voorkeur met een waarde uit de database.

Ik denk trouwens dat ik met deze manier redelijk verder kom.

Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

duifi schreef op donderdag 05 april 2012 @ 15:31:
[...]


Ook bij deze nog de vraag, is het mogelijk om de input list te verkleinen? door gewoon per rij aan te geven hoeveel invulvakken er nodig zijn, bij voorkeur met een waarde uit de database.

Ik denk trouwens dat ik met deze manier redelijk verder kom.
Wat heb je al geprobeerd?

Het is net zo makkelijk om in een for-loopje form-elementen te printen als om ze uit te lezen.

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • Bee.nl
  • Registratie: November 2002
  • Niet online

Bee.nl

zoemt

duifi schreef op donderdag 05 april 2012 @ 15:31:
[...]


Ook bij deze nog de vraag, is het mogelijk om de input list te verkleinen? door gewoon per rij aan te geven hoeveel invulvakken er nodig zijn, bij voorkeur met een waarde uit de database.

Ik denk trouwens dat ik met deze manier redelijk verder kom.
Nee, je zult domweg alle inputvelden neer moeten zetten. In de post van phex boven je kun je precies zien hoe je dat moet doen. Het maakt dan niet zoveel uit of de dimensies van het speelveld uit een database komen of dat je ze in je code definieert. Je zult die twee for-loops moeten maken.

Acties:
  • 0 Henk 'm!

  • duifi
  • Registratie: Januari 2010
  • Laatst online: 15-03-2024
Ik weet dat ik inderdaad veel van jullie vraag, probleem is alleen dat mijn docent al geruime tijd overspannen thuis zit en we dit wel moeten maken. Dat is verder niet jullie probleem, maar wel de reden dat ik er geen snars van snap haha.
Ik ga wel weer verder vechten met de code, iig bedankt voor jullie hulp/inzet.

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 00:46

MueR

Admin Devschuur & Discord

is niet lief

Zou je dit soort rotzooi alsjeblieft niet aan beginnende programmeurs willen uitleggen? Variabele variabelen zijn al hoofdpijn genoeg voor een ervaren programmeur, die mijdt ze dan ook tenzij er echt geen ander alternatief is, laat staan dat je dit als een goede oplossing gaat geven voor een beginner.

Verder aan de TS: Gebruik alsjeblieft $_GET of $_POST, geen $_REQUEST. Request is namelijk een vergaarbak van GET, POST en COOKIE (soms ook SESSION), waarbij je nooit zeker weet waar de variabele nu vandaan komt.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • duifi
  • Registratie: Januari 2010
  • Laatst online: 15-03-2024
Beste iedereen, ik ben bezig geweest met enkele dingen.
Ik kom nog steeds niet helemaal uit

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<html>
<head>
<title>Kruiswoordpuzzel</title>
</head>
<body>
<?php
$mysql = mysql_connect("localhost","root") or die("Fout: Er is geen verbinding met de MySQL-server tot stand gebracht!");
mysql_select_db("kruiswoord",$mysql) or die("Fout: Het openen van de database is mislukt!");
$antwoorden = mysql_query("SELECT * FROM antwoorden",$mysql) or die("De query antwoorden op de database is mislukt!");
$vragen = mysql_query("SELECT * FROM vraag", $mysql)  or die ("De query vragen op de database is mislukt!");
mysql_close($mysql) or die("Het verbreken van de verbinding met de MySQL-server is mislukt!");
?>
<form action="maarten.php" method="post">
<?php
$teller = 0;
$naast_elkaar = 8;
$kolom = 0;
echo '<table>';
while($teller<=7)
{   echo ($teller % $naast_elkaar) == 0 ? '<tr>' : '';
    echo '<td>';
    echo '<input type="text" name="woord[1][$kolom]" size="1" >';
    echo '</td>';
    $teller++;
    $kolom++;
    echo ($teller % $naast_elkaar) == 0 ? '</tr>' : '';
}
echo '<input type="submit" value="controleer"/>';
echo '</form>' ;
echo ($teller % $naast_elkaar) != 0 ? '</tr>' : '';
echo '</table>';

if ($_POST) { 
   $data = $_POST['woord']; 
   $woord = implode('', $data[1]); } 

echo $woord ;
?>

</body>
</html>


Het probleem is dat de uitvoer van de echo alleen de inhoud is van het laatste imput form uitgeeft.
Ik zou willen weten waar het probleem zit

Acties:
  • 0 Henk 'm!

  • Robbiedobbie
  • Registratie: Augustus 2009
  • Laatst online: 13:55
PHP:
26
    echo ($teller % $naast_elkaar) == 0 ? '</tr>' : '';

Dit zal nooit aangeroepen worden omdat de teller op de regel erboven verhoogd wordt, terwijl die modulo alleen 0 is wanneer $teller ook 0 is. Hierdoor zal in jouw code nooit </td> voorkomen.

Acties:
  • 0 Henk 'm!

  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 18:55
PHP:
1
echo '<input type="text" name="woord[1][$kolom]" size="1" >';

Dat gaat niet werken, want binnen elke quotes, blijf je variable onaangepast, probeer dit:
PHP:
1
echo '<input type="text" name="woord[1]['.$kolom.']" size="1" >';

Verder kan je met print_r($array) de hele arraystructuur weergeven. Dat maakt het debuggen misschien wat makkelijker.
PHP:
1
2
3
print_r($_POST)
//Of alleen jouw data:
print_r($_POST['woord'])

[ Voor 0% gewijzigd door Barryvdh op 06-04-2012 16:32 . Reden: Vrijdagmiddagfoutje.. ]


Acties:
  • 0 Henk 'm!

  • Robbiedobbie
  • Registratie: Augustus 2009
  • Laatst online: 13:55
Barryvdh schreef op vrijdag 06 april 2012 @ 15:09:
PHP:
1
echo '<input type="text" name="'.woord[1][$kolom].'" size="1" >';
Ik denk dat je dit bedoelt:
PHP:
1
echo '<input type="text" name="woord[1]['.$kolom.']" size="1" >';

Acties:
  • 0 Henk 'm!

  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 18:55
Ehh oepsie, dat inderdaad. Vrijdagmiddag he :P

Acties:
  • 0 Henk 'm!

  • Robbiedobbie
  • Registratie: Augustus 2009
  • Laatst online: 13:55
Haha daar hebben we allemaal last van. Ik had deze fout eerst ook gemist in zijn code, terwijl me wel direct opviel dat die modulo nutteloos is :S

Acties:
  • 0 Henk 'm!

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 16-10 17:31
Robbiedobbie schreef op vrijdag 06 april 2012 @ 15:08:
PHP:
26
    echo ($teller % $naast_elkaar) == 0 ? '</tr>' : '';

Dit zal nooit aangeroepen worden omdat de teller op de regel erboven verhoogd wordt, terwijl die modulo alleen 0 is wanneer $teller ook 0 is. Hierdoor zal in jouw code nooit </td> voorkomen.
De rest bij deling wordt gewoon 0 bij 0, 8, 16, 24, 32, enzovoorsts hoor gegeven dat $naast_elkaar 8 is.

Alleen de 0 slaat ie over in dit geval omdat de teller inderdaad net voor de regel verhoogd wordt, dus na 7 kolommen wordt de eerste </tr> geplaatst.

Edit: ah ik zie nu pas de while($teller <= 7) erboven... Maar goed, de teller krijgt evengoed wel de waarde 8 er net voor. Overigens wel een erg ranzige manier om het zo te maken.

Veel beter zou gewoon geneste loops zijn (voor 4 rijen en 6 kolommen):


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$aantalrijen = 4;
$aantalkolommen = 6;

//rijen loop
for($r = 0; $r < $aantalrijen; $r++) {

    echo '<tr>';

    //kolommen loop
    for($k = 0; $k < $aantalkolommen; $k++) {
        echo '<td><input type="text" name="cel[', $r, '][', $k, ']" /></td>';
    }

    echo '</tr>';
}

[ Voor 41% gewijzigd door Morrar op 06-04-2012 15:30 ]


Acties:
  • 0 Henk 'm!

  • Robbiedobbie
  • Registratie: Augustus 2009
  • Laatst online: 13:55
Whooops, ook bij mij is de vrijdagmiddag duidelijk aanwezig ;) Ik was te snel met conclusies trekken :p. ik heb denk ik half over die regel heen gekeken...
Pagina: 1