Archief - array doorsturen via form

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

lenvin

Legacy Member
Hey iedereen!
ik ben bezig met het maken van een hitlijst en zou die daarbij willen ingeven in een database en daarna dan tonen.
Het script om te tonen is al af.
Das was easy, maar het script om de nummers in de database te steken lukt niet.

Hieronder zie je de form voor het ingeven van de hitlijst (dit werkt):
PHP:
<form method="post" action="../Scripts(PHP)/CrewTools/VerwerkHitlijst.php">
      <div id="tabelKoppen">
        <div class="dezeWeek">#</div>
        <div class="nummer">Nummer</div>
      </div>
      <div style="clear:both;"></div>
      <div id="hitlijstTabel">
        <?php
					$hitlijstNr;
          for ($hitlijstNr=0; $hitlijstNr<25; $hitlijstNr++) {
            echo"<div class='dezeWeek'>" .++$hitlijstNr. "</div>";
            $hitlijstNr--;
           	
						echo "<select class='nummer' name='hitlijst[]'>
							<option value='0'></option>";
							$artiesten = mysql_query("SELECT id, naam FROM artiesten ORDER BY naam");
							while(list($aId, $artiest) = mysql_fetch_array($artiesten)) {
								$nummers = mysql_query("SELECT id, naam FROM nummers WHERE artiestId='".$aId."' ORDER BY naam");
								while(list($nId, $nummer) = mysql_fetch_array($nummers)) {
									echo "<option value='" .$nId. "'>" .$artiest. " - " .$nummer. "</option>";
								}
							}
						echo "</select>";
						
						echo "<div style='clear:both; margin:0;'></div>";
          }
        ?>
      </div>
      <div style="clear:both;"></div>
      <div id="buttons"><input type="reset" value="Wis alle velden" /><input type="submit" value="Stuur de hitlijst van deze week in" /></div>
    </form>
En hieronder zie je het script voor het verwerken van die hitlijst. Momenteel toon ik het gewoon op die pagina, maar het is de bedoeling om dat later in een database te steken.
PHP:
<?php
	include("../Include/Connect.php");
	
	$hitlijst[] = mysql_real_escape_string($_POST["hitlijst[]"]);
	
	$hitlijstNr;
  for ($hitlijstNr=0; $hitlijstNr<25; $hitlijstNr++) {
		
		echo $hitlijstNr. ") " .$hitlijst[$hitlijstNr]."<br/>";
	}
?>

Mijn nummering word dus wel getoond, maar het bijhorende nummerId word niet getoond :S
Ik hoop dat er iemand mij hierbij kan helpen, want ik ben echt ten einde raad...
Alvast bedankt op voorhand!

piemel

Legacy Member
lenvin zei:
Hey iedereen!
PHP:
<?php
	include("../Include/Connect.php");
	
	$hitlijst[] = mysql_real_escape_string($_POST["hitlijst[]"]);
	
	$hitlijstNr;
  for ($hitlijstNr=0; $hitlijstNr<25; $hitlijstNr++) {
		
		echo $hitlijstNr. ") " .$hitlijst[$hitlijstNr]."<br/>";
	}
?>

De variabele $_POST['hitlijst'][] bestaat niet. $_POST['hitlijst'] is de array, dus je moet die gebruiken.

Doe op die pagina maar eens var_dump($_POST['hitlijst']).

Edit: of print_r($_POST['hitlijst']), het is namelijk een array.

/off-topic
ik hoop dat ge uw code voor de rest nog wat gaan aanpassen? Ik zie 2 queries staan die perfect in één query kunnen (multiple queries). Ook geen controle op de input op de tweede pagina etc.

lenvin

Legacy Member
dus ik moet dit zetten:
PHP:
$hitlijst = mysql_real_escape_string($_POST["hitlijst"]);

piemel zei:
/off-topic
ik hoop dat ge uw code voor de rest nog wat gaan aanpassen? Ik zie 2 queries staan die perfect in één query kunnen (multiple queries). Ook geen controle op de input op de tweede pagina etc.
Hoe zou ik die query dan kunnen aanpassen?
En wat bedoel je met controle op de input?

dJeez

Legacy Member
lenvin zei:
dus ik moet dit zetten:
PHP:
$hitlijst = mysql_real_escape_string($_POST["hitlijst"]);
Neen, uiteraard niet, want het is een array. Anders ga je de string Array() opslaan.

Wat je moet doen (afhankelijk van je DB schema uiteraard) is itereren over de elementen in de array met vb. foreach en ze dan stuk voor stuk wegschrijven in de DB via aparte INSERTs.

En voor de volledigheid, een mogelijke werkwijze :
PHP:
$hitlijst = isset($_POST['hitlijst']) ? $_POST['hitlijst'] : false;
if ($hitlijst) {
  // itereren over elementen en bewaren
}

piemel

Legacy Member
dJeez zei:
Neen, uiteraard niet, want het is een array. Anders ga je de string Array() opslaan.

die mysql_real_escape_string moet weg, ja.

hij had echter eerst $_POST['hitlijst[]'] ipv $_POST['hitlijst'] staan, en daar doelde mijn reactie op.

lenvin

Legacy Member
Ok het is aangepast naar
PHP:
$hitlijst = $_POST["hitlijst"];
en nu werkt het en kan ik die variabele dus als array gebruiken.

Maar ik snap nog steeds niet hoe ik het volgende simpeler kan maken en in 1 query zetten.
PHP:
$artiesten = mysql_query("SELECT id, naam FROM artiesten ORDER BY naam");
                            while(list($aId, $artiest) = mysql_fetch_array($artiesten)) {
                                $nummers = mysql_query("SELECT id, naam FROM nummers WHERE artiestId='".$aId."' ORDER BY naam");
                                while(list($nId, $nummer) = mysql_fetch_array($nummers)) {
                                    echo "<option value='" .$nId. "'>" .$artiest. " - " .$nummer. "</option>";
                                }
                            }
Want als ik
PHP:
SELECT artiesten.id, artiesten.naam, nummers.id, nummers.naam FROM artiesten, nummers WHERE nummers.artiestId ='artiesten.id' ORDER BY artiesten.naam, nummers.naam
doe dan lukt het niet.
Ofwel heb ik een foutje gemaakt, ofwel moet het op een totaal andere manier?

Zero Grav

Legacy Member
Ge zoudt eens naar JOINS moeten kijken. In uw geval zou iets à la het volgende wel moeten werken:

PHP:
SELECT artiesten.id, artiesten.naam, nummers.id, nummers.naam FROM artiesten LEFT OUTER JOIN nummers ON artiesten.id = nummers.artiestID ORDER BY artiesten.naam

Ge krijgt dan uw artiest hetzelfde aantal keer terug als em nummers heeft (minimaal één keer, ook al is er geen nummer).

lenvin

Legacy Member
Ja de artiest zou eigenlijk enkel zichtbaar mogen zijn als er ook daadwerkelijk nummers van aanwezig zijn in de database, zoals bij de methode die ik nu gebruik wel het geval is ...

Is er nog een andere (verkorte) manier om dit te doen?
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan