anpera.net https://anpera.dyndns.org/phpbb3/ |
|
sql SELECT... https://anpera.dyndns.org/phpbb3/viewtopic.php?f=25&t=3531 |
Seite 1 von 1 |
Autor: | Welv [ Sa 31 Mär, 2007 00:10 ] |
Betreff des Beitrags: | sql SELECT... |
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] |
Autor: | Harthas [ Sa 31 Mär, 2007 00:41 ] |
Betreff des Beitrags: | |
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. |
Autor: | Welv [ Sa 31 Mär, 2007 00:49 ] |
Betreff des Beitrags: | |
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 -.- |
Autor: | Harthas [ Sa 31 Mär, 2007 00:53 ] |
Betreff des Beitrags: | |
[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. |
Autor: | Welv [ Sa 31 Mär, 2007 00:55 ] |
Betreff des Beitrags: | |
Vielen Dank, nun geht es. Nu kann ich in ruhe schlafen gehen ^^ |
Autor: | Harthas [ Sa 31 Mär, 2007 01:00 ] |
Betreff des Beitrags: | |
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. |
Autor: | Welv [ Sa 31 Mär, 2007 10:01 ] |
Betreff des Beitrags: | |
Speicher leere, hört sich schon mal gut an. Danke |
Autor: | Welv [ Sa 31 Mär, 2007 14:02 ] |
Betreff des Beitrags: | |
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. |
Autor: | Kevz [ Sa 31 Mär, 2007 14:27 ] |
Betreff des Beitrags: | |
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... |
Autor: | Cayaste [ Sa 31 Mär, 2007 15:05 ] |
Betreff des Beitrags: | |
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. ![]() |
Autor: | Harthas [ Sa 31 Mär, 2007 15:13 ] |
Betreff des Beitrags: | |
Natürlich kann man das ;-) Nur brächte das hier in diesem Falle wohl nicht sonderlich viel *g* |
Autor: | Welv [ Sa 31 Mär, 2007 15:35 ] |
Betreff des Beitrags: | |
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] |
Autor: | Cayaste [ Sa 31 Mär, 2007 15:41 ] |
Betreff des Beitrags: | |
Vergiß die Sicherheitsabfrage nicht, wenn zwei User gleichzeitig versuchen ein Zimmer zu mieten... ![]() |
Autor: | Welv [ Sa 31 Mär, 2007 15:44 ] |
Betreff des Beitrags: | |
stümmt, wäre sinnvoll *G* |
Autor: | Kevz [ Sa 31 Mär, 2007 16:24 ] |
Betreff des Beitrags: | |
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] |
Autor: | Welv [ Sa 31 Mär, 2007 16:26 ] |
Betreff des Beitrags: | |
oh, danke. hab zwar schon etwas das funzt, aber deins sieht schöner aus ^^ |
Autor: | Kevz [ Sa 31 Mär, 2007 16:28 ] |
Betreff des Beitrags: | |
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. |
Autor: | Welv [ Sa 31 Mär, 2007 16:32 ] |
Betreff des Beitrags: | |
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] |
Seite 1 von 1 | Alle Zeiten sind UTC + 1 Stunde |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |