Avatar billede o-zone Nybegynder
17. september 2007 - 07:22 Der er 11 kommentarer og
1 løsning

POST et array med php

Hej med jer...

Jeg har en form der skal sende et array med method=POST. Jeg danner selv arrayet ud fra nogle data, og det kan blive nogle hundrede enheder langt. Brugeren skal også sende et par almindelige tekstfelter med samme POST.

Den eneste måde jeg lige kan komme på, er at lave en <select> multiple med alle elementer prevalgt, men brugeren har på ingen måde behov for at se alle de valgte elementer, og de skal heller ikke kunne vælge nogen enheder fra. Jeg kan selvfølgelig disable den, men er der ikke en måde hvor jeg kan få et <input type=hidden> til at indeholde et array? Eller en anden måde jeg kan få PHP til at POSTE et array?

Jeg har overvejet at lægge den multiple select på en display:hidden div, og så gøre den synlig idet man submitter, så den kommer med - men det er ærlig talt ikke en særlig sexet løsning :-(

Jeg har også kikket lidt på HttpRequest og HttpRequest::addPostFields. Det ser på en eller anden måde lidt mere fornuftigt ud, men jeg er sku ikke helt sikker på hvordan jeg skal gøre. :-(

Er der nogen der kan give mig et simpelt kode eksempel, eller har en god ide?

/o-zone
Avatar billede windcape Praktikant
17. september 2007 - 07:25 #1
www.php.net/serialize - happy reading
Avatar billede o-zone Nybegynder
17. september 2007 - 07:37 #2
hmmm ... jeg har brug for noget der kan presse et array gennem en HTTP request med POST data

kan du ikke forklare mig hvordan serialize kan hjælpe mig dér?

I øvrigt har jeg via PHP gemt alle data i nogle javascript arrays, så med mindre jeg selv skal bygge requesten op, så har jeg ikke adgang til PHP i det øjeblik formen submittes (ups - så burde spørgsmålet måske være under javascript?? ... nej - ikke hvis nogen her kan vise mig (med kode eksempel!) hvordan jeg selv fyrer en HTTP request med POST data afsted)
Avatar billede olebole Juniormester
17. september 2007 - 14:40 #3
<ole>

Hvad er det præcist, du skal lave?

/mvh
</bole>
Avatar billede o-zone Nybegynder
17. september 2007 - 16:13 #4
Jeg skal have sendt en masse mobilnumre til en sms gateway, og de skriver i deres dokumentation at jeg så skal POSTe et array recipient[] med et nummer i hvert element i arrayet.

Det er mange numre, og jeg kan ikke se nogen fornuftig grund til at brugeren skal plages med de eksakte numre for at kunne sende en sms afsted.

Grunden til at jeg har smidt numrene ud i javascript arrays er at de er delt op geografiskt, og brugeren der sender en sms skal kunne bestemme hvilke områder en given sms skal sendes til.

Det vil altså sige at min javascript sørger for at generere et array recipient af numre der skal sendes til, og så skal jeg have det POSTet til sms gatewayen.

Jeg har nu lagt dem alle ind i en multiple select box, og det fungerer sikkert (har ikke haft tid til at teste endnu) ... men det er lidt ligegyldigt at brugeren kan se en masse numre!
Avatar billede onkel_satan Nybegynder
17. september 2007 - 16:22 #5
Som Ole siger så står det lidt uklart hvad det du har og vil lave, men i tilfælde af dit array er lavet i php kan du som windcape sende det ved hjælp af serialize.
<input type="hidden" name="langtArray" value="<?php echo serialize($mitArray);">
På modtagersiden convertere du lantArray variablen tilbage til et array
$modtagetArray = unserialize($_POST['langtArray']);
Avatar billede o-zone Nybegynder
17. september 2007 - 17:57 #6
OK - jeg har tydeligvis ikke fået forklaret mig godt nok. Jeg prøver lige igen så:
Jeg har en masse mobil numre delt op i geografiske områder i min database.
Jeg lader PHP hente disse numre ud i javascript arrays på en html/php side.
på den side er der også en form hvor brugeren dels kan krydse af hvilke områder han gerne vil sende en sms til, og dels et felt hvor han kan skrive sms teksten i.
Denne sides form POSTer indholdet til en smsgateway der skal have en række foruddefinerede felter. Heriblandt et felt "recipient" der ifølge smsgatewayens API enten skal indeholde et mobil nummer, eller - hvis der skal sendes til flere mobiler - et array recipient[] der indeholder alle de numre sms'en skal sendes til.

Jeg skal sende til en masse numre, så jeg skal have lavet det her array. Jeg har selv lavet en multiple selectbox hvor jeg lader mit javascript manipulere indholdet, og så selecter jeg alle numre i den, inden jeg submitter formen. Men det er ikke en særligt lækker løsning. Der er ikke nogen grund til at brugeren skal se 150 løsrevne telefonnumre. Det kan alligevel ikke checke om de er korrekte.

Jeg håber at det blev mere forståeligt? :-?
Avatar billede windcape Praktikant
18. september 2007 - 06:34 #7
<input type="checkbox" name="recipent[]" value="11111111">
<input type="checkbox" name="recipent[]" value="22222222">
<input type="checkbox" name="recipent[]" value="33333333">
<input type="checkbox" name="recipent[]" value="44444444">
<input type="checkbox" name="recipent[]" value="55555555">

:-)
Avatar billede o-zone Nybegynder
20. september 2007 - 15:23 #8
fedt! jeg bruger ikke de mange checkboxe, for det ser pænt dumt ud med 300 unavngivne checkboxe efter hinanden. Men tricket med name="recipient[]" virker fint :-D

Jeg har nu en
<select name="recipient[]" multiple="multiple" rows="3" style="width:100px">
</select>

og så har jeg noget javascript der dynamisk bygger listen op med blandt andet:
    var sendesTil = document.getElementById("recipient[]");
        var newOption = new Option(smsNummer,smsNummer);
    newOption.selected = "selected";
    sendesTil.options[sendesTil.options.length] = newOption;

Det står stadig på siden, men det er noget kønnere  end checkboxene.

Jeg har endnu ikke prøvet at se om man evt. kunne gøre det samme med hidden fields, men opstår behovet, så kender jeg i hvert fald nu en ting at undersøge :-)

