Datenbankabfrage in Template?
Eingetragen von Uwe_B (61)
am 09.02.2010 - 15:05 Uhr in
am 09.02.2010 - 15:05 Uhr in
Hallo,
ich habe einer Template-Datei eine Datenbankabfrage hinzugefügt und für die Verbindung folgenden Code vorangestellt:
mysql_connect('localhost', 'user', 'pw');
mysql_select_db('dbname');
Da Drupal ja ohnehin eine Verbindung zur Datenbank hat, würde ich das gerne durch diese ersetzen, also über meine Daten in /default/settings.php laufen lassen. Leider habe ich keinen Plan wie das geht, ist doch vermutlich nur ein kurzer Code-Schnipsel, oder?
Gruß,
Uwe
- Anmelden oder Registrieren um Kommentare zu schreiben
Datenbank
am 09.02.2010 - 15:09 Uhr
Du musst keine gesonderte Verbindung zur Datenbank herstellen, da Drupal diese bereits vorhält.
Verwende einfach
db_query
.Ich bin mir allerdings nicht so sicher, ob Du das wirklich tun solltest, da Du offensichtlich keine Ahnung davon hast, was Du da eigentlich tust. Lies Dich bitte erst in die Grundlagen von Drupal ein, bevor Du damit weitermachst.
Stefan
--
Sei nett zu Deinem Themer!
Tipp: Beachte die Verhaltensregeln des DrupalCenter.
Es geht konkret um
am 09.02.2010 - 15:51 Uhr
Es geht konkret um folgendes, dies ist der von mir hinzugefügte Bereich in der Datei node-onlinespiel.php
<?php
// Sicherstellen, dass Seite als UTF-8 ausgeben wird
mysql_connect('localhost', 'user', 'pw');
mysql_select_db('dbname');
$q = "SELECT `username`, `score`, `when`
FROM `highscores`
WHERE `nid` = '" . mysql_real_escape_string($node->nid) . "'
ORDER BY `score` DESC
LIMIT 0,10";
$res = mysql_query($q);
if (mysql_num_rows($res) > 0) {
$i = 1;
while ($row = mysql_fetch_assoc($res)) {
echo htmlspecialchars(sprintf('%s. %s - %s Punkte - %s',
$i, $row['username'], $row['score'], $row['when']))
. '<br />';
$i++;
}
} else {
echo 'Keine Einträge für Spiel ' . htmlspecialchars($title);
} ?>
Den Code habe ich in einem anderen Forum dankenswerter Weise aufgezeigt bekommen.
Die Tabelle highscores habe ich vorher extra angelegt, die Übertragung der Daten funktioniert auch einwandfrei über eine Bridge die ich eingerichtet habe.
So wie der Code derzeit ausschaut werden die richtigen Daten ausgegeben, wenn auch die Sortierung der Punkte noch fehlerhaft ist (66 ist bspw. weiter oben als 615). Außerdem tauchen die Spieler noch mehrfach auf (jeder User soll natürlich nur mit seiner Höchstpunktzahl vertreten sein und nicht mit jeder erzielten Punktzahl). Wie ich diese beiden Punkte richtig einstelle versuche ich gerade zu klären. Falls es jemand weiß, kann er es natürlich auch gerne schreiben.
Nun möchte ich den besagten Bereich
mysql_connect('localhost', 'user', 'pw');
mysql_select_db('dbname');
gerne durch das angesprochene db_query ersetzen.
Ich gebe ja zu, dass ich nicht so richtig weiß, was ich da mache - zumindest ist mir die Grammatik noch ziemlich fremd. Aber ich denke mal da wird die Welt schon nicht von untergehen. Wenn ich mich vorher erst in die Grundlagen einlesen muss, dann bin ich damit vermutlich Tage beschäftigt. Dafür habe ich momentan leider keine Zeit. Also, lange Rede kurzer Sinn, was genau soll ich nun machen?
Gruß,
Uwe
Ist es doch schwieriger oder
am 10.02.2010 - 09:55 Uhr
Ist es doch schwieriger oder wäre es unverantwortlich es mir zu verraten?
Hallo nochmal, das
am 13.02.2010 - 12:51 Uhr
Hallo nochmal,
das Endprodukt sieht nun so aus:
mysql_connect('localhost', 'dbuser', 'pw');
mysql_select_db('dbname');
$q = "SELECT h.`userid`, MAX(h.`score`) AS `score`, h.`time`, u.`name`
FROM `highscores` h
LEFT JOIN `users` u
ON h.`userid` = u.`uid`
WHERE h.`nid` = " . (int) $nid . "
GROUP BY h.`userid`
ORDER BY `score` DESC
LIMIT 0,10";
$res = mysql_query($q);
if (mysql_num_rows($res) > 0) {
echo "<table><tr><th class='platz'>#</th><th class='spieler'>Spieler</th><th class='punkte'>Punkte</th><th class='datum'>Datum</th>";
$i = 1;
while ($row = mysql_fetch_assoc($res)) {
echo "<tr>";
echo "<td class='platz'>".$i.".</td><td class='spieler'><a href='/user/".$row['userid']."' title='".$row['name']."'>".$row['name']."</a></td><td class='punkte'>".$row['score']."</td><td class='datum'>".$row['time']."</td>";
echo "</tr>";
$i++;
}
echo "</tr></table>";
} else {
echo 'keine Highscores';
}
Wie kann ich das nun alles ohne die Eingabe meiner Daten über db_query lösen? Ich habe mich schon umgesehen, aber ehrlich gesagt verstehe ich es nicht. Wäre vielleicht jemand so freundlich es mir zu erklären?
Gruß,
Uwe
In welcher DB ist dann die Tabelle
am 13.02.2010 - 13:12 Uhr
Es kommt drauf an wo die Tabelle die du abfragen willst liegt. Ist sie innerhalb deiner Druapl DB geht das einfach mit db_query(). Ist die Tabelle aber in einer andern Datenbank musst du diesen Connect in der settings.php hinzufügen und dann vor der Abfrage die Verbindung wechseln.
Eine SQL-Abfrage wird mit
am 13.02.2010 - 13:13 Uhr
Eine SQL-Abfrage wird mit db_query/db_query_range (mit LIMIT) abgesetzt und mit db_fetch_object/db_fetch_array in einer while-Schleife eine einzelne Row herausgeholt.
Beispiel
<?php
$items = array()
$sql = "SELECT nid, title FROM {node} WHERE status = d%";
$query = db_query_range($sql, 1, 0, 10);
while($row = db_fetch_object($query)) {
$items[$row->nid] = $row->title;
}
echo theme('item_list', $items);
?>
Mehr Informationen unter http://api.drupal.org/api/group/database/6
----------------------------------------
Gelöste Forenbeiträge mit [gelöst] im Titel ergänzen
Das Verhältnis anderen zu helfen muss höher sein, als von anderen Hilfe zu erfragen/erwarten.
Gelöste Forenbeiträge mit [gelöst] im Titel ergänzen
Das Verhältnis anderen zu helfen muss höher sein, als von anderen Hilfe zu erfragen/erwarten.
Also die Tabelle habe ich in
am 14.02.2010 - 17:26 Uhr
Also die Tabelle habe ich in der Drupal-Datenbank angelegt, aber ich habe keine Ahnung von MySQL und Datenbankabfragen und bin froh, dass der oben angeführte Code überhaupt funktioniert. Ich versteh nur leider immer noch nicht, wie ich die Verbindung herstellen soll.
Datenbankverbindung
am 14.02.2010 - 18:02 Uhr
Ich versteh nur leider immer noch nicht, wie ich die Verbindung herstellen soll.
http://www.drupalcenter.de/node/25078#comment-89458
Tipp: Beachte die Verhaltensregeln des DrupalCenter.