Aufzählungsliste erzeugen

strolch_007

Mitglied
hallo,

so ganz genau weiß ich nicht ob mein Problem jetzt wirklich eine php-Geschichte ist oder per Mysql gelöst werden kann. Ich hoffe mal ich bin hier richitg.

Also ich habe mehrere Ckeckboxen die dann nachdem das Formular abgeschickt wird entweder als 1 (gesetzt) oder eben als 0 (ungesetzt) in Mysql abgespeichert wird.

Als DB Feldtyp habe ich tinyint(1) gewählt. Das abspeichern und auslesen ist nicht das Problem, sondern wenn ich z.B. 10 verschiedene Checkboxen habe und alle möglichen Kombinationen beim auslesen aus der DB ausgeben mag wird das in php ja ein uferlos langer text zum eingeben
sieht z.B. bei mir so aus

PHP:
<?php
				// 1. Abfrage: nur ein Feld wird angezeigt	
				
				// Ausgabe der einzelnen Abfrageoptionen: Ausgabe = Ausgabe1 hören	
				if($row['ausgabe1'] =="1" AND $row['ausgabe2'] =="0" AND $row['ausgabe3'] =="0" AND $row['ausgabe4'] =="0"  usw.)
					$meldung= "ausgabe1";

?>

Bei 2 und mehr Ausgaben sollten dann noch ein Komma und &nbsp eingebaut werden. Gibts da nicht eine kürzere Darstellungsmöglichkeit per PHP (array - wie?)?

Hab so gar keine Idee nach was ich da googlen soll.

Gruss
strolch_007
 
Moin,

du könntest per [phpf]array_filter[/phpf] erstmal alle 0-Werte aus $row entfernen.

Dann brauchst du nur noch per implode() die array_keys($row) zu einem String verketten(als 1. Parameter übergibst du implode() dann halt das Komma oder sonstwas)

Das sähe dann ca. so aus:
PHP:
echo implode(',&nbsp;',array_keys(array_filter($row,create_function('$v','return $v;'))));
 
hallo,

danke für eure Antworten. Zu dem Einbau direkt in eine SQL Anweisung hab ich so gar keinen Plan. Wäre eine quante Geschichte wenn das so funktionieren würde.
An ein Array hab ich auch als erstes gedacht. Ich glaube auch das das der richtige und kürzestes Lösungsweg ist. Naja richtige Lösungswege gibts sicherlich wieder mehrere:-)
Ist es überhaupt sinnvoll bei meinetwegen 10 Optionsfelder auch 10 DB-Felder anzulegen, oder doch eher schlauer alle Eingaben in ein Array zu packen und dann in die DB als 1 Feld zu speichern?


Gruss

stroclh_007
 
hallo,

ich habe jetzt gegoogelt und bin auf

http://www.selfphp.de/kochbuch/kochbuch.php?code=24

