[PHP]Meerdere variabele wegschrijven naar database.

Pagina: 1
Acties:
  • 221 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • TERW_DAN
  • Registratie: Juni 2001
  • Niet online

TERW_DAN

Met een hamer past alles.

Topicstarter
Ik probeer door middel van een formulier een waarde in een database te zetten met een update query, het probleem is alleen dat ik niet meerdere waardes tegelijkertijd weg kan schrijven.
Het idee is als volgt.

Ik heb een pagina en deze pagina moet hierachter een volgorde nummer krijgen (van 1 t/m 10, dit getal staat vast en veranderd daarom ook niet). Om te bepalen welke paginas gebruikt kunnen worden worden deze eerst dmv een SELECT query uit de database gehaald en op het form gepost.

Vervolgens kan dan per pagina de volgorde worden aangegeven (dmv een dropdownbox die per result wordt weergegeven.

de code die ik tot nu toe heb.

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
<FORM METHOD=POST ACTION="updatepage.php">
<?

error_reporting(E_ALL);

$row_count = 0;
include ("dbconnection.php"); //maakt database connectie, werkt verder naar behoren

$zoeken = mysql_query("SELECT * FROM subpage");

while ($row = mysql_fetch_array($zoeken)) {
$page = $row["page_ID"];

echo $page; ?>

<SELECT class=textbox NAME=pageorder[]>
<OPTION VALUE="1">1</OPTION>
<OPTION VALUE="2">2</OPTION>
<OPTION VALUE="3">3</OPTION>
<OPTION VALUE="4">4</OPTION>
<OPTION VALUE="5">5</OPTION>
<OPTION VALUE="6">6</OPTION>
<OPTION VALUE="7">7</OPTION>
<OPTION VALUE="8">8</OPTION>
<OPTION VALUE="9">9</OPTION>
<OPTION VALUE="10">10</OPTION>
</SELECT>

<BR>
<?

}

$row_count ++

?>

<INPUT TYPE="submit">
</FORM>


Ik krijg hier een pagina te zien met de gevonden resultaten uit de database en achter ieder item komt ook netjes een dropdownboxje te staan. Het probleem is nu dat ik het niet voor elkaar krijg om bijvoorbeeld pagina 1 met volgordenr 2 in de database te zetten en tegelijkertijd pagina 2 nummer 8 mee te geven.

de code voor de vervolgpagina, die de daadwerkelijke update query uitvoert.

PHP:
1
2
3
4
5
6
7
<?
error_reporting(E_ALL);
include ("dbconnection.php");

mysql_query (" UPDATE subpage set pageorder='". $_REQUEST['pageorder'] ."' WHERE ID='". $_REQUEST['page'] ."'");

?>


Ik heb hier dus geprobeerd deze in een array te stoppen en deze dan met $_REQUEST uit te lezen, maar dit werkt niet (hij schrijft nu niets weg in de database

als ik probeer dmv
PHP:
1
mysql_query (" UPDATE subpage set pageorder '". $_POST['pageorder'] ."' WHERE ID='". $_POST['page'] ."'");


dan schrijft hij enkel de eerste result weg (terwijl hij er dus max 10 moet doen).

Ik had het idee om alles dus in een array te vrotten, maar als ik dat doe schrijft hij alsnog niets weg.
Iemand een idee welke mogelijkheden hier voor bestaan, kan niet iets vinden dat werkt.

Acties:
  • 0 Henk 'm!

Verwijderd

Je moet dan gebruik maken van de array elementen: $_POST["pageorder"][0] tm [9].

Acties:
  • 0 Henk 'm!

  • TERW_DAN
  • Registratie: Juni 2001
  • Niet online

TERW_DAN

Met een hamer past alles.

Topicstarter
Verwijderd schreef op dinsdag 15 maart 2005 @ 14:06:
Je moet dan gebruik maken van de array elementen: $_POST["pageorder"][0] tm [9].
De vraag is dan alleen, hoe zorg ik ervoor dat de pageorders en IDs gekoppeld worden, ik heb nu de query

PHP:
1
mysql_query (" UPDATE subpage set page_order='". $_POST['pageorder'][0][1][2][3][4][5][6][7][8][9] ."' WHERE page_ID='". $_POST['page'][0][1][2][3][4][5][6][7][8][9] ."'");

Ik neem aan dat je het zo bedoelde voor de array elementen, als ik namelijk [0],[9] gebruik krijg ik een parse error.

Echter, hij schrijf nog steeds niets weg in de database.
Als ik het update ding handmatig uitvoer in phpmyadmin als sql statement werkt het wel, dus de query lijkt me op zich goed.

Acties:
  • 0 Henk 'm!

Verwijderd

foreach gebruiken om de waarden uit te lezen en 1 voor 1 op te slaan in een variabele.
Die variabele dan verwerken in je query.

[ Voor 4% gewijzigd door Verwijderd op 15-03-2005 14:33 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

PHP:
1
mysql_query (" UPDATE subpage set page_order='". $_POST['pageorder'][0][1][2][3][4][5][6][7][8][9] ."' WHERE page_ID='". $_POST['page'][0][1][2][3][4][5][6][7][8][9] ."'");
Lol. _O_

Je zal alle delen van die array een voor een af moeten lopen.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Idd, het beste is om het orderid mee te geven.
ff een voorbeeldje. :)
PHP:
1
2
3
4
5
6
7
8
9
10
while ($row = mysql_fetch_array($zoeken)) {
$page = $row["page_ID"];

echo $page; ?>

<SELECT class=textbox NAME=pageorder[<?php echo $page; ?>]>
<OPTION VALUE="1">1</OPTION>
<OPTION VALUE="2">2</OPTION>
<OPTION VALUE="3">3</OPTION>
...


En dan kun je ze op de volgende pagina zo verwerken:
PHP:
1
2
3
4
5
6
<?php
foreach($_POST['pageorder'] AS $id => $waarde)
{
mysql_query (" UPDATE subpage set pageorder='". $waarde ."' WHERE ID='". $id ."'");
}
?>

[ Voor 20% gewijzigd door Verwijderd op 15-03-2005 14:39 ]


Acties:
  • 0 Henk 'm!

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 11:35
Wat voor veldtype is die pageorder-kolom in MySQL? Heb je er wel op gerekend dat die ook meerdere waarden op moet slaan? Dus enum-type of equivalent. Als je het een varchar maakt kan je wel heel makkelijk een kommagescheiden string opslaan:

code:
1
"UPDATE `subpage` SET `pageorder` = '" . implode(',', $_POST['order'] . "' WHERE `id` = " . $id


P.S. Veilig is anders overigens...

//Edit...Ok verkeerd begrepen, ze moeten dus op meerdere rijen in de tabel komen... Vergeet maar wat hierboven staat, doe het op de manier van HaVri. Overigens nog wel even een probleem aan je opzet: meerdere pagina's kunnen dezeflde waarde krijgen... Beter is het om 1 selectbox te maken waarmee de gebruiker (d.m.v. Javascript) de volgorde van alle pagina's in 1x kan veranderen. Dat sluit dan dubbele waardes uit waardoor ook echt een correcte ordening ontstaat

[ Voor 56% gewijzigd door Morrar op 15-03-2005 14:53 ]


Acties:
  • 0 Henk 'm!

  • TERW_DAN
  • Registratie: Juni 2001
  • Niet online

TERW_DAN

Met een hamer past alles.

Topicstarter
-NMe- schreef op dinsdag 15 maart 2005 @ 14:36:
[...]

Lol. _O_

Je zal alle delen van die array een voor een af moeten lopen.
Het leek me ook niet helemaal de oplossing, maar ik wilde kijken of hij in ieder geval de array terug wil geven, maar dat doet hij dus niet. als ik [0],[9] gebruik krijg ik een parse error
Idd, het beste is om het orderid mee te geven.
ff een voorbeeldje. :)
PHP:
1
2
3
4
5
6
7
8
9
10
while ($row = mysql_fetch_array($zoeken)) {
$page = $row["page_ID"];

echo $page; ?>

<SELECT class=textbox NAME=pageorder[<?php echo $page; ?>]>
<OPTION VALUE="1">1</OPTION>
<OPTION VALUE="2">2</OPTION>
<OPTION VALUE="3">3</OPTION>
...


En dan kun je ze op de volgende pagina zo verwerken:
PHP:
1
2
3
4
5
6
<?php
foreach($_POST['pageorder'] AS $id => $waarde)
{
mysql_query (" UPDATE subpage set pageorder='". $waarde ."' WHERE ID='". $id ."'");
}
?>
Het vreemde is dat als ik hem die order ID meegeef ik een invalid argument krijg bij het foreach statement. het echoen van de $_POST['pageorder'] geeft alleen de laatste waarde terug (ik vraag me dus af of het array wel goed aangemaakt wordt.

[ Voor 19% gewijzigd door TERW_DAN op 15-03-2005 15:03 ]


Acties:
  • 0 Henk 'm!

  • TERW_DAN
  • Registratie: Juni 2001
  • Niet online

TERW_DAN

Met een hamer past alles.

Topicstarter
Morrar schreef op dinsdag 15 maart 2005 @ 14:47:
Wat voor veldtype is die pageorder-kolom in MySQL? Heb je er wel op gerekend dat die ook meerdere waarden op moet slaan? Dus enum-type of equivalent. Als je het een varchar maakt kan je wel heel makkelijk een kommagescheiden string opslaan:

code:
1
"UPDATE `subpage` SET `pageorder` = '" . implode(',', $_POST['order'] . "' WHERE `id` = " . $id


P.S. Veilig is anders overigens...

//Edit...Ok verkeerd begrepen, ze moeten dus op meerdere rijen in de tabel komen... Vergeet maar wat hierboven staat, doe het op de manier van HaVri. Overigens nog wel even een probleem aan je opzet: meerdere pagina's kunnen dezeflde waarde krijgen... Beter is het om 1 selectbox te maken waarmee de gebruiker (d.m.v. Javascript) de volgorde van alle pagina's in 1x kan veranderen. Dat sluit dan dubbele waardes uit waardoor ook echt een correcte ordening ontstaat
Dat er nu dubbele waardes gekozen worden ben ik me terdege van bewust, maar wil eerst werkend krijgen dat hij meerdere dingen tegelijkertijd weg kan schrijven, anders kom ik er namelijk helemaal niet meer uit.
Hoe ik deze controle ga bouwen ben ik nog niet uit, maar het lijkt me op zich mogelijk om als ik een array werkend heb deze te controlleren op dubbele waarden en dit terug te geven naar de gebruiker.

Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Om te kijken of je array goed overkomt kun je print_r($_POST['pageorder']) gebruiken. Dan krijge je de hele inhoud van het array te zien (als die er is natuurlijk ;) ).

Het updaten kan voor zover ik weet niet gebeuren in een enkele query. Je zult dus zoals hierboven al aangegeven door je array moeten loopen en per pagina een query uitvoeren...

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • TERW_DAN
  • Registratie: Juni 2001
  • Niet online

TERW_DAN

Met een hamer past alles.

Topicstarter
T-MOB schreef op dinsdag 15 maart 2005 @ 15:13:
Om te kijken of je array goed overkomt kun je print_r($_POST['pageorder']) gebruiken. Dan krijge je de hele inhoud van het array te zien (als die er is natuurlijk ;) ).

Het updaten kan voor zover ik weet niet gebeuren in een enkele query. Je zult dus zoals hierboven al aangegeven door je array moeten loopen en per pagina een query uitvoeren...
Als ik dmv print_r de array laat weergeven zie ik enkel de laatste record (zelfde als dat ik het met echo $_POST doe)

PHP:
1
<SELECT class=textbox NAME=pageorder[<?php echo $page; ?>]>

Dit is wat ik op dit moment gebruik als naam van mijn selectbox (zoals HaVri beschreef) maar hij lijkt dan maar 1 enkele waarde terug te geven, en dat is die van de laatste dropdownbox die is geselecteerd

Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Je zou het nog kunnen proberen met quotes om de name:
PHP:
1
<select class="textbox" name="pageorder[<?php echo $page; ?>]">


Verder zou het bij mijn weten gewoon moeten werken...

[ Voor 16% gewijzigd door T-MOB op 15-03-2005 15:22 ]

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • TERW_DAN
  • Registratie: Juni 2001
  • Niet online

TERW_DAN

Met een hamer past alles.

Topicstarter
T-MOB schreef op dinsdag 15 maart 2005 @ 15:21:
Je zou het nog kunnen proberen met quotes om de name:
PHP:
1
<select class="textbox" name="pageorder[<?php echo $page; ?>]">


Verder zou het bij mijn weten gewoon moeten werken...
hmm, helaas, met quotjes eromheen werkt het ook niet, krijg wederom enkel de laatste waarde terug en een invalid argument bij het foreach statement.

Wat ik me daarnaast afvraag is of hij de ID wel koppelt aan de pageorder (ik zie nu namelijk niet waar dat gebeurd). Hij zou het toch moeten doen in de array lijkt me, maar weet het eigenlijk niet zeker.

Acties:
  • 0 Henk 'm!

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 11:35
Hij koppelt id en waarde hiermee:
PHP:
1
foreach($_POST['pageorder'] AS $id => $waarde)

aangezien $_POST['pageorder'] een array is met de ID's als keys worden ze zo gekoppeld: $id is in de foreach het page-id en $waarde de rangordening. Wel vreemd dat $_POST alleen de laatste waarde teruggeeft. Dat klopt niet, kennelijk gaat er toch iets mis met het maken van de formulieren...

Heb je wel die dubbele quotes gebruikt in de HTML? Dus: name="pageorder[<? echo $page ?> ]" ? Zonder die dubbele quotes werkt het namelijk niet! En check ook even in je HTML output of de velden er dus zo uitzien: <select ... name="pageorder[1]">. Waarbij de 1 dus het page-id is, en verschillend moet zijn voor de verschillende selects!

[ Voor 46% gewijzigd door Morrar op 15-03-2005 17:08 ]


Acties:
  • 0 Henk 'm!

  • TERW_DAN
  • Registratie: Juni 2001
  • Niet online

TERW_DAN

Met een hamer past alles.

Topicstarter
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
<FORM METHOD=POST ACTION="updatepage.php">
<?

error_reporting(E_ALL);

$row_count = 0;
include ("dbconnection.php");
$zoeken = mysql_query("SELECT * FROM subpage");

while ($row = mysql_fetch_array($zoeken)) {
$page = $row["page_ID"];

echo $page; ?>

<SELECT class=textbox NAME="pageorder[<?php echo $page; ?> ]">
<OPTION VALUE="1">1</OPTION>
<OPTION VALUE="2">2</OPTION>
<OPTION VALUE="3">3</OPTION>
<OPTION VALUE="4">4</OPTION>
<OPTION VALUE="5">5</OPTION>
<OPTION VALUE="6">6</OPTION>
<OPTION VALUE="7">7</OPTION>
<OPTION VALUE="8">8</OPTION>
<OPTION VALUE="9">9</OPTION>
<OPTION VALUE="10">10</OPTION>
</SELECT>

<BR>
<?

}

$row_count ++

?>

<INPUT TYPE="submit">
</FORM>


PHP:
1
2
3
4
5
6
7
8
<?
error_reporting(E_ALL);
include ("dbconnection.php");

foreach($_POST['pageorder'] AS $id => $waarde)  
{  
mysql_query (" UPDATE subpage set pageorder='". $waarde ."' WHERE ID='". $id ."'") or die ("error: ".mysql_error()); 
}


Uiteindelijk heb ik hem op deze manier werkend gekregen, blijkbaar ging het toch ergens verkeerd met het definieren van een variabele.
bovenstaand form werkt dus hij update de dingen nou zoals het moet. Nu alleen nog een check erop zetten, maar ik ga er wel vanuit dat dat gaat lukken.
Pagina: 1