anpera.net

anpera.net

experimental server @home
Aktuelle Zeit: Di 10 Jun, 2025 22:27

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 18 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: sql SELECT...
BeitragVerfasst: Sa 31 Mär, 2007 00:10 
Offline
Profi
Profi

Registriert: Mo 30 Okt, 2006 21:29
Beiträge: 195
Irgendwie verwirrt micht die JOIN Funktion und ich bekomm nicht wirklich das hin, was ich brauche, weshalb ich hier um diese paar Zeilen bitte.

Ich habe zwei tabellen. Zum einne die `accounts` die ihr kennt und
`zimmer` mit 'id', 'owner', 'guest'

in 'owner' und 'guest' wird jeweils eine 'acctid' gespeichert

nun sollen nur die zimmer aufgelistet werden, in denen man entweder 'owner' oder 'guest' ist.

mit ner sql abfrage und for schleife hab ichs schon hinbekommen, dass die zimmernummer, die owner id und die guest id aufscheint, aber ich hätte gerne dass da die namen drinnen stehen.

könnt mir wer dabei bitte helfen?

Hier mal der vorläufige Code

[php]
if($_GET[op]=="betreten"){
$sql = "SELECT * FROM zimmer WHERE owner=".$session[user][acctid]." OR guest=".$session[user][acctid]." ORDER BY id,owner,guest";
$result = db_query($sql);

if(db_num_rows($result)<1){
output("Du hast weder einen Schlüssel, noch eine Einladung zu einem Zimmer");
addnav("Zurück","village.php");
} else {
output("Zimmer betreten:`n");
output("<table cellpadding='3' cellspacing='0' border='0'>",true);
output("<tr class='trhead'><td>Zimmernummer</td><td>Mieter</td><td>Gast</td></tr>",true);
for ($i=0;$i<db_num_rows($result);$i++){
$row = db_fetch_assoc($result);
output("<tr class='".($i%2?"trlight":"trdark")."'><td><a href='zimmer.php?op=betreten2&zimmer=".HTMLEntities($row['id'])."&owner=".HTMLEntities($row['owner'])."&guest=".HTMLEntities($row['guest'])."'>",true);
output($row[id]);
output("</a></td><td>",true);
output($row[owner]);
output("</td><td>",true);
output($row[guest]);
output("</td></tr>",true);
addnav("","zimmer.php?op=betreten2&zimmer=".HTMLEntities($row['id'])."&owner=".HTMLEntities($row['owner'])."&guest=".HTMLEntities($row['guest'])."");
}
}
}
[/php]


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa 31 Mär, 2007 00:41 
Offline
Freak
Freak

Registriert: So 29 Jan, 2006 09:41
Beiträge: 1927
Wohnort: Schweiz
Geschlecht: Männlich
Skype: louis.huppenbauer
Einen Hinweis ;-)

HTML-Entities auf einen integeren Datentyp anwenden, bringt dir nicht viel *g*. Kann als da getrost raus.
Nun zu deinem Problem. Wenn du nur einen Namen bräuchtest, wäre es einfach ^^'. Dann könnte ich dir auch gut helfen. Aber hier brauchst du ja zwei unterschiedliche Namen... Ich würde behaupten, dass es mit Sicherheit einfacher wäre, diese zusätzlich noch aus der Datenbank zu holen. Also mit zwei eigenen SQL-Abfragen.

[php]if($_GET['op']=="betreten")
{
$sql = "SELECT * FROM zimmer WHERE owner=".$session['user']['acctid']." OR guest=".$session['user']['acctid']." ORDER BY id,owner,guest";
$result = db_query($sql) or die(sql_error(LINK));

if(db_num_rows($result)<1){
output("Du hast weder einen Schlüssel, noch eine Einladung zu einem Zimmer");
addnav("Zurück","village.php");
}
else
{
output("Zimmer betreten:`n");
output("<table cellpadding='3' cellspacing='0' border='0'>",true);
output("<tr class='trhead'><td>Zimmernummer</td><td>Mieter</td><td>Gast</td></tr>",true);
for ($i=0;$i<db_num_rows($result);$i++)
{
$row = db_fetch_assoc($result);

$sql1 = "SELECT `name` AS `besitzer` FROM `accounts` WHERE `acctid` LIKE ".$row['owner'].";";
$sql1 .= " SELECT `name` AS `gast` FROM `accounts` WHERE `acctid` LIKE ".$row['guest'].";";
$result1 = db_query($sql1) or die(sql_error(LINK));
$row1 = db_fetch_assoc($result1);

output("<tr class='".($i%2?"trlight":"trdark")."'> <td> <a href='zimmer.php?op=betreten2&zimmer=".$row['id']."&owner=".$row['owner']."&guest=".$row['guest']."'>",true);
output($row['id']);
output("</a></td><td>",true);
output($row1['besitzer']);
output("</td><td>",true);
output($row1['gast']);
output("</td></tr>",true);
addnav("","zimmer.php?op=betreten2&zimmer=".$row['id']."&owner=".$row['owner']."&guest=".$row['guest']."");

db_free_result($result1);
}
db_free_result($result);
}
} [/php]