gestossen (die einzige brauchbbare Erklärung zur Binärdarstellung die ich gefunden habe). Allerdings darf man bei dem Beispiel nicht mit "error_reporting(E_ALL);" arbeiten, weil man dann undefined offset um die Ohren gehauen bekommt. Ist ja auch recht schön das Ganze und theoretisch versteh ich das durchaus. Ist (wenn mans versteht) eine geniale Lösung genau zu meinem Thema. Alle Checkboxen können theoretisch wunderbar in ein INt Feld als Zahl abgespeichert werden. Dann irgendwie wieder ausgelesen. Dazu schweigt sich der Autor aber weitgehend aus. - Und vor allem die Checkboxen bleiben nach dem setzten checked! So hab ich das jetzt auch
Nichts desto trotz steh ich diesmal wirklich wie der berühmte Ochs vor dem Berg. Habe das ganze Beispiel mindestens 8 mal durchgelesen, kopiert getest und versucht das irgendwie für meine Belange machbar zu machen. Tja... beim Versuch bliebs dann auch.
Weil z.B. auch nichts darüber geschrieben steht wie das denn nun mit dern Reinschrift hinter den Checkboxen gehändelt wird. z.B. 1 Box = Äpfel, 2. Box i= Birnen usw. und man dann das Ganze als weitere Ausgabe als Liste ausgeben will (mit Freizeichen und Komma getrennt damit es schön lesbar ist).
Wer kann mir da mal grundlegend auf die Sprünge helfen wie ich das am besten anpacke damit ich verstehe wie ich das eingebe, in Mysql abspeichere ((ÌNT) ist soweit klar) und dann wieder auslese (wobei die Checkboxen dann nach dem Auslesen aus der DB als checked (falls 1) erscheinen und gleichzeitig eine Listenausgabe möglich ist (Äpfel, Birnen.......).
Bei meinem oben beschriebenen "System" funktioniert das schon genau so, aber bei 42 Checkboxen muß ich da ja wohl so gefühlte 1000 Zeilen Quelltext produzieren. Außerdem hab ich dann auch genau so viele Felder in der DB. Des kanns ja nun wirklich nicht sein.
Außerdem bin ich mir auch nicht sicher was denn abgespeichert wird, wenn gar kein Checkbox angeklickt wird. INT und 0 geht das denn?
Wäre auch sehr dankbar wenn man mir einen Link zu einer Seite nennt die das ganze verständlich (am besten anhand von Beispielen) beschreibt.
Das Ergebnis von SELFPHP, bzw. was ich so "gefummelt " habe, kann man im Anhang ansehen .

Gruss

strolch_007
 

Anhänge

  • Binärdarstellung_01.jpg
    Binärdarstellung_01.jpg
    7 KB · Aufrufe: 18
Zuletzt bearbeitet:
hallo registrierer,

hab mir die Seite (und viele andere) angesehen. So richtig Ahnung hab ich bis jetzt aber immer noch nicht wie ich das angehe. Verschlüssel ich die Checkboxen binär hab ich wieder den "Rattenschwanz" in PHP mit der Umwandlerei beim auslesen. Mache ich Reinschrift (Textfeld in der DB) müßte ich ja auch irgendwie wieder umwandeln (erst in Text und dann wieder zurück-beim auslesen) um das Ganze checked zu bekommen. Irgendwie bin ich wohl zu doof dafür. Kannst mir nicht an einem Beispiel zeigen (zumindest mal den Weg) wie das funktionieren könnte. Bastel dann ja auch gerne weiter und selber rum. Aber mir fehlt nach wie vor die Idee zum Einstieg. Die hier gemachten Andeutungen sind sicher alle gut und richtig. Aber irgendwie so der richtige Schubser für mich war noch nicht dabei.

Eigentlich ist mir alles theoretisch! klar, nur die Umsetzung in die Praxis ist extrem dünn.

Beitrag von Sven Mintel


Das ist eine schöne Ansicht, theoretisch auch klar, wobei mich in den ersten Sekunden schon der Schlag getroffen hat:-) Praktisch hilft das aber gar nicht weiter, weil ich bei so einer Tabelle z.B. auch noch auf die entsprechende Seite in SELFPHP verweisen würde (nur anklicken und dann die entsprechenden Binär- und Dezimalzahlen sehen ist schon schön, aber mangelhaft finde ich das es so gar nichts an PHP-Code dazu gibt.. Was besseres als SELFPHP hab ich bis jetzt leider nicht gefunden. Trotzdem dank an alle die mir versuchen zu helfen. Ich denke mal des wird ne grössere Aktion werden:-).

Übrigens das mit dem implode Beispiel hab ich auch gerafft, ist aber irgendwie auch noch nicht mal die "halbe Miete", weils da z.b. bei 42 Checkboxen "lustiges scrollen" nacht rechts gibt. OK ich weiß das kann man z.B. mit count blabla "in Form" bringen. Aber auch da (ist sicher ein gutes Beispiel) komm ich nicht so recht zu Schusse wenn ich mir vorstelle was ich so alles haben will und wie ich das dann möglichst sinnvoll umsetzte.

