Zum Inhalt springen

Problem mit array_search und Variablennamen zusammenbauen

Erstellt am 30. Juni 2008 · 4 Antworten · letzte Antwort am 1. Juli 2008

Tags: Frage

sefer ·

Hi,
[Zeile 1-14]
Aus einer Datenbank ermittle ich Werte(uids) aus verschiedenen Feldern und speichere diese in den ensprechenden arrays ($players_uid usw..). Array deswegen, weil in einem Feld mehrere uids sind (z.Bsp 4,5,6). mit explode erstelle ich meine arrays.

[Zeile 21-33]
Nun habe ich mir in der Tabelle(tx_cfcleague_profiltyp) die Feld_Namen(profiltyp_fieldname) für players, coaches etc. erstellt, um hierdurch die Feldnamen für die Tabelle(tx_cfcleague_teams) aus der DB zu ermitteln.

Die For-Schleife funktioniert auch wunderbar, alles wird wie gewollt ausgegeben.

MEIN PROBLEM:
ich möchte überprüfen, ob ein bestimmtes ($this->piVars['id_profiles']='4') uid in dem array $players_uid ist und falls ja die checkebox ($check_result) aktivieren. Im Anschluss soll die Schleife mit dem nächsten Feld weiter machen.
Die Lösung erreicht man wenn man array_search nimmt!

Hierfür habe ich die Variable für das zweite Argument selber zusammengebaut:
$profiltyp_fieldname_var='$'.$profiltyp_fieldname[$i].'_uid';
//Ausgabe 0: $players_uid
ich erhalte aber diese Meldung:

FEHLERMELDUNG:
Warning: array_search() [function.array-search]: Wrong datatype for second argument in /opt/lampp/htdocs/beta_06/typo3conf/ext/sd_t3sports_fe_admin/pi1/class.tx_sdt3sportsfeadmin_pi1.php on line 1949 -->Die Zeile mit array_search!!!!

FRAGE:
Darf ich Variablen_Namen nicht zusammenbauen?

Danke,
Sefer

Hier der Code:

<?php
    //1.)ermittelt den Datensatz der ausgewählten Mannschaft		   
		   $field='*'; 
		   $table='tx_cfcleague_teams';
		   $where='uid='.$this->piVars['id_team'];
		   $rows=$this->getItem($field, $table, $where, $groupBy, $orderBy, $limit);
	   
   while(list($c,$row)=each($rows))	{
   			//1.1.2 Alle profile_id's werden in den entsprechenden arrays gespeichert
			$players_uid = explode(",",$row["players"]);
			$coaches_uid = explode(",",$row["coaches"]);
			$supporters_uid = explode(",",$row["supporters"]);
			$fan_uid = explode(",",$row["fan"]);
			$functionary_uid = explode(",",$row["functionary"]);
				
	}
	//print_r($players_uid);
	//Ausgabe:
	//Array ( [0] => 4 [1] => 5 [2] => 6 ) 
	
	    //#############Option aus Datenbank füllen BEGINN Funktionsauswahl
   		 $abfrage = "SELECT * FROM `tx_cfcleague_profiltyp` ORDER BY uid";
   		 $ergebnis = mysql_query($abfrage);
    $profiltyp = array();
    $profiltyp_fieldname = array();
    $uids = array();

    while($row = mysql_fetch_object($ergebnis))
      {
        $profiltyp[] = $row->profiltyp;
        $profiltyp_fieldname[] = $row->profiltyp_fieldname;
        $uids[] = $row->uid;
       }

    for ($i=0; $i<sizeof($uids); i="" profiltyp_fieldname_var="$" profiltyp_fieldnamei_uid="" check_result="array_search($this-">piVars['id_profiles'], $profiltyp_fieldname_var);
   	if ($check_result) $check_result='checked="checked"';
       
    $content.='<br /><input type="checkbox" name="'.$this-" />prefixId.'[profiltyp][]" value="'.$uids[$i].'"'.$check_result.' > '.$profiltyp[$i];

     }
     //#############Option aus Datenbank füllen ENDE 
?>

Meine Beiden Tabellen:

CREATE TABLE IF NOT EXISTS `tx_cfcleague_teams` (
  `uid` int(11) NOT NULL auto_increment,
  
  `coaches` blob NOT NULL,
  `players` blob NOT NULL,
  `supporters` blob NOT NULL,
  `fan` text NOT NULL,
  `functionary` text NOT NULL,
  
  PRIMARY KEY  (`uid`),
  KEY `parent` (`pid`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;


CREATE TABLE IF NOT EXISTS `tx_cfcleague_profiltyp` (
  `uid` int(11) NOT NULL auto_increment,
  `profiltyp` varchar(30) default NULL,
  `profiltyp_fieldname` varchar(30) default NULL,
  PRIMARY KEY  (`uid`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

--
-- Daten für Tabelle `tx_cfcleague_profiltyp`
--

INSERT INTO `tx_cfcleague_profiltyp` (`uid`, `profiltyp`, `profiltyp_fieldname`) VALUES
(1, 'Spieler', 'players'),
(2, 'Trainer', 'coaches'),
(3, 'Betreuer', 'supporters'),
(4, 'Fan', 'fan'),
(5, 'Funktionär', 'functionary');
einpraegsam.​net ·
sefer schrieb

FRAGE:
Darf ich Variablen_Namen nicht zusammenbauen?

Na jedenfalls nicht so. Mit eval() kannst du das machen was du machen willst.
Die Frage ist wirklich ob das der richtige Weg ist...

sefer ·

Danke für die Tipps,
werde sie später ausprobieren.

zu Umständlich:
Ich muss noch viel lernen, aber vielleicht überlege ich erstmal und dann schreibe code.

Sefer

sefer ·

Habs jetzt so gemacht und funktioniert.
wobei ich den teil mit eval noch nicht 100% verstanden habe.

Vielleicht kann man das ganze noch sauberer lösen, aber mir fällt jetzt nix besseres ein. Mir ging es in dieser Lösung auch vornehmlich daran, Feldnamen aus der Datenbank dynamisch zu ermitteln. In diesem Beispiel sind es nur 5 Felder, aber was mache ich bei 50?

Vielleicht hat jemand einen besseren Vorschlag!

der nue CODE:

<?php
  //Dies ist nötig, um zu wissen, ob die Checkboxen aktiviert sind oder nicht
    //1.)ermittelt den Datensatz der ausgewählten Mannschaft		   
			   $field='*'; //wenn man den ganzen Datensatz(rows) möchte dann '*'
			   $table='tx_cfcleague_teams';
			   $where='uid='.$this->piVars['id_team'];
		   $rows_team=$this->getItem($field, $table, $where, $groupBy, $orderBy, $limit);
	   
	
    //#############Option aus Datenbank füllen BEGINN Funktionsauswahl		   
		   	$table='tx_cfcleague_profiltyp';
		   	$orderBy='uid';
		   	$where='';
		  $rows_profiltyp=$this->getItem($field, $table, $where, $groupBy, $orderBy, $limit);
		 //print_r($rows_profiltyp); 
		  
		  
		  
		  $checked=' checked="checked"';
		  $empty = '';
    for ($i=0; $i<sizeof($rows_profiltyp); $i++)
    {
    	
	/*
   	$players_uid = explode(",",$rows_team[0]['players']);
	$res=in_array($this->piVars['id_profiles'], $players_uid);
  	*/  	
    	//1.Die Array Variable zusammenbauen ($players_uid, $coaches_uid usw
		$profiltyp_fieldname_array='$'.$rows_profiltyp[$i]['profiltyp_fieldname'].'_uid';
		eval("\$profiltyp_fieldname_array = \"profiltyp_fieldname_array\";");
		
		//2.Den Wert vom Feld aus der Teamstabelle ermitteln (4,7,9,45)
		//3.Und dem array hinzufügen
      $profiltyp_fieldname_array = explode(",",$rows_team[0][$rows_profiltyp[$i]['profiltyp_fieldname']]);
      	//Die  Profil_id im array suchen
      $res=in_array($this->piVars['id_profiles'], $profiltyp_fieldname_array);
      echo "<br>Value: ";
      print_r($rows_team[0][$rows_profiltyp[$i]['profiltyp_fieldname']]);
		echo "<br>Array: ";
      print_r($profiltyp_fieldname_array);
      
       $content.='<br/><input type="checkbox" name="'.$this->prefixId.'[profiltyp][]" value="'.$rows_profiltyp[$i]['uid'].'"';
       $content.=$res ? $checked : $empty;
       $content.='>&nbsp;'.$rows_profiltyp[$i]['profiltyp'];


     }


     //#############Option aus Datenbank füllen ENDE    
     
?>