Archief - Checkbox + while lus

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.

Deadangel

Legacy Member
Bon, het probleem stelt zich als volgt:
Ik ben bezig aan een soort van inventaris-systeem te maken met PHP.

Voorbeeld (click)

Al mijn voorwerpen worden hier weergegeven, door middel van een while lus. De naam van het voorwerp word net als het aantal uit de database gehaald. Nu stelt zich het volgende probleem: ik zou meerdere dingen moeten kunnen kiezen ( dit door het vak “kiezen” naast het voorwerp aan te vinken), en daarnaast het aantal van het benodigde voorwerp te schrijven. Vervolgens moet ik op selecteren klikken, en dan plaatst hij de gekozen voorwerpen in een andere tabel: uitgeleende_voorwerpen.
Nu is het probleem eigenlijk; Ik heb geen idee hoe kan aangeven welke checkbox aangevinkt is, en welke niet, vooral niet aangezien het aantal voorwerpen variabel is. Iemand een suggestie hoe ik dit oplos ?

(Shit; Programming & Gamedesign ? )

Albireo

Legacy Member
maak van je checkboxes een array (door elke checkbox dezelfde name aangevuld met "[]" te geven) en gebruik het ID van het voorwerp als value, voor de textboxes gebruik je het ID als name
demonstratiescriptje:
Code:
<?php
	$voorwerpen=array(
		101=>'voorwerp 1',
		201=>'voorwerp 2'
	);
?>
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="nl-be">
<head>
	<title></title>
</head>
<body>
	<form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="post">
		<div>
			<?php
				echo '<table>';
				foreach($voorwerpen as $id=>$voorwerp) {
					echo '<tr><td><input type="checkbox" name="gekozen[]" value="' . $id . '" />' . $voorwerp . '</td><td><input type="textbox" name="' . $id . '" /></td></tr>';
				}
				echo '</table>';
				echo '<input type="submit" value="selecteer" />';
			?>
		</div>
	</form>
	<?php
		if ($_SERVER['REQUEST_METHOD']=='POST') {
			echo '<ul>';
			foreach($_POST['gekozen'] as $id) {
				echo '<li>' . $voorwerpen[$id] . ': ' . $_POST[$id] . '</li>';
			}
			echo '</ul>';
		}
	?>
</body>
</html>

het ID als naam van de textbox gebruiken werkt natuurlijk alleen maar als er 1 textbox per voorwerp hoeft ingevuld te worden... over hoe je dat oplost als er meerdere textboxes per voorwerp staan, moet ik nog eens nadenken...

Jerre Muesli

Legacy Member
die checkboxes; als ge die allemaal dezelfde name-tag geeft vormen die nen array die ge kunt aflopen om te kijken of ze wel of niet gecheckt zijn. Indien gecheckt kunt ge de value-tag opvragen he om te zien wat er juist is uitgeleend.

Deadangel

Legacy Member
Uhm :wtf:

Oké, euhm..
Ik had een test-pagina gedaan, waar ik nog niets uit de database haal, maar enkel wat pruts met for lusjes. ( Pruts zal 't juiste woord wel zijn )

Ik had:

Code:
<form method="post">
<center>
  <table width="376">
    <tr>
      <th width="76" bgcolor="#666666" scope="col">Voorwerp</th>
      <th width="44" bgcolor="#666666" scope="col">Aantal</th>
      <th width="46" bgcolor="#666666" scope="col">Kiezen</th>
      <th width="79" bgcolor="#666666" scope="col">Gekozen aantal</th>
    </tr>
    <?php 
  $i='1';
  while ($i != '4')
  { ?>
    <tr>
      <td><center>
        Voorwerp <?php echo $i; ?>
      </center></td>
      <td><center>
        <?php echo $i+1; ?>
      </center></td>
      <td><center>
        <input type="checkbox" name="checkbox<?php echo $i; ?>" value="True" />
      </center></td>
      <td><center>
        <input type="text" name="aantal<?php echo $i; ?>" maxlength="255" />
      </center></td>
    </tr>
    <?php
  $i = $i +1;
  }
  ?>
  </table>
  <input type="submit" value="Selecteer" name="mat"/></center>
 </form>
 <?php }
 }
 $aantal = 0;
 if(isset($_POST['mat'])) { 
 	$nr = $_GET['nr'];
	$klas = $_GET['klas'];
	$cat= $_GET['cat'];
	echo'Nr. ';
	echo $nr;
	echo' van klas ';
	echo $klas;
	echo' (naam) heeft het volgende materiaal mee: ';
	
 			for($i=0; $i <= 3; $i++){
				if (($_POST['checkbox' + $i]=='True') and ($_POST['aantal' + $i]!=''))
					{
					$aantal = $_POST['aantal' + $i];
					echo $i;
					echo ' - (';
					echo $cat;
					echo ') - <b>aantal: ';
					echo $aantal;
					echo '</b><br>';
					
					}
 				} 
	} 