Vielleicht hat ja irgendwer ne zündende Idee für mich. Wie gesagt der Weg würde mir schon reichen (mit Beispielen). Ich bastel auch gerne selber!


lg
strolch_007
 
Beitrag von Sven Mintel



Das ist eine schöne Ansicht, theoretisch auch klar, wobei mich in den ersten Sekunden schon der Schlag getroffen hat:-) Praktisch hilft das aber gar nicht weiter, weil ich bei so einer Tabelle z.B. auch noch auf die entsprechende Seite in SELFPHP verweisen würde (nur anklicken und dann die entsprechenden Binär- und Dezimalzahlen sehen ist schon schön, aber mangelhaft finde ich das es so gar nichts an PHP-Code dazu gibt.. Was besseres als SELFPHP hab ich bis jetzt leider nicht gefunden. Trotzdem dank an alle die mir versuchen zu helfen. Ich denke mal des wird ne grössere Aktion werden:-).

Dass es da nichts mit PHP zu sehen gibt, liegt daran, dass es ein Javascript-Anschauungsbeispiel ist :-)
Ich hatte das eigentlich mal für mich selbst gemacht, um zu kapieren, was es mit Bits und diesem Ganzen Zeugs auf sich hat, zu meiner Schulzeit gab es sowas noch nicht :suspekt:

Aber um dir mal die Furcht vor den Bits ansich und vor Rattenschwänzen & grösseren Aktionen zu nehmen, hier ein lauffähiges PHP-Beispiel:
PHP:
<?php 
function dec2boxes($dec,$name="box",$num=32)
{
  $r='';
  if(is_int(intval($dec)) && is_int($num) && $num <= 32)
  {
    $j=1;
    for($i=0;$i<$num;++$i)
    {
      $r.='<br /><input type="checkbox" 
                        value="'.$j.'" 
                        name="'.$name.'['.$i.']"  '
                               .(($j & $dec)?'checked':'').' />';
      $j <<= 1;
    }
  }
  return $r;
}

function boxes2dec($REQ='_POST',$name="box")
{
  return array_sum($GLOBALS[$REQ][$name]);  
}
?>


<form method="post">
<?php 

  if(isset($_POST['box']))
  {
    if(is_array($_POST['box']))
      {
        echo '<input name="box" value="'.boxes2dec().'" />';
      }
    else
      {
        echo dec2boxes($_POST['box']);
      }
  }
  else
  {
    echo dec2boxes(0);
  }
?>
<br /><input type="submit">
</form>

Die Funktion dec2boxes() erwartet als Parameter ein Integer(das ist in der JS-Demo die Spalte "Berechtigung/dezimal", der Wert ganz Unten).

Dann wird in einer Schleife bis zu max. 32 mal(mehr Checkboxen gehen bei mir nicht, hab nen 32Bit-PC :-( ) das entsprechende Bit geprüft, ob es in dem übergebenen Wert gesetzt ist...

Code:
(($j & $dec)?'checked':'')
das ist eigentlich schon die Hauptarbeit, nicht grad ein Rattenschwanz :)

Was genau es mit diesem $j auf sich hat?
In $j (hat den Startwert 1) ist immer nur 1 Bit gesetzt...im übergebenen Integerwert können natürlich mehrere Bits gesetzt sein(eins für jede Checkbox).

Also angenommen, du hast den 3. Schleifendurchlauf(3. Checkbox soll geprüft werden), dann hat $j den Wert 4. Im Integerwert 4 ist nur das 3. Bit von links gesetzt.
Das gesetzte Bit wird nach jedem Schleifendurchlauf hierdurch verschoben:
Code:
$j <<= 1;
...man könnte $j auch immer mit 2 multlipizieren, nichts weiter macht dieser Schnipsel.


Jetzt kann man das mit dem übergebenen Integerwert vergleichen, ob dort auch das 3. Bit von Links gesetzt ist.

Angenommen, die erste, dritte und fünfte Checkbox sind gecheckt(siehe JS-Demo), ergibt das einen Wert von 21.

Dieser Vergleich sieht dann also so aus:
Code:
4 & 21
...und ergibt true


Der andere Part, das erzeugen des Integerwertes gemäss angeklickter Checkboxen, geht noch simpler.
Als value der Checkboxen wird der entsprechende Integerwert für diese Box(das Bit) verwendet, also bei der 1. Box 1 , bei der 2. Box 2 , bei der 3. Box 4 usw.
Die übermittelten Werte werden einfach per array_sum() addiert, fertig ist das Integer, welches du in die DB eintragen kannst.
 
hallo sven mintel,

also ich habe mich jetzt sehr ausführlich und auch sehr lange mit deinem Vorschlag befasst und muß zu meiner Schande gestehen das ich es nicht hin bekomme.

Ich habe aber nichts desto trotz eine Alternative zusammengestellt. Allerdings weiß ich sehr genau das es wohl nur die 3. beste Lösung ist (geschwindigkeit usw.)
Funktioniert soweit ja auch alles nur eines krieg ich nun nicht mehr hin (OHNE Fehlerhinweis). Das ganze checked zu setzen wenn der User mal was angeklickt hat.

Habe mir ein Testcript erstellt (das zugegebner Maßen noch etwas kunfus aussieht), aber mir gehts in erster Linie um das Verstehen der Funktionen. In der DB habe ich ein Feld blumen vom Typ text angelegt (42 Checkboxen!). Hier nun mal mein PHP Script:

PHP:
<?php 

    error_reporting(E_ALL);
	
	
	
	
	$blumen= ""; //Variable definieren wegen undefinded errors
	//$blumen= array();

	
	// Festlegung eines bestimmten Users - wird nur hIer gebraucht !!
	$_SESSION['UserID'] = "1";  
	

       $MYSQL_HOST = 'localhost';
       $MYSQL_USER = 'root';
       $MYSQL_PASS = 'xxxxxx';
       $MYSQL_DATA = 'xxxxxx';

    $connid = mysql_connect($MYSQL_HOST, $MYSQL_USER, $MYSQL_PASS) OR die("Error: ".mysql_error());
    mysql_select_db($MYSQL_DATA) OR die("Error: ".mysql_error());
	
	

		// a) Auslesen von hobbys - besonders wichtig bei neuen Usern und das   Feld somit leer
		// ist			
        $sql = "SELECT
                        blumen

                FROM
                        xxxxx
						
                		WHERE
                        		id = '".$_SESSION['UserID']."'
               ";
			   
			   

			   
        $result = mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
        $row = mysql_fetch_assoc($result);
		
		$blumen= $row['blumen'];
		
		if ( $row['blumen'] == "" OR $row['blumen'] == "0")
		
			echo "Es wurde noch nichts ausgewählt.";
			//echo $row['blumen'];
		
		else {
		// Nach dem Auslesen aus der DB
		// String wieder zu einem Array zusammensetzen
			$blumen= explode(",",$blumen);
						
		
		// Erstellen der Aufzählungsliste, getrennt jeweils mit einem Komma und Leerfeld 
			$liste = implode(", ",$blumen);
			//echo $liste;
			//echo "<br />";
			
		}
 
	
    	if(isset($_POST['submit']) AND $_POST['submit'] == 'wech'){ 
		
			if (isset($_POST['blumen']) == "" OR $_POST['blumen'] == "0") {
			
				
				$blumen= "0";
				
				
		// leeres Feld blumen updaten		
		$sql = "UPDATE
					   
                xxxxxxxx
				
                SET
                        blumen='".mysql_real_escape_string($blumen)."'
                WHERE
                        id = '".$_SESSION['UserID']."'
                   "; 
				   
     mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error()); 	

	   }
	   
	   
			if (isset($_POST['blumen']) ? 1 : 0) {
	
			//Array festlegen
			$blumen= $_POST['blumen'];
			
	
			// Array zu einem String zusammenfügen -> Komma als Trennzeichen
			// Diesen String in der DB speichern 
			$blumen= implode(",",$blumen);
	

			
		  // b) Datenbank mit der neuen Einstellung updaten - array $blumen ist jetzt zu 
		  // einem String umgewandelt und speicherbar! - ohne "Stringumwandlung" ist 
		  // korrektes abspeichern in DB nicht möglich	
	
	
		// b) geänderte blumen updaten		
		$sql = "UPDATE
					   
                xxxxxxxx
				
                SET
                        blumen='".mysql_real_escape_string($blumen)."'
                WHERE
                        id = '".$_SESSION['UserID']."'
                   "; 
				   
     mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error()); 	
  		
		
		
		
		// c) Auslesen und Ausgabe der geänderten Checkboxen		
        $sql = "SELECT
                        blumen

                FROM
                        xxxxxxxx
						
                		WHERE
                        		id = '".$_SESSION['UserID']."'
               ";
			   	
			   
        $result = mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
        $row = mysql_fetch_assoc($result);
		
		$blumen= $row['blumen'];
		
		// Nach dem Auslesen aus der DB
		// String wieder zu einem Array zusammensetzen
		
			$blumen= explode(",",$blumen);
			

 // Testausgabe ob es sich um ein array handelt und Tulpen enthalten ist			
 if(is_array($_POST['blumen']) && in_array("Tulpen",$blumen))
    {
    echo "ARRAY ist vorhanden und Tulpen ist enthalten.";
	echo "<br />";
    }

 // Testausgabe ob Rosen enthalten sind			
 if(is_array($_POST['blumen']) && in_array("Rosen",$blumen))
    {
    echo "ARRAY ist vorhanden und Rosen ist enthalten.";
	echo "<br />";
    }
			
		
		// Erstellen der Aufzählungsliste, getrennt jeweils mit einem Komma und Leerfeld 
			$liste = implode(", ",$blumen);
						
			echo "<br />";
			echo $liste;
			echo "<br />";
		
			
		}

}


	
?>