Ja, es ist alles andere als schön. Aber es sollte funktionieren.
Ob es auch über ein INNER JOIN oder dergleichen zu lösen ist, kann ich nicht sagen. Und falls doch, wüsste ich nicht, ob es wirklich sinnvoll wäre, beziehungsweise, ob dies hier nicht sogar doch schneller sein würde.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa 31 Mär, 2007 00:49 
Offline
Profi
Profi

Registriert: Mo 30 Okt, 2006 21:29
Beiträge: 195
Harthas hat geschrieben:
Einen Hinweis ;-)


Nun zu deinem Problem. Wenn du nur einen Namen bräuchtest, wäre es einfach ^^'. Dann könnte ich dir auch gut helfen. Aber hier brauchst du ja zwei unterschiedliche Namen...


Genau das ist mein Prob. Hab Google und die Forensuche gequählt aber bin ned weit gekommen.


$this->bbcode_second_pass_code('', 'SELECT `name` AS `besitzer` FROM `accounts` WHERE `acctid` LIKE 1; SELECT `name` AS `gast` FROM `accounts` WHERE `acctid` LIKE 3;

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '; SELECT `name` AS `gast` FROM `accounts` WHERE `acctid` LIKE 3' at line 1')

Danke, aber ich bekomm nur diese fehelrmeldung -.-


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa 31 Mär, 2007 00:53 
Offline
Freak
Freak

Registriert: So 29 Jan, 2006 09:41
Beiträge: 1927
Wohnort: Schweiz
Geschlecht: Männlich
Skype: louis.huppenbauer
[php]
if($_GET['op']=="betreten")
{
$sql = "SELECT * FROM zimmer WHERE owner=".$session['user']['acctid']." OR guest=".$session['user']['acctid']." ORDER BY id,owner,guest";
$result = db_query($sql) or die(sql_error(LINK));

if(db_num_rows($result)<1){
output("Du hast weder einen Schlüssel, noch eine Einladung zu einem Zimmer");
addnav("Zurück","village.php");
}
else
{
output("Zimmer betreten:`n");
output("<table cellpadding='3' cellspacing='0' border='0'>",true);
output("<tr class='trhead'><td>Zimmernummer</td><td>Mieter</td><td>Gast</td></tr>",true);
for ($i=0;$i<db_num_rows($result);$i++)
{
$row = db_fetch_assoc($result);

$sql1 = "SELECT `name` AS `besitzer` FROM `accounts` WHERE `acctid` LIKE ".$row['owner'].";";
$sql2 = "SELECT `name` AS `gast` FROM `accounts` WHERE `acctid` LIKE ".$row['guest'].";";
$result1 = db_query($sql1) or die(sql_error(LINK));
$result2 = db_query($sql2) or die(sql_error(LINK));
$besitzer = db_fetch_assoc($result1);
$gast = db_fetch_assoc($result2);

output("<tr class='".($i%2?"trlight":"trdark")."'> <td> <a href='zimmer.php?op=betreten2&zimmer=".$row['id']."&owner=".$row['owner']."&guest=".$row['guest']."'>",true);
output($row['id']);
output("</a></td><td>",true);
output($besitzer['besitzer']);
output("</td><td>",true);
output($gast['gast']);
output("</td></tr>",true);
addnav("","zimmer.php?op=betreten2&zimmer=".$row['id']."&owner=".$row['owner']."&guest=".$row['guest']."");

db_free_result($result1);
}
db_free_result($result);
}
} [/php]


Wir verzweifeln noch nicht ;-)
Versuchs mal so.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa 31 Mär, 2007 00:55 
Offline
Profi
Profi

Registriert: Mo 30 Okt, 2006 21:29
Beiträge: 195
Vielen Dank, nun geht es.
Nu kann ich in ruhe schlafen gehen ^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa 31 Mär, 2007 01:00 
Offline
Freak
Freak

