Page 1 of 1

Benutzerdefinierter Tag + PHP + mySQL

Posted: Mon Dec 19, 2005 8:11 am
by dietzi
Guten Morgen,

mir ist klar daß mein Problem grundsätzlich eher mit PHP zu tun hat, aber aufgrund der "Weihnachtsamnestie"  ;) traue ich mich sie auch hier zu stellen. Vielleicht hat ja jemand eine Lösung parat.

Anforderung: Homepage für einen Kunden, der viele technische Daten aus einer Datenbank tabellarisch darstellen möchte. Dazu mache ich eine Vorlage mit den ganzen mySQL-Anweisungen als benutzerdefinierten Tag {datenbankanzeige}, den er dann bei Bedarf nur mehr einfügen muß.

In der Vorlage habe ich folgenden Code, der grundsätzlich funktioniert:

Code: Select all

$dbtab = name;
...
$sql = "SELECT * FROM $dbtab WHERE
...
Das einzige das ich nicht in der Vorlage bestimmen kann, ist der Name der jeweiligen Datenbank. Also dachte ich daran den Namen der jeweiligen Datenbank als Parameter zu definieren, den der Kunde noch mit angibt, also so:
{datenbankanzeige name=beliebig}

Der Code müßte dann so aussehen:

Code: Select all

$dbtab = $params['name']; //eventuell fehlen Klammern oder Anführer
...
$sql = "SELECT * FROM $dbtab WHERE
...
Aber das funktioniert nicht mehr, so kann keine Verbindung zur jeweiligen Datenbank hergestellt werden. Wie gesagt ich weiß auch nicht ob diese Schreibweise in PHP überhaupt möglich ist.

Dietmar

Re: Benutzerdefinierter Tag + PHP + mySQL

Posted: Mon Dec 19, 2005 11:51 am
by Piratos

Code: Select all

<?
function smarty_function_database($params, &$smarty) {
  $datenbank = isset($params['datenbank']) ? $params['datenbank']:false;
  $dbtab = isset($params['dbtab']) ? $params['dbtab']:false;
  $dbhost = isset($params['dbhost']) ? $params['dbhost']:false;
  $dbuser = isset($params['dbuser']) ? $params['dbuser']:false;
  $dbpasswort = isset($params['dbpasswort']) ? $params['dbpasswort']:false;
  // hier könnte man noch eine Abfrage machen ob alle Parameter vorhanden sind
  // nun die Verbindung zu mysql
  $link = mysql_connect($dbhost, $dbuser, $dbpasswort) or die("Could not connect : " . mysql_error());
  // und nun die Verbindung zur Tabelle
  mysql_select_db($dbtab) or die("Could not select database");
 // Nun query und Ausgabeaufbereitung
  $result="";
  $e = mysql_query("SELECT * FROM ".$dbtab." WHERE X = Y");
  // Verbindung schliessen
  mysql_close($link);
  //Ergebnis ausgeben
  return $result;
}

?>

Re: Benutzerdefinierter Tag + PHP + mySQL

Posted: Sun Oct 08, 2006 11:03 am
by dietzi
Hallo und Mahlzeit

Das Problem wird erst jetzt aktuell (nach fast 1 Jahr), aber der Kunde gehört auch nicht zu den Schnellentschlossenen.
@Piratos: Danke für Deine Antwort damals  ;D

Meine Beschreibung war leider nicht ganz korrekt und etwas ungenau, ich möchte mit dem Parameter nicht eine Datenbank auswählen sondern eine Datenbanktabelle (Da auf einem Webhost meistens der Name der Datenbank vorgegeben ist und man ja nur neue Tabellen in genau dieser Datenbank erstellen darf).

Das Script von Piratos auf diese Anforderung zu ändern ist nicht das Problem. Ich muß gestehen, daß ich mit der Syntax nicht klarkomme. Auch das Studieren der Plugin-Quelltexte hat mich nicht nach vorne gebracht.

Das Problem: Es wird mir auf der Seite absolut nichts angezeigt, die Debug-Ausgabe zeigt auch keine Fehler. Der Code in der Funktion wird augenscheinlich ignoriert!

Meine Vorgehensweise:
Ich habe einen benutzerdefinierten Tag mit folgendem Code erstellt (Verbindungsdaten sind richtig angegeben). Der Name des Tags ist identisch mit dem Namen der Funktion -> database.
Zum Testen der Smarty-Funktion habe ich absichtlich keinen Parameter verwendet, sondern die Datenbanktabelle explizit angegeben.
Aber grundsätzlich soll mit einem Parameter die Tabelle für den mysql_query ausgewählt werden können.

Code: Select all

function smarty_function_database($params, &$smarty) {
// LOCALHOST
$db_server = "localhost";
$db_user = "...";
$db_pass = "...";
$db = "...";

$connection = mysql_connect($db_server,$db_user,$db_pass) or die("Could not connect : " . mysql_error());
mysql_select_db($db,$connection) or die("Could not select database: " . mysql_error());

echo "<table ...>\n";
$result = "";
$e = mysql_query('SELECT * FROM test1 WHERE id>=2');
	while($row = mysql_fetch_row($e)) {
		echo "<tr>";
		for($i=1; $i<count($row); $i++) { 
		echo "<td><div...>".$row[$i]."</div></td>";
		}
		echo "</tr>\n";
	}
mysql_free_result($e);
mysql_close($connection);
return $result;
echo "</table>";
}
Wie oben schon erwähnt wird mir auf der Seite absolut nichts angezeigt. Ich nehme an, daß eine Funktion auch ohne Parameter benutzt werden kann. Diesen Eindruck habe ich bei den Plugins gewonnen.

Frage: Wird bei einer Funktion nur ausgegeben, was der Variablen $result zugewiesen wird?
Bei den Plugins wird es ja folgendermaßen verwendet:

Code: Select all

$result = "";
$result .= "...";
$result .= "...";
return $result;
Also wird bei mir wahrscheinlich die Variable $e nicht ausgelesen!? Vielleicht $e in $result umbenennen, aber das ist es auch nicht.

Code: Select all

...
$result = "";
$result = mysql_query('SELECT * FROM test1 WHERE id>=2');
	while($row = mysql_fetch_row($result)) {
		echo "<tr>";
		for($i=1; $i<count($row); $i++) { 
		echo "<td><div...>".$row[$i]."</div></td>";
		}
		echo "</tr>\n";
	}