Sinn des Ganzen ist es zuerst die DB auszulesen und falls Inhalt vorhanden den in Listenform auszugeben, dann sollen die durch ....$_POST gemachten Änderungen sofort in die DB gespeichert werden und die daraus resultierenden Änderungen wiederum sofort angezeigt werden. Funktioniert soweit auch alles ganz gut.
Aber in folgendem liegt irgendwo bei mir ein Fehler, den ich einfach nicht finde. Wie gesagt es gibt keinen Fehlerhinweis.

HTML:
           <form action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>" method="post" >

<label>
<input type="checkbox" name="blumen[]" value="Tulpen" <?php echo is_array(isset($_POST['blumen'])) && in_array("Tulpen", $_POST['blumen']) ? 'checkded="checked"' : ''; ?> /> Tulpen</label><br>

<label>
<input type="checkbox" name="blumen[]" value="Rosen" /> Rosen</label><br>

<label>
<input type="checkbox" name="blumen[]" value="Nelken" /> Nelken</label><br>

<label>        
<input type="checkbox" name="blumen[]" value="Astern" /> Astern</label><br />

<label>
<input type="checkbox" name="blumen[]" value="Begonien" /> Begonien</label>


<br /><br />
 <input name="submit" type="submit" value="wech"  />

 		</form>

Wie man sieht versuche ich mit is_array festzustellen ob es sich überhaupt um ein array handelt (kein Fehlerhinweis!), dann möchte ich erreichen wenn Tulpen im array $blumen gefunden wird das die entsprechende Checkbox gecheckt bleibt. Das funktioniert aber aus irgendwelchen Gründen nicht. Wobei auch zu beachten ist das es beim ersten auslesen aus der DB ja nicht unbedingt erforderlich ist das das der Button "wech" betätigt wird. Auslesen aus der DB direkt! Irgendwo hab ich da wohl einen mächtigen Denkfehler drinnen.

Gruss
stzrolch_007
 
Zuletzt bearbeitet:
Zurück