foreach probleem

Status
Niet open voor verdere reacties.

mick93

Gebruiker
Lid geworden
31 mrt 2010
Berichten
90
Onderstaand probleem is een stukje code.
Het is de bedoeling dat je op deze manier kan aangeven welke aflevering je verkregen c.q. gekeken hebt.
Als ik echter op de submit knop klikt, 'verkrijgt' hij me alle afleveringen in één keer in plaats van alleen maar die ene aflevering.

Iemand enig idee hoe ik dit kan fixen?

Groeten en alvast bedankt!

Mick


PHP:
		$aPrint = $aShow->episodes;
		foreach($aPrint as $aValue){
		
		$aAflevering = "S{$aValue->combined_season}E{$aValue->episode_number}";
		
		if(isset($_POST['sVrg']))
		{
		$sQuery = "INSERT INTO `gezien` (`user`, `series_id`, `aflevering`) VALUES('{$_SESSION['user']}', '{$aRowSerie['id']}', '{$aAflevering}')";
			if(!@mysql_query($sQuery))
			{ printf(_("Er ging iets mis tijdens het aanvinken als verkregen.")); }
			else
			{ 
			header("Location: http://***/series/show/naam/{$aRowSerie['naam']}/");
			}
		}
		?>
	<tr class="light">
	<td><?= $aValue->combined_season; ?></td>
	<td><?= $aValue->episode_number; ?></td>
	<td><?= $aValue->episode_name; ?></td>
<!-- <td><?= $aValue->first_aired; ?></td> -->
	<td><?= $aAflevering; ?></td>
	<td><input type="submit" name="sVrg" title="Aflevering verkregen" value="" style="background:url(../include/images/niet.png) no-repeat;" /></td>
	<td><input type="submit" name="sGek" title="Aflevering gekeken" value="" style="background:url(../include/images/niet.png) no-repeat;" /></td>
	</tr>
		<?
		}
		?>
 
Haal de query uit de foreach, voeg een of meerdere hidden velden toe binnen de foreach met de data die je nodig hebt en handel het formulier ergens anders af :)
 
Als ik het formulier elders afhandel, dan kan ik toch niet zorgen dat er iedere keer zo'n knopje verschijnt waar men dan op kan klikken? Of begrijp ik je verkeerd?
 
Je kunt de formulier-elementen prima laten staan, het gaat er alleen op dat je hem niet afhandelt binnen de foreach.

Dus je kunt de action van het formulier laten verwijzen naar een andere pagina of je controleert binnen de huidige pagina of er een formulier is verzonden.
 
Als ik hem zo zet:
PHP:
<form method="post" action="****/series/show/naam/<?= $aRowSerie['naam']; ?>" name="form2">
		<table summary="afleveringen" cellpadding="0" cellspacing="0" width="50%">
        <thead>
          <tr>
          <th colspan="8">Volledige afleveringenlijst</td>
          </tr>
        </thead>
        <tbody>
	<tr class="subheader">
	<td width="10%">Seizoennummer</td>
	<td width="10%">Afleveringnummer</td>
	<td width="40%">Afleveringnaam</td>
	<td width="30%">Originele uitzending</td>
	<td width="10%" colspan="2">&nbsp;</td>
	</tr>

		<?
		if(isset($_POST['sVrg']))
		{
		
		$aAflevering = "S{$aValue->combined_season}E{$aValue->episode_number}";

		$sQuery = "INSERT INTO `gezien` (`user`, `series_id`, `aflevering`) VALUES('{$_SESSION['user']}', '{$aRowSerie['id']}', '{$aAflevering}')";
			if(!@mysql_query($sQuery))
			{ printf(_("Er ging iets mis tijdens het aanvinken als verkregen.")); }
			else
			{ 
			header("Location: http://***/series/show/naam/{$aRowSerie['naam']}/");
			}
		}
		
		$aPrint = $aShow->episodes;
		foreach($aPrint as $aValue){
				
		?>
	<tr class="light">
	<td><?= $aValue->combined_season; ?></td>
	<td><?= $aValue->episode_number; ?></td>
	<td><?= $aValue->episode_name; ?></td>
	<td><?= $aValue->first_aired; ?></td>
	<td><input type="submit" name="sVrg" title="Aflevering verkregen" value="" style="background:url(../include/images/niet.png) no-repeat;" /></td>
	<td><input type="submit" name="sGek" title="Aflevering gekeken" value="" style="background:url(../include/images/niet.png) no-repeat;" /></td>
	</tr>
		<?
		}
		?>
		</tbody>
		</table>
		</form>

Dan pakt hij de user en het series_id wel, maar geeft hij me voor aflevering gewoon 0. Waar ik ook klik.
Pakt nu overigens wel netjes gewoon 1 record.

Enig idee hoe ik dit kan oplossen?
 
Dat komt omdat je die waardes niet in je formulier opneemt ;)

Je hoort nu een foutmelding te krijgen dat $aValue niet bestaat of geen property "combined_season" heeft.

Verder is er maar één juiste manier om te controleren of een formulier is verzonden en dat doe je zo:
PHP:
if ($_SERVER['REQUEST_METHOD'] == "POST") {
    // Er is een formulier verzonden
}
 
Als ik de waarde in de database zie komen, dan weet ik toch alsnog dat hij verzonden is?
Ik doe daar toch niets fout of zie ik het verkeerd? Graag uw wijsheid want je weet er meer vanaf dan ik haha! Die foutmelding krijg ik niet, dus hij doet maar gewoon 0. Ook vreemd.

Hoe dan ook, de oplossing is nog altijd zoek :(
 
Controleren of een waarde bestaat is niet gelijk aan het controleren (en niet betrouwbaar genoeg) of er een formulier is verzonden. Check dus altijd op de REQUEST_METHOD in plaats van het bestaan van een waarde in de array :)

Dat je geen foutmelding krijgt duidt op het niet juist instellen van foutmeldingen binnen PHP, wanneer je dit op de daadwerkelijke server probeert is dat logisch. Daar wil je ze ook niet tonen maar als je aan het ontwikkelen bent scheelt het een hoop gezoek wanneer iets niet werkt ;)

Meer informatie: How to get useful error messages in PHP?

Probeer dit eens:
PHP:
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    if (isset($_POST['sVrg'])) {
        $sQuery = "
            INSERT INTO gezien (`user`, `series_id`, `aflevering`) VALUES
            ('". $_SESSION['user'] ."', '". $_POST['serie_id'] ."', '". $_POST['episode'] ."')";
        if(!@mysql_query($sQuery)) {
            printf(_("Er ging iets mis tijdens het aanvinken als verkregen."));
        } else { 
            // Als je dit helemaal bovenaan plaatst dan zal een refresh niet nodig zijn gok ik, aangezien je dan hieronder de gegevens uit de database op gaat vragen en deze wijziging dus meekomt.
            //header("Location: http://***/series/show/naam/{$aRowSerie['naam']}/");
        }
    }
}
?>
<form method="POST" action="" name="form2">
    <input type="hidden" name="serie_id" value="<?= $aRowSerie['id'] ?>" />
    <table summary="afleveringen" cellpadding="0" cellspacing="0" width="50%">
        <thead>
            <tr>
                <th colspan="8">Volledige afleveringenlijst</td>
            </tr>
        </thead>
        <tbody>
            <tr class="subheader">
                <td width="10%">Seizoennummer</td>
                <td width="10%">Afleveringnummer</td>
                <td width="40%">Afleveringnaam</td>
                <td width="30%">Originele uitzending</td>
                <td width="10%" colspan="2">&nbsp;</td>
            </tr>
            <?php
            foreach ($aShow->episodes as $aValue) {
                $aAflevering = "S{$aValue->combined_season}E{$aValue->episode_number}";
            ?>
            <tr class="light">
                <td><?= $aValue->combined_season; ?></td>
                <td><?= $aValue->episode_number; ?></td>
                <td><?= $aValue->episode_name; ?></td>
                <td><?= $aValue->first_aired; ?></td>
                <td>
                    <input type="hidden" name="episode" value="<?= $aAflevering ?>" />
                    <input type="submit" name="sVrg" title="Aflevering verkregen" value="" style="background:url(../include/images/niet.png) no-repeat;" />
                </td>
                <td><input type="submit" name="sGek" title="Aflevering gekeken" value="" style="background:url(../include/images/niet.png) no-repeat;" /></td>
            </tr>
            <?php
            }
            ?>
        </tbody>
    </table>