Registriert: So 29 Jan, 2006 09:41
Beiträge: 1927
Wohnort: Schweiz
Geschlecht: Männlich
Skype: louis.huppenbauer
Keine Ursache ;-)

Wenn du es noch ein bisschen korrekter haben möchtest, dann füg nach:
[php]db_free_result($result1);[/php]
Folgendes ein:
[php]db_free_result($result2);[/php]

Falls du nicht weisst, was db_free_result macht (Ist die LoGD-Wrapper-Funktion für mysql_free_result), kannst du dich Hier etwas genauer darüber informieren. ;-)

Es ist für die Funktionsweise zwar nicht wichtig, schont aber den Server.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa 31 Mär, 2007 10:01 
Offline
Profi
Profi

Registriert: Mo 30 Okt, 2006 21:29
Beiträge: 195
Speicher leere, hört sich schon mal gut an. Danke


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa 31 Mär, 2007 14:02 
Offline
Profi
Profi

Registriert: Mo 30 Okt, 2006 21:29
Beiträge: 195
eine frage hätt ich noch.

ich hab hier die tabelle `zimmer` mit 'id', 'owner', 'guest'

bei 'id' wird die nächst höhere nummer automatisch vergeben.

da aber häufig die zimmer gelöscht werden und ich dann damit schnell auf hohe ids komme,
würd ich gerne beim INSERT die "kleinste freie id" vergeben.

Hab zwar schon ein paar Sachen in der Richtung gefunden, aber es sit bei mir nie was rausgekommen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa 31 Mär, 2007 14:27 
Offline
Freak
Freak

Registriert: Mo 06 Sep, 2004 15:17
Beiträge: 3236
Geschlecht: Männlich
Jaein, ich würde nicht unbedingt empfehlen die ID's zu verändern. Du kannst dir zwar anhand Per for-Schleife (Pre-Inkrement) die kleinste Zimmernummer raussuchen. Aber ist halt aufwendiger nur die Nummer rauszusuchen...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa 31 Mär, 2007 15:05 
Offline
Newbie
Benutzeravatar

Registriert: Sa 31 Mär, 2007 14:51
Beiträge: 4
Sagen wir so; es kommt darauf an, wie oft die Zimmer geschrieben bzw. gelöscht werden.
Wenn man freie IDs speichert und überschreiben läßt, hat man natürlich immer das Sicherheitsrisiko, dass zwei User gleichzeitig versuchen die selbe ID zu schreiben und dementsprechend einer von beiden ins Hintertreffen gerät, da einer der beiden Datensatz damit gezwungenermaßen flöten ist. Es wird also auf jeden Fall eine Sicherheitsabfrage nötig - (je mehr User gleichzeit auf dem Server sind, desto aufwendiger wird es zwangsläufig zu gewährleisten, dass o.g. Fall nicht eintritt).

Auf der anderen Seite widerum hat das System natürlich auch seine Vorteile, da sich die Datenbank auf Dauer einfach kleiner und übersichtlicher hält und sich die Gefahr toter Datensätze verringert.


(Man kann übrigens auch problemlos ohne JOIN mehrer Datenbanken in einer Abfrage aufrufen, wenn man ihm explizit beibringt, welchen Datensatz er aus welcher Datenbank lesen soll. ;) )


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa 31 Mär, 2007 15:13 
Offline
Freak
Freak

Registriert: So 29 Jan, 2006 09:41
Beiträge: 1927
Wohnort: Schweiz
Geschlecht: Männlich
Skype: louis.huppenbauer
Natürlich kann man das ;-)

Nur brächte das hier in diesem Falle wohl nicht sonderlich viel *g*


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa 31 Mär, 2007 15:35 
Offline
Profi
Profi

Registriert: Mo 30 Okt, 2006 21:29
Beiträge: 195
ich habs mal anders gelöst um die lücken zu füllen...

wenn man ein zimmer verlässt wird nicht mehr die komplette zeile gelsöcht, sondern 'owner' und 'guest' einfach auf 0 gesetzt

bei der nächsten zimmervergabe...
[php]
$sql = "SELECT id FROM zimmer WHERE owner=0 AND guest=0 ORDER BY id";
$result = db_query($sql) or die(sql_error(LINK));
$row = db_fetch_assoc($result);
$id = $row[id];
if($id) {
$sql = "UPDATE zimmer SET owner=".$session['user']['acctid'].", guest=".$_GET[acctid]." WHERE id=".$id."";
db_query($sql);
}else{
$sql = "INSERT INTO zimmer(owner,guest) VALUES (".$session['user']['acctid'].",".$_GET[acctid].")";
db_query($sql);
}
[/php]


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa 31 Mär, 2007 15:41 
Offline
Newbie
Benutzeravatar

Registriert: Sa 31 Mär, 2007 14:51
Beiträge: 4
Vergiß die Sicherheitsabfrage nicht, wenn zwei User gleichzeitig versuchen ein Zimmer zu mieten... ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa 31 Mär, 2007 15:44 
Offline
Profi
Profi

Registriert: Mo 30 Okt, 2006 21:29
Beiträge: 195
stümmt, wäre sinnvoll *G*


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa 31 Mär, 2007 16:24 
Offline
Freak
Freak

Registriert: Mo 06 Sep, 2004 15:17
Beiträge: 3236
Geschlecht: Männlich
Hier schonmal kleiner Ansatz meinerseits:
[php]<?php
$sql = 'SELECT `id` FROM `zimmer` WHERE `owner` = "0" AND `guest` = "0" ORDER BY `id`';
$result = db_query( $sql ) or die(db_error( $sql ));

if ( db_num_rows( $result ) ) {
$row = db_fetch_assoc($result);

$_sql = 'INSERT INTO `zimmer` (`owner`, `guest`) VALUES ("'.$session['user']['acctid'].'", "'.$_GET['acctid'].'")
ON DUPLICATE KEY UPDATE `owner` = "'.$session['user']['acctid'].'", `guest` = "'.$_GET['acctid'].'" WHERE `id` = '.(int)$row['id'];
db_query( $_sql ) or die(db_error( $_sql ));
}
db_free_result( $result );
?>[/php]


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa 31 Mär, 2007 16:26 
Offline
Profi
Profi

Registriert: Mo 30 Okt, 2006 21:29
Beiträge: 195
oh, danke.
hab zwar schon etwas das funzt, aber deins sieht schöner aus ^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa 31 Mär, 2007 16:28 
Offline
Freak
Freak

Registriert: Mo 06 Sep, 2004 15:17
Beiträge: 3236
Geschlecht: Männlich
Musst aber glaubig anpassen, was zumindest die WHERE Abfrage in der ersten SQL- Query betrifft, weil ohne direkten Ansatz welches Zimmer betroffen ist müsstest du es Per for-Schleife (Pre-Inkrement) alle ausgeben und direkt die SQL ausführen lassen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa 31 Mär, 2007 16:32 
Offline
Profi
Profi

Registriert: Mo 30 Okt, 2006 21:29
Beiträge: 195
also bei mir is es jetzt so...

[php]
$user = $session['user']['acctid'];
$sql = "SELECT * FROM zimmer WHERE owner=".$_GET[acctid]." AND guest=".$user." OR owner=".$user." AND guest=".$_GET[acctid]."";
$result = db_query($sql);
$row = db_fetch_assoc($result);
if(db_num_rows($result)) {
output("Ein zimmer reicht wohl für eich beide");
}
elseif($user == $_GET[acctid]) {
output("Wenn du nur ein zimmer für dich selbst brauchst, schau lieber in der Kneipe vorbei");

} else {
$sql = "SELECT id FROM zimmer WHERE owner=0 AND guest=0 ORDER BY id";
$result = db_query($sql) or die(sql_error(LINK));
$row = db_fetch_assoc($result);
$id = $row[id];
if($id) {
$sql = "UPDATE zimmer SET owner=".$user.", guest=".$_GET[acctid]." WHERE id=".$id."";
db_query($sql);
}else{
$sql = "INSERT INTO zimmer(owner,guest) VALUES (".$user.",".$_GET[acctid].")";
db_query($sql);
}
output("Du bekommst einen Schlüssel");
}
addnav("Zimmer betreten","zimmer.php?op=betreten");
addnav("Zurück","village.php");
[/php]


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 18 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 23 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen
Du darfst keine Antworten zu Themen in diesem Forum erstellen
Du darfst deine Beiträge in diesem Forum nicht ändern
Du darfst deine Beiträge in diesem Forum nicht löschen
Du darfst keine Dateianhänge in diesem Forum erstellen

Suche nach:
Gehe zu:  
POWERED_BY
Deutsche Übersetzung durch phpBB.de
anpera.net - Impressum