• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] - Datenbankabfrage über php bereitet Probleme

Yehudi

Guru
Mein Anliegen ist es, in Joomla die beiden Eingabefelder zu nutze:

joomla-middle.jpg


das Pflichtfeld nutze ich für den grauen Rand, da man dieses für den Haupttext abstellen kann, das Optionale nutze ich für den Haupttext:
firefox-b.png


(so soll es aussehen)

Auf die Grauzone habe ich einen php/sql Code gestzt:
1.
Code:
<?php       
$id = mosGetParam( $_REQUEST, 'id' );

if ($id) {
    $sql = 'SELECT introtext FROM `jos_content` ORDER BY `introtext` ASC LIMIT 0, 30 ';
    $database->setQuery( $sql);
    $database->loadObject( $row );
    echo "<div class='grey'>" . $row->introtext . "</div>";
}
?>
2.
Code:
<?php
global $database;

$id = mosGetParam( $_REQUEST, 'id' );

if ($id) {
    $query = "SELECT introtext FROM `jos_content`  ORDER BY `introtext` ASC";
    $database->setQuery( $query );
    $database->loadObject( $row );
    echo "<div class='grey'>" . $row->introtext . "</div>";
}
?>

Leider will das ganze nicht so richtig, Ich habe das auch mal mit diesem Code versucht:

Code:
* Verbindung aufbauen, ausw�len einer Datenbank */
$link = mysql_connect("192.168.3.1", "root", "passwort")
   or die("Keine Verbindung m�lich: " . mysql_error());
echo "Verbindung zum Datenbankserver erfolgreich";
mysql_select_db("joomla") or die("Auswahl der Datenbank fehlgeschlagen");

/* ausfhren einer SQL Anfrage */
$query = "SELECT introtext FROM `jos_content` ORDER BY `introtext` ASC";
$result = mysql_query($query) or die("Anfrage fehlgeschlagen: " . mysql_error());

/* Ausgabe der Ergebnisse in HTML */
echo "<table>\n";
while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
   echo "\t<tr>\n";
   foreach ($line as $col_value) {
       echo "\t\t<td>$col_value</td>\n";
   }
   echo "\t</tr>\n";
}
echo "</table>\n";

/* Freigeben des Resultsets */
mysql_free_result($result);

/* schliessen der Verbinung */
mysql_close($link);
?>

Da funktioniert die Datenbankabfrage, nur dass alle introtexte angezeigt werden. Leider kommt aber dieser Code nicht in Frage, da er das Passwort der Datenbank in sich trägt.
 
OP
Y

Yehudi

Guru
Oh nein, dann funktioniert dieser Code problemlos. Danke. Den Einzigen Nachteil, den der Code hat ist das Passwort, das wwwird bei dieser anderen Geschichte nicht verlangt, aber die bekomme ich gar nicht zum Laufen.
 

beleg

Member
Das Passwort musst Du aber irgendwo angeben, da die Datenbank in jedem Fall danach fragt. Aber Du solltest für die Datenbank einen Benutzer anlegen, der eingeschränkte Rechte hat.
Du musst bei dem anderen Code mal gucken, da wird auch irgendwo das Passwort sein, aber in einer anderen Datei. Verdammt, ich wollte mir Joomla ja noch anschauen, bin ich irgendwie wieder völlig von abgekommen. Naja irgendwo gibt es da eine Klasse, in der die Datenbankabfrage definiert ist. da steht es wahrscheinlich drin.
Aber der Code funktioniert deswegen nicht, weil Du zwar alle Datensätze abfragst, aber nur einen dann ausgibst, den letzten üblicherweise. Willst Du alle Datensätze ausgeben, brauchst Du dafür eine Schleife, wie in der funktionierenden Abfrage.
Also in etwa:
Code:
<?php       
$id = mosGetParam( $_REQUEST, 'id' );

if ($id) {
    $sql = 'SELECT introtext FROM `jos_content` ORDER BY `introtext` ASC LIMIT 0, 30 ';
    $database->setQuery( $sql);
    while($database->loadObject( $row )){
    echo "<div class='grey'>" . $row->introtext . "</div>";
    }
}
?>
Willst Du allerdings nur einen bestimmten Datensatz ausgeben, brauchst Du wieder eine Bedingung:
Code:
<?php       
$id = mosGetParam( $_REQUEST, 'id' );

