php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Tabelle in Variable abspeichern...


 
Luka
01-04-2004, 16:15 
 
Hi,

bin mir nicht sicher, ob man mein Vorhaben wirklich so lösen kann/sollte aber vielleicht äussert sich ja jemand dazu. Also folgendes...

Ich habe eine Übersicht mit unterschiedlichen Beiträgen. Wenn ich auf einen Beitrag klicke möchte ich nun gerne in die Komplettansicht wechseln.
Ich sehe dann halt nur den einen Beitrag in voller Ansicht.

Das Ganze versuche ich nun so umsetzten.

default.php

if ($aktion == "3"){
include("tpl/site.tpl");
include("tpl/top.tpl");
include ("tpl/navi.tpl");

ansicht_artikel();
include ("tpl/content.tpl");
}


In der Funktion steht folgendes:


function ansicht_artikel()
{
$sql="SELECT tblBeitrag.BeitragsID, tblBeitrag.BeitragsTitel......


$result=mysql_query($sql)or die(mysql_error().$errordatabase);

if($result)

{

echo '<table border="0" width="100%">';


while ($beitraege = mysql_fetch_array($result))
{


echo ' <tr>';
echo ' <td>&nbsp;</td>';
echo ' <td>';
echo $beitraege['BeitragsTitel'];
echo '</td>';
echo '</tr>';

}
echo'</table>';
}
}



(Das Ganze wurde nun natürlich extrem verkürzt)

Nun möchte ich gerne die komplette Tabelle in eine Variable abspeichern und diese aus der Funktion zurückgeben, da ich diese gerne in die Seite content.tpl einfügen möchte. Sprich das Ergebnis der SQL Abfrage steht in einer Variablen und in der Datei content.tpl schreibe ich einfach nur echo $content;

Ich könnte mir das ja einfach selber zusammenbauen, wird aber ziemlich lang und bevor ich das so umsetzte wollte ich einfach mal fragen, ob es eine einfachere Möglichkeit dafür gibt.

Hoffe das war einigermassen verständlich. Vielen Dank im voraus.

 
TobiaZ
01-04-2004, 17:31 
 
*verschieb* BS

BTW: Wo wird $action definiert?

 
Luka
01-04-2004, 17:49 
 
Hi,

$aktion wird durch die "Links" der Navigation definiert. Also drückt man auf einen Beitrag, wird $aktion auf 3 gesetzt und dementsprechend erfolgt die Verarbeitung.

 
marc75
01-04-2004, 17:51 
 
//so ungefähr?

$ tab1 = '<table border="0" width="100%">';
while ($beitraege = mysql_fetch_array($result))
{


$ tab2= ' <tr>
<td>&nbsp;</td>
<td>
'.$beitraege['BeitragsTitel'].'
</td>
</tr>';

}
$tab3 = '</table>';

$tabelle = $tab1 . $tab2 . $tab3;

 
Luka
01-04-2004, 18:37 
 
Der Tip sieht gut aus, leider funktioniert es momentan aber noch nicht. Habe irgendwie noch ein Problem, das meine Funktion nix zurückgibt.

Im Prinzip dachte ich mir das nun so:




function ansicht_artikel()
{

//Hier die SQL Abfrage....

// dann der Rest

$ tab1 = '<table border="0" width="100%">';
while ($beitraege = mysql_fetch_array($result))
{


$ tab2= ' <tr>
<td>&nbsp;</td>
<td>
'.$beitraege['BeitragsTitel'].'
</td>
</tr>';

}
$tab3 = '</table>';

$tabelle = $tab1 . $tab2 . $tab3;

return ($tabelle)
}


Nun ruft die Default.php die Funktion auf, bekommt die Variable $tabelle mit der gesamten Tabelle drinn, bindet danach die Datei content.tpl ein und in der steht echo $tabelle. Leider wird noch nichts angezeigt. Irgendeine Idee was ich da genau falsch mache?

Danke schonmal für den ersten Ansatz. Sieht ansonsten wirklich gut aus.

 
marc75
01-04-2004, 18:42 
 
$ tab1 stewht das so bei dir im code? oder eher so: $tab1

 
Luka
01-04-2004, 18:46 
 
ne ne, natürlich steht da $tab1. Aber irgendwie ist da wohl ein allgemeines Problem. Habe in die Funktion einfach mal $tabelle="Hallo" und dann return $tabelle reingeschrieben. In der default steht echo $tabelle. Nun müsste da doch Hallo stehen oder nicht? Es passiert leider nichts, sprich da stimmt was nicht oder habe ich das mit den Funktionen noch nicht verstanden?

 
Floriam
01-04-2004, 18:51 
 
In einer Schleife hängt man meißtens den neuen Inhalt an den alten heran, und definiert den Inhalt nicht neu. So könntest du auch mehr als eine (nähmlich die letzte, bei welcher der Inhalt neudefiniert wurde) Zeile machen.. :D ;)

 
marc75
01-04-2004, 18:56 
 
gedankenfehler



function ansicht_artikel()
{

//Hier die SQL Abfrage....

// dann der Rest

$tab1 = '<table border="0" width="100%">';
$tab2 ='';
while ($beitraege = mysql_fetch_array($result))
{

$tab2 .= ' <tr>
<td>&nbsp;</td>
<td>
'.$beitraege['BeitragsTitel'].'
</td>
</tr>';

}
$tab3 = '</table>';

$tabelle = $tab1 . $tab2 . $tab3;

return ($tabelle)
}

 
Floriam
01-04-2004, 19:21 
 
Funktioniert jetzt alles?

 
Luka
01-04-2004, 19:33 
 
Nein leider nicht. Probiere gerade alle mögliche aus. Habe ja auch einfach mal $tabelle="Hallo" und dieses dann versucht mit return($tabelle) versucht an die default.php weiterzugeben und dann dort mit echo $tabelle auszugeben, aber auch das funktioniert nicht. Ich verstehe das nicht... gut ich gebe zu, dass ich vorher noch nicht mit Funktionen gearbeitet habe, aber so schwer kann das doch nicht sein...

 
Floriam
01-04-2004, 19:51 
 
Syntax einer Funktion:


function funktionsname($parameter1, $parameter2) {
//Nur, wenn man variablen aus dem Script nutzen will
//welches diese Funktion aufruft
global $variablevonscript1, $variablevonscript2;

//Aktionen ausführen...

//Rückgabewert definieren (also was man zurückgeben will)
$ergebnis = ($parameter1*$parameter2)+($variablevonscript1*$variablevonscript2);

//Wert zurückgeben
return $ergebnis;
} // Ende von Funktionsname

//Variablen $variablevonscript1 und $variablevonscript2 definieren
$variablevonscript1 = 100;
$variablevonscript2 = 200;

//Funktion aufrufen
$ergebnisderfunktion = funktionsname(3,4);

echo 'Ergebnis der Funktion: '.$ergebnisderfunktion;



Hoffentlich ist dir die Struktur von Funktionen klarer geworden... :)

 
Luka
01-04-2004, 19:53 
 
So ich habe die Lösung. Man muss die Variable $tabelle erst als global deklarieren, ansonsten ist die nur in der Funktion verfügbar. (Habe ich im www gefunden)

Sieht nun so aus:



global $tabelle;
$tabelle=$tab1 . $tab2 . $tab3;


Ach ja und das Ganze läuft jetzt ohne return $tabelle. Hätte eigentlich gedacht das ich das brauche, aber funktioniert nur so. Ich danke Euch allen für die Hilfe, obwohl noch keiner darauf eingegangen ist, ob diese Lösung eigentlich zu empfehlen ist. Ist bestimmt ein etwas ungewöhlicher Aufbau, den ich mir da versuche anzueignen. Ich möchte alle SQL Befehle in eine Datei schmeissen. Diese besteht nur aus Funktionen, die dann nach Bedarf aufgerufen werden. Ich möchte dann immer eine Variable zurückbekommen, die mit den Ergebnissen gefüllt ist. Diese wird dann in der Datei Content.tpl aufgerufen mit echo $content.

Vielleicht kann ja mal einer der "alten Hasen" was zu diesem Stil sagen. Da ich noch ganz am Anfang stehe, bin ich natürlich auch noch auf der Suche nach dem richtigen Stil.

Gruss

 
asp2php
01-04-2004, 23:39 
 
ist aber nicht sauber. Mit return $retvar bist du besser dran, denn bei
Verwendung von globalen Variablen in einer Funktion wirst du schnell
die Übersicht bei großen Projekte verlieren. Alternativ gibst ja auch noch
call by reference.

 
Luka
02-04-2004, 11:46 
 
Hi asp2php,

ähm leider verstehe ich Deine Aussage nicht so ganz. Was für einen Unterschied macht es denn, ob ich nun return $variable oder nicht benutze?
Was ist daran unsauber und welche Nachteile hätte ich?

Alles was ich momentan mache ist das ich eine default.php habe über die alls gesteuert wird. Je nach Ereignis (es wurde z.B. auf Kategorie c geklickt) wird eine Funktion aufgerufen die dann Werte aus der DB ausliest und eine Tabelle zusammenbaut. Diese Tabelle, samt Werte, wird in eine Variable gespeichert und zurückgegeben. Danach Erfolgt das Eibinden der content.tpl die diese Variable mit echo $content ausgibt.

Es gibt also nur "eine" Seite, die je nach Ereignis über verschiedene Fallabfragen und Funktionen zusammengebaut wird.

Was ich eigentlich irgendwann erreichen möchte ist das ich einmal bereits erstellte Features ohne grössere Anpassungen weiterverwenden kann. Daher habe ich mir gedacht, dass es klug wäre alles was z.B. die Beiträge betrifft, also auslesen, neu schreiben usw. in eine Datei zu schmeissen und über Funktionen drauf zuzugreifen.

Wie gesagt, bin ja noch ein Frischling im Bereich Programmierung und mir daher auch nicht sicher, ob das nun ein kluger Weg ist oder nicht...

Über weitere Meinungen würde ich mich freuen.

 
asp2php
02-04-2004, 12:13 
 
um eine Funktion "unabhängig" einsetzen zu können, darfst du keine
weitere externe Variable als die Parameter der Funktion selbst voraussetzen.
Durch den Einsatz einer oder mehrere globalen Variablen ist die Fkt. an
dem aktuellen Projekt verbunden. Ausserdem wenn es mehrere solche
Funktionen gibt, die die gleichen globalen Variablen verwenden/verändern
verlierst du(u. U. deine Kollegen) die Übersicht, und der runtime Fehler ist schwer
zu orten. Das tritt besonders dann auf, wenn du im Team an einem Projekt
arbeitest, d.h. wenn du abundzu mal anonymen Mordandrohungen bekommst,
dann sollst du dich nicht wundern :D

 
Luka
02-04-2004, 12:53 
 
Mmh, heisst das nun, das dieser Aufbau nicht zu empfehlen ist? Ich hätte eigentlich gedacht, das ich damit relativ unabhängig bin. Ich kann das Layout der Seite ja beliebig verändern und alles was ich machen muss ist die Variable $content einzufügen, die den eigentlichen Inhalt dann darstellt.

Funktionen die zusammengehören landen auch alle in einer Datei und sind mit Kommentaren versehen. Also was muss an die Funktion übergeben werden (z.B. $KategorieID) und was wird zurückgegeben ($content).

Ich bin wirklich noch auf der Suche nach dem "richtigen" Programmierstil. In erster Linie möchte ich natürlich irgendwann in der Lage zu sein fertige Features ohne Probleme in neue Projekte einzubinden. Sprich jemand möchte z.B. ein Gästebuch, ich muss dann nur ein paar Dateien kopieren und in die default.php die neuen Ereignisse einbeziehen. Wenn auf den Link Gästebuch geklickt dann mache das....

Momentan bin ich noch nicht 100% auf dem richtigen Weg, da bin ich mir sicher, aber wie setzt man das auch richtig um??

 
Floriam
02-04-2004, 15:51 
 
Mmh, heisst das nun, das dieser Aufbau nicht zu empfehlen ist? Ich hätte eigentlich gedacht, das ich damit relativ unabhängig bin. Ich kann das Layout der Seite ja beliebig verändern und alles was ich machen muss ist die Variable $content einzufügen, die den eigentlichen Inhalt dann darstellt.

Bei deinem Aufbau wärs für einen normalen Programmierer relativ schwer zu sehen (besonders bei längeren Funktionen) was verändert wird.

Wenn man sich den Code deiner Datei anschauen würde, würde man relativ ratlos sein, wo auf einmal $tabelle herkommt. Bei $tabelle = maketable(); würde jeder sich die Funktion anschauen und sich anschauen was da passiert.

Das ist für andere Programmierer einfach besser zu verstehen... ;)


Floriam

 
Luka
02-04-2004, 16:33 
 
Hi Floriam,

habe das jetzt so umgesetzt (default.php):


// --------------------------------------------------------------------------
// -------- Auswahl eines Beitrages aus der Übersicht -----------
// --------------------------------------------------------------------------

if ($aktion == "3")
{
include("tpl/site.tpl"); // body tag und äussere Tabelle
include("tpl/top.tpl"); //obere Navigation
include ("tpl/navi.tpl"); // linke Navigation

$content=ansicht_artikel($ItemNr);

include ("tpl/content2.tpl"); // Seiteninhalt, hier steht echo $content

}

aktion=3 wird gesetzt, wenn man auf einen Beitrag aus der Liste klickt.

Ist das nun ein einigermassen guter Stil oder verrenne ich mich da in etwas. Mir persönlich gefällt er ganz gut.

Ach ja, die default.php ist komplett so wie oben umgesetzt. In den tpl Dateien ist der HTML Code, Seiteninhalte ($content) sollen über Funktionen eingefügt werden, andere Seiteninhalte wie z.B. Drop Down Felder werden aus der DB ausgelesen und liegen in jeweils getrennten Dateien, die über ein include eingefügt werden.

 
Floriam
02-04-2004, 17:05 
 
$aktion wird doch entweder über ein Formular oder über die Adresszeile verändert oder?

Falls die Variablen nachher in der Adresszeile erscheinen würd ichs mit $_GET['aktion'] aufrufen. Falls man die Variablen nirgendswo sehen kann per $_POST['aktion']

Ansonsten müsstest du dir nur noch das verwenden von Templates anschauen. Was du benutzt eine Misch-Masch Version... :D



Floriam

 
Luka
02-04-2004, 17:28 
 
Du hast natürlich völlig Recht, das das Misch-Masch ist. Habe das mit den Templates noch nicht ganz durchschaut. Als Frischling gibt es halt so vieles zu lernen. Tja, so ist dann irgendwie dieser Stil entstanden (bzw. entsteht noch).

Mit dem $_GET['...'] werde ich noch einbauen, genauso wie ich auch noch die globalen Variablen abschalten muss. Ach ja, Übertragung erfolgt meistens über die URL, teilweise aber auch über Formulare.

Kann ich mit meinem verwendeten Stil eigentlich leicht auf "richtige" Templates umschwenken?

 
Floriam
02-04-2004, 18:58 
 
Kann ich mit meinem verwendeten Stil eigentlich leicht auf "richtige" Templates umschwenken?

Je nachdem was für eine Art Templates du nimmst. Aber eigentlich sollte es nicht so schwer sein ;)

Ich speicher immer den Inhalt des Templates als Datei (file_get_contents() (http://php.net/file_get_contents)), und lass ihn dann so umwandeln, als wär er PHP Code (eval() (http://php.net/eval)).


Dein Template würde dann in etwa so außsehen:

<html>
<head>
<title>
$sitetitle
</title>
</head>
<body>
$content
</body>
</html>

$sitetitle und $content würdest du in deiner PHP Datei ganz normal definieren, bevor du eval() anwendest... ;)


Floriam

 
Luka
03-04-2004, 17:40 
 
@Floriam,

ich werde mir das mit den Templates für's nächste Mal aufheben. Die jetzige Geschichte ziehe ich aber mit meinem Stil durch. Ich danke für alle bisherigen Kommentare und wünsche allen ein schönes Wochenende.


Alle Zeitangaben in WEZ +2. Es ist jetzt 04:08 Uhr.