mysql_free_result($result);
mysql_close($connection);
return $result;
...
Ich brüte nun schon seit gestern nachmittag über dem Problem und bin auch darüber verwundert, wie schwach ich übersetzt bin. In Bezug auf PHP und mySQL  :-[. Ich dachte mit Quelltext- und Manualstudium kriege ich es hin.

Nun muß ich Euch bitten: Helft mir über die Hürde.

LG
Dietmar

Re: Benutzerdefinierter Tag + PHP + mySQL

Posted: Sun Oct 08, 2006 11:41 am
by Piratos

Code: Select all

<?php
function smarty_function_database($params, &$smarty) {
// LOCALHOST
$db_server = "localhost";
$db_user = "..";
$db_pass = "..";
$db = "..";

$connection = mysql_connect($db_server,$db_user,$db_pass) or die("Could not connect : " . mysql_error());
mysql_select_db($db,$connection) or die("Could not select database: " . mysql_error());

$result = "<table summary='MyDatabaseTest1'>\n";
$e = mysql_query('SELECT * FROM `test1` WHERE `id` >= 2');
while($row = mysql_fetch_row($e)) {
$result .= "<tr>";
for($i=1; $i<count($row); $i++) {
$result .="<td><div>$row[$i]</div></td>";
}
$result .= "</tr>\n";
}
$result .="</table>";
mysql_free_result($e);
mysql_close($connection);
return $result;
}
?>
Da normales Smarty Plugin muss es in lib/smarty/plugins

Re: Benutzerdefinierter Tag + PHP + mySQL

Posted: Sun Oct 08, 2006 3:10 pm
by dietzi
Geschafft

Danke an Piratos, den unermüdlichen Helfer (in der Not).

So schaut mein funktionierendes Script nun aus

Code: Select all

function smarty_function_database($params, &$smarty) {
// LOCALHOST
$db_server = "localhost";
$db_user = "...";
$db_pass = "...";
$db = "...";
$tab = isset($params['tab']) ? $params['tab']:false;

$connection = mysql_connect($db_server,$db_user,$db_pass) or die("Could not connect : " . mysql_error());
mysql_select_db($db,$connection) or die("Could not select database: " . mysql_error());

$result = "<table border=\"0\" cellpadding=\"0\" cellspacing=\"1\" class=\"db-table\">\n";
$e = mysql_query('SELECT * FROM '.$tab.' WHERE id = 1');
while($row = mysql_fetch_row($e)) {
	$result .= "<tr>";
	for($i=1; $i<count($row); $i++) {
		$result .="<td><div class=\"db-head\">$row[$i]</div></td>";
	}
	$result .= "</tr>\n";
}

$e = mysql_query('SELECT * FROM '.$tab.' WHERE id >= 2');
while($row = mysql_fetch_row($e)) {
	$result .= "<tr>";
	for($i=1; $i<count($row); $i++) {
		$result .="<td><div class=\"db-cell\">$row[$i]</div></td>";
	}
	$result .= "</tr>\n";
}
$result .="</table>";

return $result;
mysql_free_result($e);
mysql_close($connection);
}
Ich habe die Ausgabe vor dem Schließen der Datenbankverbindung platziert, weil ich sonst einen "mysql_real_escape_string()" - Fehler bekomme.

Die Hürde ist genommen, danke und
LG
Dietmar

Re: Benutzerdefinierter Tag + PHP + mySQL

Posted: Sun Oct 08, 2006 3:15 pm
by Piratos
Die beiden letzten Zeilen kannst du dir dann sparen - kein Effekt mehr, du hast die Funktion mit dem return bereits verlassen.

Da es nur eine einzelne Funktion ist wird das auch nicht benötigt, da die Verbindung zu Mysql danach verloren ist.

Re: Benutzerdefinierter Tag + PHP + mySQL

Posted: Tue Apr 15, 2008 6:09 am
by VVx
Hallo zusammen,

ich hole diesen Beitrag mal aus dem Keller hervor, in der Hoffnung, dass einer der beiden Beteiligten diesen noch einmal liest. Kann mir die Lösung mal jemand erklären? Ich brüte nun seit zwei Tagen über diesen Beitrag und werde daraus nicht wirklich schlau. Ich möchte eigentlich nur MySQL in einem Content-Text darstellen... Vielen Dank für eure Hilfe.

Gruß
VVx

Re: Benutzerdefinierter Tag + PHP + mySQL

Posted: Tue Apr 15, 2008 9:45 am
by NaN
Nun, das sollte eigentlich ganz einfach sein.
Du kopierst den Code von dietzis letztem Beitrag und speicherst ihn unter /lib/smarty/plugins/function.database.php.

Hier musst Du nur noch Deine Zugangsdaten Deiner Datenbank einfügen:

Code: Select all

// LOCALHOST
$db_server = "localhost";
$db_user = "..";
$db_pass = "..";
$db = "..";
Die Bedingung WHERE id = 1 musst Du evtl. noch anpassen (ist abhängig von Deiner Tabelle bzw. von der gewünschten Ausgabe).

Jetzt müsstest Du im Template oder im Content die Funktion mit {database tab="TabellenName"} aufrufen können.
Zumindest hab ich das so verstanden. Habs nicht getestet.

Re: Benutzerdefinierter Tag + PHP + mySQL

Posted: Tue Apr 15, 2008 1:12 pm
by VVx
Hi,
nachdem ich den ganzen Morgen damit verbracht habe, habe ich es nun hinbekommen. War in der Tat nicht so schwierig wie es sich liest  ;) Danke für deine Hilfe.

Gruß
VVx