Tak for hjælpen allesammen. Smider du et svar windscape, så smækker jeg en håndfuld points efter dig!
Avatar billede o-zone Nybegynder
30. september 2007 - 15:53 #9
Svar wincape, hvis du vil have points, så vi kan få lukket spørgsmålet! :)
Avatar billede o-zone Nybegynder
09. februar 2008 - 10:47 #10
Wincape? Poster du ikke et svar, så du kan få dine points? :-?
Avatar billede olebole Juniormester
09. februar 2008 - 15:58 #11
Du kunne jo også gøre noget à la:

<script type="text/JavaScript">
var oDispl = oTempl = null, oHash = {};
function foo(oSel) {
    if (oSel.value<0 || oHash["recip"+oSel.value]) return;
    var o = oTempl.cloneNode(true);
    oDispl.appendChild(o);
    o.getElementsByTagName("td")[0].firstChild.nodeValue = oSel.getElementsByTagName("option")[oSel.selectedIndex].firstChild.nodeValue;
    o.getElementsByTagName("input")[0].setAttribute("value", oSel.value);
    o.setAttribute("id", "recip"+oSel.value);
    oHash["recip"+oSel.value] = 1;
    oSel.selectedIndex = 0;
}
function deleteRecip(oBtn) {
    var oRow = oBtn.parentNode.parentNode;
    oRow.parentNode.removeChild(oRow);
    delete oHash[oRow.getAttribute("id")];
}
window.onload = function() {
    oDispl = document.getElementById("displBody");
    oTempl = oDispl.getElementsByTagName("tr")[0];
    oDispl.removeChild(oTempl);
}
</script>

<select onchange="foo(this)">
    <option value="-1">Vælg ...</option>
    <option value="11111111">Poul-Otto</option>
    <option value="22222222">Gurli</option>
    <option value="33333333">Karlo</option>
    <option value="44444444">Henny-Sofie</option>
    <option value="55555555">Karlo</option>
</select>

<table>
<tbody id="displBody">
<tr>
    <td>&nbsp;<input name="recipient[]" type="hidden"></td>
    <td><button style="font:10px tahoma, sans-serif;padding:0 2px;" onclick="deleteRecip(this)">Slet</button></td>
</tr>
</tbody>
</table>
Avatar billede o-zone Nybegynder
28. november 2008 - 11:15 #12
Windcape: nu æder jeg pointsene selv, selvom du retmæssigt burde have dem. Men det er noget rod med åbne spørgsmål.

Hvis du vågner af din dvale, og gerne vil have pointene, så skrive det her, så vil jeg oprette et nyt spørgsmål med dine points!

Hvis nogen skulle være i tvivl, så var det tricket med at navngive mine input felter name="navn[]" der fungerede for mig.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester