ugrás a tartalomhoz

tömb eleminek töltése form-ból

mokat · 2009. Okt. 13. (K), 14.05
Sziasztok a problémám a következő:
Egy form-ot elküldök self php-ra POST-tal feldolgozni, mely tartalmaz egy legördülőmenüből választható esemény nevet (forrása SQLtábla), és egy rádiógombbal választható kimenetelt.

<form action="<?echo $_SERVER['PHP_SELF']?>" method="POST">
<br><br><br>
<?php

//adatbázishoz csatlakozás
$connect = mysql_connect("*****","********","***") or die(mysql_error());
$db = mysql_select_db("tippvadasz", $connect);

//még érvényes események kiiratása
$result = mysql_query("SELECT meccslista FROM hategy WHERE ervenyesseg >= now()");  
$output = '<select name="meccs">';  

while($row = mysql_fetch_array($result))

{  

  $value = reset($row);  

  $output .= "n". '<option value="'. htmlspecialchars($value, ENT_QUOTES) .'">'. htmlspecialchars($value, ENT_QUOTES) .'</option>';  

}  

$output .= "n</select>";  

print $output;
 
?>

//kimenetel kiválasztása
<br>
<strong>Kimenetel:</strong>
<br>
<input type="radio" name="tipp" value="H" checked>H
<input type="radio" name="tipp" value="D">D
<input type="radio" name="tipp" value="V">V
<br>

<input type="submit" value="Megtippelem">
</form>


<?php
//tömbbe rendezés
$a[] = $_POST['meccs'];
$b[] = $_POST['tipp'];

//kiiratás
print "<div align=center>";
print "<div id='wrapper'>";
print "<table cellpadding='0' cellspacing='0' border='0' class='sortable' id='sorter'>";
print "<th>Esemény</th><th>Tipped</th>";
print "<tr><td>$a[0]</td><td>$b[0]</td></tr>";
print "<tr><td>$a[1]</td><td>$b[1]</td></tr>";
print "</div></table></div>";

?>


ugye értelemszerűen csak az utolsó bevitt esemény+kimenetel páros jelenik meg a táblázatban, mert minden SUBMIT-kor előről, a 0. elemről kezdi tömni a tömböket.