?>

Al werkte dat niet echt :lol:
Allez, 't is te zeggen: hij geeft de geselecteerde dingen wel weer, maar als "aantal" zegt hij "True" :p.

Albireo

Legacy Member
Ik heb je code even aangepast tot iets dat werkt:
1. In je while lus gebruikt je $i eerst als een string ($i='1' en $i!='4') en vervolgens ga je $i als een integer gebruiken ($i=$i+1) (het is niet fout omdat PHP die string automatisch zal omzetten naar integer en omgekeerd, maar het is wel erg raar om het zo te doen)

2. dit gaat niet lukken: $_POST['checkbox' + $i], je probeert een string en een integer op te tellen terwijl je bedoeling waarschijnlijk is om ze aan mekaar te plakken; gebruik daarvoor de . operator => $_POST['checkbox' . $i] ($i is hier een integer maar dat wordt weer automatisch omgezet in een string)
'checkbox' + 1 == 1
'checkbox' . 1 == 'checkbox1'
PHP: Type Juggling - Manual

3. om te testen of een checkbox aangekruist is gebruik je de isset()-functie: isset($_POST['checkbox' . $i]) => als dit true is => aangekruist; false => niet aangekruist; ($_POST['checkbox' + $i]=='True') zal een fout geven voor elke checkbox die niet is aangekruist omdat de variable $_POST['checkbox' + $i] dan simpelweg niet bestaat. (in dit geval is de value van de checkbox irrelevant)

4. je while-lus komt niet overeen met je foreach-lus
de while-lus gaat van 1 t.e.m. 3 en de foreach-lus van 0 t.e.m. 3

Code:
<form method="post">
<center>
  <table width="376">
    <tr>
      <th width="76" bgcolor="#666666" scope="col">Voorwerp</th>
      <th width="44" bgcolor="#666666" scope="col">Aantal</th>
      <th width="46" bgcolor="#666666" scope="col">Kiezen</th>
      <th width="79" bgcolor="#666666" scope="col">Gekozen aantal</th>
    </tr>
    <?php 
  $i=1;
  while ($i != 4)
  { ?>
    <tr>
      <td><center>
        Voorwerp <?php echo $i; ?>
      </center></td>
      <td><center>
        <?php echo $i+1; ?>
      </center></td>
      <td><center>
        <input type="checkbox" name="checkbox<?php echo $i; ?>" value="True" />
      </center></td>
      <td><center>
        <input type="text" name="aantal<?php echo $i; ?>" maxlength="255" />
      </center></td>
    </tr>
    <?php
  $i = $i +1;
  }
  ?>
  </table>
  <input type="submit" value="Selecteer" name="mat"/></center>
 </form>
 <?php 
 $aantal = 0;
 if(isset($_POST['mat'])) { 
 	$nr = $_GET['nr'];
	$klas = $_GET['klas'];
	$cat= $_GET['cat'];
	echo'Nr. ';
	echo $nr;
	echo' van klas ';
	echo $klas;
	echo' (naam) heeft het volgende materiaal mee: <br />';
	
 			for($i=1; $i < 4; $i++){
				if ((isset($_POST['checkbox' . $i])) and ($_POST['aantal' . $i]!=''))
					{
					$aantal = $_POST['aantal' . $i];
					echo $i;
					echo ' - (';
					echo $cat;
					echo ') - <b>aantal: ';
					echo $aantal;
					echo '</b><br>';
					
					}
 				} 
	} 
?>

Nog een woordje over het gebruik van checkboxes als array. Als je elke checkbox dezelfde naam geeft aangevuld met "[]" zoals in dit voorbeeld:
Code:
<input type="checkbox" name="gekozen[]" value="1" />
<input type="checkbox" name="gekozen[]" value="2" />
<input type="checkbox" name="gekozen[]" value="3" />
dan zal PHP een array genaamd $_POST['gekozen'] maken met als inhoud de value van elke checkbox die is aangekruist. Dan hoef je dus niet meer een voor een elke checkbox af te gaan en te testen of die is aangekruist of niet. Je kan die array dan aflopen als volgt:
Code:
			if (isset($_POST['gekozen'])) {
				echo '<ul>';
				foreach($_POST['gekozen'] as $i) {
					echo '<li>checkbox ' . $i . ' is aangekruist</li>';
				}
				echo '</ul>';
			}
De controle op isset($_POST['gekozen']) is nodig omdat als er geen enkele checkbox is aangekruist de variable $_POST['gekozen'] niet bestaat
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