</form>
 
Laatst bewerkt:
Dat werkt wel, maar dan komt automatisch de laatste aflevering in de database i.p.v. degene waar je op klikte.
Iemand kwam ermee dat ik dit wellicht met ajax moest doen, maar daar heb ik helemaal geen verstand van.

Wat is wijsheid?
 
Hmm ja op zich is dat wel logisch :eek:

De formulieren zullen per aflevering gemaakt moeten worden, nu wordt er 1 groot formulier gemaakt en zijn de waardes altijd die van de laatste (omdat ze steeds worden overschreven)

AJAX is wel een beter alternatief, scheelt wat overhead maar daar zul je je wel wat meer in moeten voor je er aan begint :)

Probeer dit eens, ik heb alleen de knoppen nu in één kolom gezet. Die zul je dan via CSS wat aan moeten passen zodat de weergave naar je zin is. Laat ik ze in 2 kolommen dan ga ik lopen rommelen in de HTML-structuur die dan niet meer valide zal zijn.
PHP:
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    if (isset($_POST['sVrg'])) {
        $sQuery = "
            INSERT INTO gezien (`user`, `series_id`, `aflevering`) VALUES
            ('". $_SESSION['user'] ."', '". $_POST['serie_id'] ."', '". $_POST['episode'] ."')";
        if(!@mysql_query($sQuery)) {
            printf(_("Er ging iets mis tijdens het aanvinken als verkregen."));
        } else { 
            // Als je dit helemaal bovenaan plaatst dan zal een refresh niet nodig zijn gok ik, aangezien je dan hieronder de gegevens uit de database op gaat vragen en deze wijziging dus meekomt.
            //header("Location: http://***/series/show/naam/{$aRowSerie['naam']}/");
        }
    }
}
?>
<table summary="afleveringen" cellpadding="0" cellspacing="0" width="50%">
    <thead>
        <tr>
            <th colspan="8">Volledige afleveringenlijst</td>
        </tr>
    </thead>
    <tbody>
        <tr class="subheader">
            <td width="10%">Seizoennummer</td>
            <td width="10%">Afleveringnummer</td>
            <td width="40%">Afleveringnaam</td>
            <td width="30%">Originele uitzending</td>
            <td width="10%" colspan="2">&nbsp;</td>
        </tr>
        <?php
        foreach ($aShow->episodes as $aValue) {
        ?>
        <tr class="light">
            <td><?= $aValue->combined_season; ?></td>
            <td><?= $aValue->episode_number; ?></td>
            <td><?= $aValue->episode_name; ?></td>
            <td><?= $aValue->first_aired; ?></td>
            <td>
                <form method="POST" action="" name="form2">
                    <input type="hidden" name="serie_id" value="<?= $aRowSerie['id'] ?>" />
                    <input type="hidden" name="episode" value="<?= 'S'. $aValue->combined_season .'E'. $aValue->episode_number ?>" />
                    <input type="submit" name="sVrg" title="Aflevering verkregen" value="" style="background:url(../include/images/niet.png) no-repeat;" />
                    <input type="submit" name="sGek" title="Aflevering gekeken" value="" style="background:url(../include/images/niet.png) no-repeat;" />
                </form>
            </td>
        </tr>
        <?php
        }
        ?>
    </tbody>
</table>
 
Voor alsnog gaan we het iets anders doen. Door de afleveringen te importeren naar de eigen database. Dat is toch iets simpeler.
Je hebt het in ieder geval wel een stuk duidelijker gemaakt zo. Dankjewel!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan