meerdere waarden name property
Ik heb een vraag omtrent een form waarden. Wanneer ik een waarde wil doorsturen naar het verwerkingsscript dan lijkt het er op als of ik dit maar met een tegelijk kan doen. Wat ik graag wil bereiken is om meerdere waarden tegelijk te versturen zodat deze correct in de database terecht komen. Het gaat hier bij om de "name" waarden die het formulier mee stuurt. Ik zal een voorbeeld geven.
<select name="value">
<option value="waarden-van-database1">waarden-van-database2</option>
</select>
Ik probeer beide waarden van option in de database te krijgen maar het ziet er naar uit dat alleen de "name" waarde word opgeslagen terwijl ik beide waarden zou willen opslaan. Is dit uberhaupt wel mogelijk?
Enige input om het leerproces te vergemakkelijken is zeer welkom en wil ik graag voor bedanken.
Gewijzigd op 31/08/2015 13:09:23 door Klaas Vaag
Hetgeen jij selecteert wordt meegestuurd met het formulier en is op te vragen met de name.
Waar haal jij die tweede waarde dan vandaan?
Ik haal beide waarde uit de database. De tweede waarde is een naam (als in leesbaar) en de eerste is een getal (id) die bij die naam hoort. Op deze manier kan ik een naam selecteren (met overeenkomstige id) om die weer in de database te stoppen. Als ik dan de pagina oproept om de gegevens te herzien dan zie ik de gegevens die bij die ID horen.
En wat is nou het probleem want ik volg het volgens mij niet helemaal meer.
Klaas Vaag op 31/08/2015 13:58:14:
Ik haal beide waarde uit de database.
<knip>
Als ik dan de pagina oproept om de gegevens te herzien dan zie ik de gegevens die bij die ID horen.
<knip>
Als ik dan de pagina oproept om de gegevens te herzien dan zie ik de gegevens die bij die ID horen.
Je draagt zelf al de oplossing aan: druk de waarde bij dat ID af?
Of het moet echt de bedoeling zijn dat je meerdere waarden (IDs) opslaat - in dat geval moet je een soort van multiselect maken.
Nota bene: Je hebt als het ware een "interne waarde" voor opslag en een "externe waarde" (label) voor weergave. Het voordeel van het opslaan van zo'n interne waarde in plaats van een explicitiete externe waarde is dat je dan nog steeds het label kunt veranderen zonder dat je verder iets in je database hoeft aan te passen. Dat zou anders zijn als je alles aan labels zou ophangen.
Gewijzigd op 31/08/2015 14:19:47 door Thomas van den Heuvel
Thomas van den Heuvel op 31/08/2015 14:16:48:
Je draagt zelf al de oplossing aan: druk de waarde bij dat ID af?
Klaas Vaag op 31/08/2015 13:58:14:
Ik haal beide waarde uit de database.
<knip>
Als ik dan de pagina oproept om de gegevens te herzien dan zie ik de gegevens die bij die ID horen.
<knip>
Als ik dan de pagina oproept om de gegevens te herzien dan zie ik de gegevens die bij die ID horen.
Je draagt zelf al de oplossing aan: druk de waarde bij dat ID af?
Nee, totaal niet. Als ik een print_r($_POST); doe dan komt de ID niet mee, wel de naam zoals weergegeven in de <select name=""> maar niet de ID die bij de naam hoort.
Ik lees ook dingen als een array, werkt dit ook bij een select veld?
data-integriteit
Waar komt het lijstje met options vandaan? (uit de database?)
Wat ga je doen met de gekozen option? (wegschrijven naar de database?)
1. zorg dat de database tabel een kolom met een unique id heeft.
2. geef de aan de value tag het unique id mee
3. na submit kun je aan de hand van het unique id weer alle relavante informatie uit de database halen met
hmm hmm Waar komt het lijstje met options vandaan? (uit de database?)
Wat ga je doen met de gekozen option? (wegschrijven naar de database?)
1. zorg dat de database tabel een kolom met een unique id heeft.
2. geef de aan de value tag het unique id mee
3. na submit kun je aan de hand van het unique id weer alle relavante informatie uit de database halen met
Gewijzigd op 31/08/2015 15:37:11 door Frank Nietbelangrijk
Als je bijvoorbeeld een database met bedrijven hebt dan heb je als naam bedrijf A met daaraan een ID voor de database. Indien er een document binnen komt en je registreert deze dan wil je het bedrijf met ID bij dat doucment hebben.
<select name="value">
<option value="1">Niet opgegeven</option>
<option value="#"> </option>
Code (php)
//Added Id for Options Element
<option value=""></option><!--Echo out options-->
</select>
In dit geval word alleen de value (db_column1) meegegeven maar niet de andere waarde. En zoals ik al eerder vroeg, zou dit ook met een array kunnen? Ik weet dat het kan met input type checkbox maar geldt dit ook voor select?
@frank: de ID is uniek en autoincrement.
Gewijzigd op 31/08/2015 16:29:03 door Klaas Vaag
Nee dat gaat dus niet, en dat is ook de reden dat ik hamer op een unique id die je na het POSTEN van het formulier kunt gebruiken om de overige waarden uit de database te trekken
Maar als ik jou goed begrijp dan zou ik die ID kunnen gebruiken om gegevens uit de database te krijgen? Want er uit krijg ik ze wel maar er in dus niet blijkbaar...
Code (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
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
<?php
$result = mysqli_query($conn, "SELECT id, name FROM table");
$dropdown = '<select name="test">';
while($row = mysqli_fetch_assoc($result))
{
$dropdown .='<option value="'.$row['id'].'">'.$row['name'].'</option>';
}
$dropdown .= '</select>';
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
if(isset($_POST['test']))
{
$id = intval($_POST['test']);
$result = mysqli_query($conn, "SELECT * FROM table WHERE id=" . $id);
if($row = mysqli_fetch_assoc($result))
{
echo 'gegevens: ';
echo '<pre>';
print_r($row);
echo '</pre>';
}
}
}
?>
<html>
<body>
<form action="" method="post">
<?php echo $dropdown; ?>
<button type="submit">Verstuur</button>
</form>
</body>
</html>
$result = mysqli_query($conn, "SELECT id, name FROM table");
$dropdown = '<select name="test">';
while($row = mysqli_fetch_assoc($result))
{
$dropdown .='<option value="'.$row['id'].'">'.$row['name'].'</option>';
}
$dropdown .= '</select>';
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
if(isset($_POST['test']))
{
$id = intval($_POST['test']);
$result = mysqli_query($conn, "SELECT * FROM table WHERE id=" . $id);
if($row = mysqli_fetch_assoc($result))
{
echo 'gegevens: ';
echo '<pre>';
print_r($row);
echo '</pre>';
}
}
}
?>
<html>
<body>
<form action="" method="post">
<?php echo $dropdown; ?>
<button type="submit">Verstuur</button>
</form>
</body>
</html>
Het formulier is de eerste stap, waarin ik nieuwe informatie toevoeg. Het dropdown menu is een veld met bestaande data uit de database zoals namen, adresgegevens, enz.
Als er slechts 1 select is kan je het id toch meegeven in een hidden input.
Klaas Vaag op 31/08/2015 17:07:14:
Dat is heel erg jammer...
Waarom is dat jammer?
Stel je hebt een tabel 'klanten' met kolommen als naam, email, adres, telefoon etc.
Je laat de gebruiker een klant selecteren met een dropdown. Dan WIL je alleen maar het id posten. Waarom? Als gebruikers het hele record gaan terug sturen dan kunnen ze van alles stiekem aanpassen. Je hoeft daar echt niet voor gestudeerd te hebben overigens. In mijn voorbeeld wordt er enkel en alleen maar een numerieke waarde geaccepteerd. De gebruiker KAN dus enkel maar een keus maken uit een van de adressen en deze dus niet modificeren.
Stel nu dat je voor deze klant tevens in het zelfde formulier een bestelling laat toevoegen. je wilt in je database in de tabel 'bestellingen' niet de hele bups aan adresgegevens toevoegen voor ieder artikel dat besteld wordt. Je slaat in deze tabel enkel het id van de klant op waarmee je naar de tabel 'klanten' verwijst.
- SanThe - op 31/08/2015 18:00:39:
Als er slechts 1 select is kan je het id toch meegeven in een hidden input.
Oke, maar is die "hidden" input dan gelijk aan het ID die je selecteerd?
Niet automatisch maar kan met javascript. Maar waarom? Misschien moet je toch trachten je vraag anders te stellen en gewoon laten zien wat je zo graag wilt bereiken.
Frank Nietbelangrijk op 31/08/2015 18:38:26:
Stel nu dat je voor deze klant tevens in het zelfde formulier een bestelling laat toevoegen. je wilt in je database in de tabel 'bestellingen' niet de hele bups aan adresgegevens toevoegen voor ieder artikel dat besteld wordt. Je slaat in deze tabel enkel het id van de klant op waarmee je naar de tabel 'klanten' verwijst.
Klaas Vaag op 31/08/2015 17:07:14:
Dat is heel erg jammer...
Stel nu dat je voor deze klant tevens in het zelfde formulier een bestelling laat toevoegen. je wilt in je database in de tabel 'bestellingen' niet de hele bups aan adresgegevens toevoegen voor ieder artikel dat besteld wordt. Je slaat in deze tabel enkel het id van de klant op waarmee je naar de tabel 'klanten' verwijst.
Het eind resultaat moet inderdaad ongeveer zo zijn. Alleen het probleem waar ik mee zit is, hoe krijg ik dat er in. De ID bestaat overigens al omdat ik die uit een andere tabel haal. Maar dat terzijde, de link van gegevens naar een "klant" om even in jouw voorbeeld te spreken mis ik nog. In feite werkt het proces maar die eerste stap is mij nog onduidelijk. Als het een kwestie van een hidden input zoals Santhe zegt dan is het niet zo lastig maar is die gelijk aan de gegevens die ik selecteer.
Dit is alleen erg gevoelig voor "SQL Injection" aangezien je alles vanaf de gebruiker moet behandelen als incorrecte data, plus je kan geen ID verifiëren.
Eigenlijk zou geen enkele statische "id" of andere gegevens die te maken hebben met de structuur in jouw database staan zichtbaar maken voor de gebruiker, wat je wel zou kunnen doen is een ID opslaan in een session. Aangezien je zo cryptisch ben met je vraag, neem ik maar aan dat jouw database structuur gewoon -verkeerd- is.
Gewijzigd op 31/08/2015 19:10:10 door Johan K
Frank Nietbelangrijk op 31/08/2015 18:55:11:
Niet automatisch maar kan met javascript. Maar waarom? Misschien moet je toch trachten je vraag anders te stellen en gewoon laten zien wat je zo graag wilt bereiken.
Oke, ik neem als voorbeeld een bedrijf. Van dat bedrijf krijg ik een document binnen. Je verwerkt het document door het vast te leggen in het systeem. De eerste stap die je dan neemt is het invoeren van gegevens. Je vult alles in waaronder de bedrijfsnaam (gekoppeld aan een ID). De bedrijfsnaam haal je uit de database, die prop je in een dropdown menu zodat het overzichtelijk is. Als je alles hebt ingevuld dan sla je dat op in de database. De gegevens zijn nu opgeslagen.
Later heb je informatie nodig van dat document. Je wilt het bekijken dus je gaat naar dat document en open het. Alle gegevens zijn daar, inclusief de gegevens van het bedrijf.
Onder de motorkap is het iets complexer, voor mij dan. Ik heb een formulier gemaakt met de velden die nodig zijn en ook zo opgeslagen worden in de database. Een veld, een select veld bevat de bedrijfsnamen die ik uit de database haal. Zo weet ik welk bedrijf bij het document hoort. Maar omdat ik alleen een bedrijfsnaam kan selecteren (en dus niet het ID) word de bedrijfsnaam weergegeven maar kan ik later de gegevens die aan die ID gekoppeld zijn niet weergeven omdat de ID mist. Dus nu zou ik een keuze moeten maken of ik alleen de bedrijfsnaam weergeef of de ID.
Toevoeging op 31/08/2015 19:11:53:
Johan K op 31/08/2015 19:03:22:
Dit lijkt mij niet mogelijk omdat het veld niet weet welke naam ik selecteer dus ook geen ID kan meegeven.
Overigens gebruik in in het verwerkingsscript bind_param, welke volgens het internet bijna onmogelijk zou zijn om een sql-injection uit te voeren.
Toevoeging op 31/08/2015 19:16:36:
wellicht is dit beter...
Code (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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<form name="inkomend" action="?inkomend=allin&groepen=inkomend&action=add_do" method="post">
Download<br>
<input type="text" name="download"><br>
Categorie<br>
<select name="categorie">
<option value="#">Maak een keuze</option>
</select>
<br>
Bedrijf<br>
<select name="bedrijf">
<option value="1">Niet opgegeven</option>
<option value="#"> </option>
<?php
$sql = <<<SQL
SELECT *
FROM contactenzakelijk
ORDER BY bedrijf
SQL;
if(!$result = $db->query($sql)){
die('There was an error running the query [' . $db->error . ']');
}
while($row = $result->fetch_assoc()){
?>
//Added Id for Options Element
<option value="<?php echo $row['zakelijk_id']; ?>"><?php echo $row['bedrijf']; ?></option><!--Echo out options-->
<?php
}
?>
</select><br>
Onderwerp<br>
<input type="text" name="onderwerp"><br>
Ontvangen<br>
<input type="text" name="ontvangen" value="<?php echo date("Ymd"); ?>"><br>
Brief nr<br>
<?php
$sql = <<<SQL
SELECT * FROM inkomend ORDER BY briefnr DESC LIMIT 1
SQL;
if(!$result = $db->query($sql)){
die('There was an error running the query [' . $db->error . ']');
}
while($row = $result->fetch_assoc()){
?>
<input type="text" name="briefnr"> Laatste briefnr: <?php echo $row['briefnr']; ?><br>
<?php
}
$result->free();
?>
Opmerkingen/notities:<br>
<textarea cols="50" rows="10" name="editor1"></textarea><br>
Afgehandeld?<br>
<select name="afgehandeld">
<option value="#">Maak een keuze</option>
<option value="ja">Afgehandeld</option>
<option value="nee">Niet afgehandeld</option>
</select><br><br>
<input type="submit" name="submit" value="Opslaan"> <input type="reset" name="index" value="annuleren" onclick="document.location.href='?inkomend=index'">
</form>
</p></div>
Download<br>
<input type="text" name="download"><br>
Categorie<br>
<select name="categorie">
<option value="#">Maak een keuze</option>
</select>
<br>
Bedrijf<br>
<select name="bedrijf">
<option value="1">Niet opgegeven</option>
<option value="#"> </option>
<?php
$sql = <<<SQL
SELECT *
FROM contactenzakelijk
ORDER BY bedrijf
SQL;
if(!$result = $db->query($sql)){
die('There was an error running the query [' . $db->error . ']');
}
while($row = $result->fetch_assoc()){
?>
//Added Id for Options Element
<option value="<?php echo $row['zakelijk_id']; ?>"><?php echo $row['bedrijf']; ?></option><!--Echo out options-->
<?php
}
?>
</select><br>
Onderwerp<br>
<input type="text" name="onderwerp"><br>
Ontvangen<br>
<input type="text" name="ontvangen" value="<?php echo date("Ymd"); ?>"><br>
Brief nr<br>
<?php
$sql = <<<SQL
SELECT * FROM inkomend ORDER BY briefnr DESC LIMIT 1
SQL;
if(!$result = $db->query($sql)){
die('There was an error running the query [' . $db->error . ']');
}
while($row = $result->fetch_assoc()){
?>
<input type="text" name="briefnr"> Laatste briefnr: <?php echo $row['briefnr']; ?><br>
<?php
}
$result->free();
?>
Opmerkingen/notities:<br>
<textarea cols="50" rows="10" name="editor1"></textarea><br>
Afgehandeld?<br>
<select name="afgehandeld">
<option value="#">Maak een keuze</option>
<option value="ja">Afgehandeld</option>
<option value="nee">Niet afgehandeld</option>
</select><br><br>
<input type="submit" name="submit" value="Opslaan"> <input type="reset" name="index" value="annuleren" onclick="document.location.href='?inkomend=index'">
</form>
</p></div>
Gewijzigd op 31/08/2015 19:18:23 door Klaas Vaag