Kérdéseim:
1. Hogyan lehetne léptetni a tömb elemeit, hogy mikor tömöm eseménnyel akkor hízzon tovább?
2. Kiiratásban ha tudtok segíteni azt is megköszönném, mert ez így elég lama módszer (:
3. Ezt már érdemes 2dimenziós tömbben kezelni?
 
1

Nem értelek

Poetro · 2009. Okt. 13. (K), 15.48
Mivel egy meccs és egy tipp mező kerül POSTolásra hogy jön neked össze több?
Egyáltalán a logika nem stimmel, hogy mit szeretnél csinálni.
  1. Mit tömsz milyen eseménnyel? Én egy eseményt se látok, tömést meg főleg nem. Tömb elemeinek léptetése se stimmel. Létezik a next "függvény", amivel a tömb belső mutatóját a következő elemre rakod. Ekkor a current függvénnyel kérheted le az aktuális elemet.
  2. Milyen kiiratásban kell segíteni, mit akarsz kiíratni?
  3. Mit akarsz 2 dimenziós tömbben kezelni?
3

nem sikerült pontosan leírni...

mokat · 2009. Okt. 13. (K), 16.25
szóval az a lényeg hogy van egy többszáz eseményt tároló sql táblám és abból lehet választani eseményt és párosítani hozzá kimenetelt!
De ha le SUBMIT-olt egyet akkor lehessen egy másik eseményre és kimenetelre is tenni. Tehát itt lép be, hogy tömb legyen.

Egy kis háttérinfo:
Nevezzük a végeredményt szelvénynek, mely így épül fel:
1 esemény tipp
2 esemény tipp
...
n esemény tipp

ezt szereném egy tömbben tárolni és kitolni a képernyőre, majd ha a juzer úgy érzi mindent megtippelt amit szeretett volna akkor egy gombnyomással majd elküldi a tömb elemeket egy sql táblába, későbbi feldolgozásra.

2 dimenziós tömbben úgy gondolkodtam, hogy mondjuk:
hogy egy tömb maga a 'játék' és azon belül egyik tömb a 'meccs' a másik tömb a 'tipp' ?

Kiiratni természetesen a tömb elemeit akarom, amit a juzer kiválogatott és bevitt.

remélem így már érthető!
4

HTML tömbök

joed · 2009. Okt. 13. (K), 17.00
Az a probléma, hogy a html-ből nem tömböt kapsz vissza, mert rosszul vannak elnevezve a form elemeid. Úgy kell elnevezni őket, mintha PHP-ban építenél tömböt. Összedobtam egy mintapéldát:


/**
 * File: test.php
 */
<form action="test.php" method="post">
<?
/**
 * itt gyujtod be a meccs adatokat
 */
error_reporting(E_ALL);
$meccsek = array("barca", "inter", "chelsea", "manu", "loki", "fradika");

$i = 0;
foreach ($meccsek as $m){?>
	<input name="meccs[<?=$i?>][meccs]" value="<?=$m?>"/><input type="text" name="meccs[<?=$i?>][eredmeny]" value="H/D/V"/><br />
<?
	$i++;
}
?>
<input type="submit">
</form>

<?var_dump($_POST);?>
Tehát a html form elemek neveit jól kell elnevezni, hogy azok a PHP-ban tömbként jelenjenek meg majd a _POST tömbben.

Persze nem kötelező html tömböket használni, ha okosan elnevezed és majd a php oldalon beazonosítod a megfelelő változópárokat (pl: meccs_1 - tipp_1, meccs_2 - tipp_2 stb.), ugyan ott vagy.

A példában egy $i iterátor változót használtam a tömb dimenziók tagolásához, itt akár a meccs SQL-ben lévő ID-jét is használhatod, bár nem javallott :)

És visszatérve az eredeti kérdésedre, a tömbök pointere alap esetben mindig az elején van. Iteráció során ez mozog vagy ha a next(), prev(), end() stb. fv-eket meghívod. De ahogy már írtam, szerintem, használd a foreach struktúrát!
5

hmhm...

mokat · 2009. Okt. 14. (Sze), 10.58
Nem értem miért ne lehetne tömni sima string változóval egy tömbböt? Miért kell tömbből tömbbe átadni az elemet?

nagyonszépen köszönöm a kódrészletet is, de nekem nem erre lenne szükségem. Két sztring változót szeretnék beletömni egy tömbbe mondjuk így, ismétlődve:

Juzer kiválasztja a legördülő menüből az eseményt és hozzányom egy tippet a kimenetelre -----> SUBMIT-tal elPOST-olja -----> feldolgozás ami tölti fel: sor[0][meccs][tipp]

Juzer kiválaszt egy másik eseményt a legördülő menüből és hozzányom egy tippet a kimenetelre -----> SUBMIT-tal elPOST-olja -----> feldolgozás ami tölti fel: sor[1][meccs][tipp]
...
Juzer kiválaszt egy másikeseményt a legördülő menüből és hozzányom egy tippet a kimenetelre -----> SUBMIT-tal elPOST-olja -----> feldolgozás ami tölti fel: sor[n][meccs][tipp]

A végeredmént meg kitolni egy táblázatba soronként:
Esemény Kimenetel
sor[1][meccs] sor[1][tipp]
sor[2][meccs] sor[2][tipp]
...
sor[n][meccs] sor[n][tipp]
6

Változók

Poetro · 2009. Okt. 14. (Sze), 11.19
Mivel a változók a PHP futását befejezve megszűnnek, el kell őket tárolni valahová.
Amennyiben a felhasználónak csak az adott munkamenet idejére van rá szüksége, és később senki más nem akar vele foglalkozni, akkor $_SESSION-ba kellene eltárolni elindított munkamenet után.
Vagy pedig adatbázisban kell letárolni, ha nem csak az adott munkamenetben kell, vagy másnak is hozzá kell férni az adatokhoz akkor adatbázisban, fájlban vagy hasonló megosztható, és később visszanézhető módon kell letárolni.
Munkamenet esetén valahogy így nézne ki:
<?php
// A file elején indul a munkamenet
session_start();
if (empty($_SESSION['sor'])) {
  $_SESSION['sor'] = array();
}
if (isset($_POST['meccs']) && isset($_POST['tipp'])) {
  // Itt validálni kellene a POST változókat
  // ...

  $_SESSION['sor'][] = array(
    'meccs' => $_POST['meccs'], 
    'tipp' => $_POST['tipp']
  );
}
// Végül kiírjuk a táblázatot
?>
<?php if (!empty($_SESSION['sor'])) ?>
<div class="center">
  <div class="wrapper">
    <table summary="Tipplista">
      <thead>
        <tr>
          <th scope="col">Meccs</th>
          <th scope="col">Tipp</th>
        </tr>
      </thead>
      <tbody>

        <?php foreach($_SESSION['sor'] as $sor) : ?>
        <tr>
          <td><?php print $sor['meccs']?></td>
          <td><?php print $sor['tipp']?></td>
        </tr>
        <?php endforeach; ?>

      </tbody>
    </table>
  </div>
</div>
<?php endif; ?>
7

vazze session...

mokat · 2009. Okt. 14. (Sze), 11.26
tényleg a nagyszerű session, mindjárt neki is esek köszikösziköszi :)
8

MEGOLDÁS

mokat · 2009. Okt. 15. (Cs), 14.58
úgytudom illik közölni a kész megoldást is:

<?php
 session_start();
 
if ($_POST['torles'] == 'del')
{
 $_SESSION['sor'] = array();
}
 
if (isset($_POST['meccs']) && isset($_POST['tipp']))
{

$_SESSION['sor'][] = array (
"esemeny" => $_POST['meccs'],        
"kimenetel" => $_POST['tipp'],
);

print "<div align=center>";
print "<div id='wrapper'>";
print "<table cellpadding='0' cellspacing='0' border='0' class='sortable' id='sorter'>";
print "<th>Esemény</th><th>Tipped</th>";

foreach ($_SESSION['sor'] as $e)
{
  print ("<tr>");

  foreach ($e as $kulcs => $ertek)
  {
        print("<td align=center>".$ertek."</td>");
  }
 print("</tr>");
}
print "</div></table></div>";
}

?>


beviteli részhez meg raktam egy törlési lehetőséget is:
<?php
if (count($_SESSION['sor']) != NULL)
{
?>
<form action="<?echo $_SERVER['PHP_SELF']?>" method="POST">
<input type="hidden" name="torles" value="del">
<input type="submit" value="Törlés">
</form>
<?php
}
?>


köszi mind2-őtöknek a segítőkézséget!
nah mostmár csak az sql táblába kéne betölteni egyesével... (:
2

nem tömböt POST-olsz

joed · 2009. Okt. 13. (K), 16.11
Szia!

A "//tömbbe rendezés" részt nem értem, mert nem tömböt postolsz, hanem egy string változót, egyetlen string van a $_POST['meccs'] változóban. A szöveges változók tömbként is működnek, ahol 0-tól az indexek a string karaktereit tartalmazzák, de gondolom nem ez a célod.

Előbb a bemenetedet kellene tisztázni.

A tömbön belül iterálás során egy belső mutatóval (array pointer) tájékozódsz, éred el az aktuális elemet. Ezt a mutatót tudod mozgatni előre, hátra, vagy elérni az aktuális elemet, ahogy az előttem szóló kolléga is írta. De mivel PHP-ban vannak asszociatív, azaz nem szigorúan numerikus indexű, nem folyamatos indexelésű tömbök, szerintem, használd inkább a foreach struktúrát!