mssql_fetch_array() Nur erste Spalte von Tabelle wird abgearbeitet

Briefkasten

Erfahrenes Mitglied
Hallo,

ich will eine dyn. Tabelle, mit Formularelementen erstellen. D.h wenn ich später in der DB eine Spalte hinzufüge soll die Funktion in der Lage sein, selber die neue Spalte zu erkennen und das passende Formularelement erstellen.

Hier mal der Code:

PHP:
$result = mssql_query($sql);
if(gettype($result)!="boolean")
{
				
for($int = 0; $int<$spaltenanzahl;$int++)
 $names[] = mssql_field_name ($result,$int);
$count = 0;
while($row = mssql_fetch_array($result))
{
	echo "\t<tr>";
	switch ($datentyp[$count])
	{
		case "int":
			echo "\t\t<td>".$row[$count]."</td>\n";
			break;
		case "text":
			echo "\t\t<td><textarea name=\"".$names[$count].trim($row[0])."\" cols=\"35\" rows=\"4\">".trim($row[$count])."</textarea></td>\n";
			break;
		case "bit":
			if($row[$count]=="1")
				$checkbox = "checked=\"checked\"";
			else
				$checkbox = "";
			echo "\t\t".'<td><input type="checkbox" name="'.$names[$count].trim($row[0]).'" value="'.$names[$count].'" '.$checkbox.'> '.$names[$count].'<br></td>'."\n";
			break;
		default:
			echo "Für den ".$datentyp." gibt es kein passendes Steuerelement.";
	}
	echo "\t</tr>";
}
}

Derzeit sieht die Tabelle in der DB so aus:

In DB tabelle:

Zimmernr (int) beschreibung (text) tv (bit) küche (bit)
123 zimmer mit meeresblick 1 0
324 neues zimmer 1 1

Das Problem ist, dass mit dem oberen Code nur die erste Spalte also Zimmernr ausgegeben wird. Die Spalte Beschreibung, tv, etc. soll aber genauso ausgeben werden.

Weiß jemand was ich da anstellen muss, dass die restlichen Spalten auch ausgegeben werden?

mfg

Briekfasten
 
Zuletzt bearbeitet:
$sql = SELECT rooms.* FROM rooms

Wenn ich die Abfrage mit dem MS Managment Studio teste erhalte ich die richtige Abfrage. Es muss also am PHP Code liegen.

Ich muss in die Schleife noch eine Schleife einbauen um auf die Spalten zuzugreifen können. Allerdings weiß ich nicht wirklich wie, bzw. meine versuche waren bis jetzt ergebnis los.
 
Zuletzt bearbeitet:
$spaltenanzahl ist 0, darum liest dein script nur eine zeile aus.

Du brauchst nichtmal zwingend diese for() anweisung, da while nur so lange läuft wie Daten vorhanden sind. wenn du die aber behalten willst, musst du zwangsweise $spaltenanzahl einen wert zuweisen:

PHP:
$spaltenanzahl = mssql_num_rows($result);

Edit:

ups, seh grad, dass des ja ne ganz andere funktion hat des for(), sorry :D aber dies müsst dann richtig sein:

PHP:
$spaltenanzahl = mssql_num_fields($result);
 
Zuletzt bearbeitet:
ups, seh grad, dass des ja ne ganz andere funktion hat des for(), sorry :D aber dies müsst dann richtig sein:

PHP:
$spaltenanzahl = mssql_num_fields($result);

Das habe ich eh. Die Frage mal kürzer und anderst formuliert:

Ich habe mit select die komplette Tabelle abgefragt mit while($row = mysql_fetch_array($result)), da drinnen habe ich noch ein switch, allerdings wird das switch nur einmal pro zeile aufgerufen, muss ich für jede zeile eine einzellne query erstellen, dass das switch so oft durchlaufen wird wie die Zeile Spalten hat?

http://rafb.net/p/Maia5Y28.html

mfg
 
Zuletzt bearbeitet:
ah, okay, ich dödel :D ne, ist klar. Du kannst glaube ich keine Switch-Funktion an der stelle nehmen, es sei denn du nimmst die break;s heraus (wobei ich dann nicht weiss, ob dann das script noch so funkioniert wie du willst.)

am besten nutzt du statt switch einfach ne if($datentyp[$count] == xxx)-Abfrage. Das break; in der Scwitch-Anweisung stoppt bei Übereinstimmung das Script :) Darum gibt er nur eine Zeile aus der DB aus.
 
Hallo,

hier das fertige Skript. Funktioniert jetzt.

PHP:
<summary>
/// Erstellt mit der passenden SELECT Abfrage ein Formular mit den passenden Elementen - aufgebaut als Tabelle.
/// Formularelemente können wie folgt aufgerufen werden z.B. $_POST[Spaltenname[x].Splantenname[0]]
/// </summary>
/// <param name="$sql">sql query SELECT</param>
/// <param name="$url">Stammurl die die Seite hat, &id=$row[0] wird an die Stammurl angehängt</param>
/// <param name="$text">text der der Link haben soll</param>
public function ms_table_form($sql,$url,$text)
{
	$dbconnect = $this->mssql;

	if($dbconnect==false)
		return trigger_error("Class dbcon_functions: Es wurde noch keine Verbindung von dieser Instanz zur DB aufgebaut! dbconnect(false)",E_USER_ERROR);
	else
	{
		$result = mssql_query($sql);
		$i=0;
		while ($i < mssql_num_fields($result))
		{
			$meta = mssql_fetch_field($result, $i);
			if (!$meta)
			    return trigger_error("Class dbcon_functions: Keine Information verfügbar ".var_dump($meta)."! dbconnect(false)",E_USER_ERROR);
			else
				$datentyp[] = $meta->type;
			$i++;
		}
		$spaltenanzahl = Count($datentyp);
		
		echo "\n\t<table border=\"1\">\n";

		$result = mssql_query($sql);
		if(gettype($result)!="boolean")
		{
			
			for($int = 0; $int<$spaltenanzahl;$int++)
				$names[] = mssql_field_name ($result,$int);


			while($row = mssql_fetch_array($result))
			{
				echo "\t\t<tr>\n";

				for($int = 0;$int<$spaltenanzahl;$int++)
				{
					if($int==0)
						echo "\t\t\t<td>".'<a href="'.$url."&id=".$row[$int].'">'.$text.'</a>'."</td>\n";
					switch ($datentyp[$int])
					{
						case "int":
							echo "\t\t\t<td>".$row[$int]."</td>\n";
							break;
						case "text":
							echo "\t\t\t<td><textarea name=\"".$names[$int].trim($row[0])."\" cols=\"35\" rows=\"4\">".trim($row[$int])."</textarea></td>\n";
							break;
						case "bit":
							if($row[$int]=="1")
								$checkbox = "checked=\"checked\"";
							else
								$checkbox = "";
							echo "\t\t\t".'<td><input type="checkbox" name="'.$names[$int].trim($row[0]).'" value="'.$names[$int].'" '.$checkbox.'> '.$names[$int].'<br></td>'."\n";
							break;
						default:
							echo "Für den ".$datentyp." gibt es kein passendes Steuerelement.";
					}
					
				}

				echo "\t\t</tr>";
				
			}
		}
		else
			return trigger_error("Class dbcon_functions: Die übergebene Query $sql = ".$sql." ist fehlerhaft",E_USER_ERROR);	
		
		echo "\n\t</table>";

	}
}

Aufrufen kann man die Funktion wie folgt:

PHP:
echo "\n<center>\n";
echo '<form action="intern.php?id=rooms&save=true" method="POST" name="form1">';
$sql = "SELECT     rooms.* FROM         rooms";
$db->ms_table_form($sql,"intern.php?id=rooms","löschen");
echo '<br><a href="JavaScript:document.forms[0].submit();">Speichern</a> || ';
echo '<a href="intern.php?id=rooms&new=true">Neue Template Einstellungen erstellen</a>';
echo "\n</form>";
echo "\n</center>\n";

Die Funktion erstellt eine dyn. Tabelle mit den passenden Formularelementen.
In jede Zeile wird zusätzlich ein Link erstellt, um z.B die angeklickte Zeile weiter verarbeiten zu können.

Vlt. kanns ja jemand brauchen xD

PS: Code muss an das jeweilige Skript angepasst werden. Da meine Funktion in einer Klasse ist.

Wenn man $dbconnect = $this->mssql; und if($dbconnect==false) entfernt sollte es funktionieren, + funktion passend aufrufen. Und evtl. mssql durch mysql ersetzten, da die meisten wahrscheinlich mit einer mysql DB arbeiten.

mfg
 
Zuletzt bearbeitet:
Zurück