if ($id) {
    $sql = 'SELECT introtext FROM `jos_content` ORDER BY `introtext` WHERE [Bedingung];
    $database->setQuery( $sql);
    $database->loadObject( $row );
    echo "<div class='grey'>" . $row->introtext . "</div>";
}
?>
 
OP
Y

Yehudi

Guru
Hallo beleg,

mit der Datenbankabfrage die mir eher etwas sql-lastiger, aber kürzer erscheint wird es bei Joomla wohl umgangen, oder so. Scheinbar habe ich aber mit der die größeren Probleme, denn die mit der Fehleranzeige war eigentlich relativ einfach zu verstehen.
Ich werde mir das morgen noch mal zu Gemüte führen. Dennoch bin ich selber erstaunt, dass ich die Seite tatsächlich so hinbekomme, wie sie als statische html-Seite läuft. Vor einem Monat habe ich mit php/mysql/Joomla/css erst angefangen, und hätte beinahe nach zwei Tagen die Flinte ins Korn geworfen. Gut das ich das nicht getan habe.

Kannst Du ein übersichtliches Buch empfehlen, mit php Codes?
 
OP
Y

Yehudi

Guru
Guten Morgen beleg,

ich haben ihn jetzt so:

Code:
<?php        
$id = mosGetParam( $_REQUEST, 'id' );
  
if ($id) {
     $sql = "SELECT introtext FROM `jos_content` ORDER BY `introtext` WHERE id='$id'";
     $database->setQuery( $sql);
     $database->loadObject( $row );
     echo "<div class='grey'>" . $row->introtext . "</div>";
}
?>

Er zeigt leider nichts an. ORDER BY `introtext` rausgeworfen, und sql gegen query getauscht. Aber auch das bringt keinen Erfolg.

Wie gesagt mit dem anderen mit Passwort klappt es.
 

beleg

Member
Das Sortieren kannst Du in diesem Fall dann weglassen, weil Du ohnehin nur einen Datensatz ausgibst. Also:
Code:
$sql = "SELECT introtext FROM `jos_content` WHERE id='$id'";
Das Passwort ist jetzt noch die Frage. Kannst Du herausfinden, wo in Joomla Dein Passwort für mysql steht, bzw. welche anderen Dateien mit diesem Script noch zu tun haben?
 
OP
Y

Yehudi

Guru
Code:
$sql = "SELECT introtext FROM `jos_content` WHERE id='$id' ORDER BY `introtext` ";

Habe ich jetzt ausprobiert, und mit ASC wie oben dann in der Zeile Schrittweise erweitert, und jeweils getestet.

Leider ohne Erfolg.
 

beleg

Member
Wie gesagt, das ORDER BY brauchst Du da nicht. Die Abfrage an sich sieht richtig aus, nur die Verbindung zur Datenbank stimmt in dem Fall nicht. Gibt PHP denn irgendwelche Fehlermeldungen aus?
 
OP
Y

Yehudi

Guru
ORDER BY habe ich auch schon weggelassen, es treten auch keine Fehlermeldungen auf, alles schön ohne jeglichen Text oder sonst was.
Könnte man diesen Code eigentlich auch eine solche Abfrage hinzufügen, wie dem anderen Code?

Info:
Die Datenbankabfrage funktioniert nur in Verbindung in der Form, wie auch die Datumsabfrage aussieht nur mit Joomla, wenn ich ohne Joomla den Code mit dem Datum abfrage bekomme ich ein Fatalerror, bei dem Code in dem das Passwort sich befindet. erhalte ich Verbindung zur Datenbank erfolgreich. Vermutlich wird hier das im Backend benutzte Passwort verwendet, um die Datenbank abzufragen.
 

beleg

Member
Also auf jeden Fall fehlt in dem Codestück wohl noch das
Code:
global $database;
Ansonsten wüsste ich im Moment auch nicht, wo's hakt.
 
OP
Y

Yehudi

Guru
Hallo beleg,

das Code stück hat sich nur übers Netz versendet, das war natürlich da. Ich habe da jetzt mal gebastelt, nach dem Motto "Aus zwei mach eins." Ich habe das Beste aus beiden Codes genommen. Beim ersten funktioniert es ja problemlos, aber da habe ich am Anfang die Passwortabfrage. Beim zweiten umgehe ich diese Passwortabfrage, bzw. das Passwort steht dort nicht in der Datei. Also habe ich den Anfang genommen, und beim anderen das Ende. Das hat zwar nicht gleich geklappt, es gab erst unten eine Fehlermeldung aber mit Anzeige, und das motivierte mich zum weitermachen. Dann waren noch ein paar Felhlermeldungen, bis es schließlich klappte.

Das Ergebnis sieht so aus:

Code:
<?php
global $database;

$id = mosGetParam( $_REQUEST, 'id' );

$query = "SELECT introtext FROM `jos_content` WHERE id='$id'";
$result = mysql_query($query) or die("Anfrage fehlgeschlagen: " . mysql_error());

/* Ausgabe der Ergebnisse in HTML */
echo "<table>\n";
while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
   echo "\t<tr>\n";
   foreach ($line as $col_value) {
       echo "\t\t<td>$col_value</td>\n";
   }
   echo "\t</tr>\n";
}
echo "</table>\n";

/* Freigeben des Resultsets */
mysql_free_result($result);

?>

Ich habe einige überflüssige Sachen versucht wegzunehmen, z.B. bei Anfrage fehlgeschlagen, aber das mochte der Code auch nicht. Was kann ich da wirklich wegnehmen?

Die Sachen mit /* sind mir klar, das habe ich erstmal als Orientierung dringelassen.
 

beleg

Member
Kann eigentlich an sich so bleiben, würde ich mal sagen. Obwohl ich die Fehlermeldung "Anfrage fehlgeschlagen..." wahrscheinlich auch weglassen würde. Die Zeile sieht dann so aus:
Code:
$result = mysql_query($query);
Die Kommentare lass ruhig drin, die erleichtern die Übersicht.
 
OP
Y

Yehudi

Guru
Hallo bleg,

das habe ich jetzt rausgeschmissen. Danke Dir. Nun stelle ich aber dadurch bedingt auch noch eine Problematik fest, und zwar, wird die Grauzone von home auch im Inhaltsverzeichnis von "News" aufgeführt. Das betrifft also Seiten, die eine Auflistung von Titeln des Bereiches haben. Überverzeichnis= section Inhaltsverzeichnis = category / News=Content.
Könnte man dort in den Code eine Bedinnung einfügen, die sobald es sich um eine Abfrage für category handelt, das ausblendet?

(home ist bei mir die direkte Biografieseite)
 

beleg

Member
Ja, das geht. Du packst den Code einfach noch in einen if-Block. Also:
Code:
if([Bedingung]){
[der ganze andere Code]
}
Dann wird das nur unter der entsprechenden Bedingung ausgeführt. Wie die Bedingung genau aussehen muß, kann ich so im Moment nicht überblicken. Es kann auch sein, daß nur der Bereich des Codes, in der letztendlich die Ausgabe steht, in die if-Abfrage gehört.
 
OP
Y

Yehudi

Guru
Aha, dann müßte bei Nichterfüllen das aber einen Negativen Wert bekommen, damit die Regel erfüllt ist.
Oder die Beiträge sind ja alles contents, ich müßte also etwa so tippen:

Code:
if ($jos_content) {
     $sql = "SELECT introtext FROM `jos_content` WHERE jos_content='$jos_content'"; ){
[der ganze andere Code]
}

Werde das gleich mal testen.
 
OP
Y

Yehudi

Guru
Ich glaube ich bekomme es nicht hin.

ich habe das mal nur an dem Ausgangscode mit der Fehleranzeige ausprobiert. content oder jos_content kann ich irgendwie nicht als Bedinung hinbekommen. Ich habe das mal gegen id ausgetauscht. Aber irgendwie klappt es nicht, weil das die gesammte Tabelle betrifft. In der Datenbank ist dies aber so angegeben.
 

beleg

Member
Du müsstest mal gucken, was auf den Seiten, bei denen es nicht angezeigt werden soll, an Variablen übergeben wird und wo dabei die Unterschiede zu den Seiten sind, bei denen es angezeigt werden soll. Aus einem solchen Unterschied kann man dann eine Bedingung bauen.
Ist z.B. auf so einer Übersichtsseite die Variable $id oder $jos_content nicht gesetzt, dann lässt sich das verwenden. Oder haben sie in so einem Fall bestimmte Werte, auch dann lässt sich da was draus machen.
 
OP
Y

Yehudi

Guru
Hallo beleg,

Ich werde mich mal an die Haupt index.php Seite (also nicht die aus dem template, an der ich fleißig rumdoktor) machen, und mal schauen, was ich dort finde.
 
Oben