MySql abfrage mit 2 tabellen gleichzeitig aber wie ?

harderph

Erfahrenes Mitglied
Moinsen

Ich wollte eine db-abfrage machen wo der dann aus zwei tabellen liest! Und auch vergleichen soll z.b. tabelle 1 hat id wie tabelle 2 in ein sind z.b. News und in der zweiten der user! Durch die abfrage soll per id abgerufen werden wer das geschrieben hat!
Hier mal mein schnipsel
PHP:
SELECT * FROM tabelle1, tabelle2 WHERE tabelle1.id = tabelle2.id=".$_GET['id']."
Hier soll es mit der url übergeben werden also id=15 dann soll der user mit der id 15 angezeigt werden und die news die er geschrieben hat!
fehlermeldung bekomme ich auchnicht! Wenn ich es ausrufe dann kommt garnichts
Ich hoffe ich konnte mich verständlich ausdrücken denn mit erklären hab ich es nicht so! gesucht habe ich auch schon aber ich weiss nihct nach welchen begriffen ich suchen soll!
 
Sieht schon gar nicht schlecht aus dein SQL Statement, aber ein kleiner Patzer.

Du kannst in der WHERE Bedingung nur 2 Spalten mit einem = verknüpfen, weitere Bedingungen müssen mit AND erfolgen.

Sprich dein Beispiel sieht dann so aus:

SELECT * FROM tabelle1, tabelle2 WHERE tabelle1.id = tabelle2.id AND tabelle1.id =".$_GET['id']."

Angemerkt werde sollte noch, dass du nicht direkt Werte aus dem $_REQUEST, sprich bei dir $_GET in einem SQL Statement verwendet solltest - Stichwort SQL Injection. Vorher den Wert der ID prüfen, sonst machen böse User schnell böse Sachen mit deiner Datenbank.
 
PHP:
// prüf, ob $_GET['id'] gesetzt ist und nur Ziffern beinhaltet
if (isset($_GET['id']) && ctype_digit((string) $_GET['id'])) {
    $id = (int) $_GET['id'];
    // sql, etc
} else {
    // keine oder inakzeptabe ID
}

Dein SQL-Statement kann man übrigens noch verbessern, was Fehlersicherheit und Geschwindigkeit angeht, da zur Zeit ein karthesisches Produkt aus sämtlichen Einträgen der Tabelle 1 und 2 erzeugt wird, also t1 x t2. Der Equijoin selektiert dann erst alle Datensätze. Performanter geht es höchstwahrscheinlich über ein linkes Anfügen der zweiten Tabelle:
SQL:
SELECT
    `tabelle1`.*, `tabelle2`.*
FROM
    `tabelle1`
LEFT JOIN
    `tabelle2` ON `tabelle1`.`id` = `tabelle2`.`id`
WHERE
    `tabelle1`.`id` = '{$id}';

Des Weiteren sollte überlegt werden, ob wirklich alle Spalten von Relevanz sind bei der Selektion...
 
Irgendwie muss man an vom Client übergebene Argumente kommen, und das ist gewöhnlich in PHP via HTTP Get oder HTTP Post oder via Cookies machbar. StormYus hat das eventuell ein wenig unglücklich formuliert - Du kannst und musst in deinem Fall schon via $_GET arbeiten, aber die Art und Weise, wie du $_GET['id'] zB verwendest, ist nicht allzu sicher. So können einfach Metazeichen und was nicht alles übergeben werden, und das direkt an die Datenbank. Deshalb auch mein Vorschlag, die ID auf "nur Ziffern" zu überprüfen.
 
Sorry der letzte eintrag ist nicht gewollt da hab ich versehendlich aktuallesiert! Also ich übergebe ja die id eines users über die url zur anderen seite und jetzt wo ihr sagt das es nicht sicher sei möchte ich es ja auch sicher haben! Wie kann ich den jetzt die id übergeben ohne das sie auf der url auftaucht! Mit formular geht das ja auch aber ich habe ja kein formular und anderes hab ich mich auch garnicht beschaftigt um ehrlich zu sein!
Und danke maeTimmae !
Noch einfrage dazu! kannman auch andere sicherheits parameter setzen und vorallem wo?
 
Die wohl simpelste Lösung in Sachen SQL-Injenction-Vorbeugung ist die Verwendung der PHP-Funktionen [phpf]mysql_escape_string[/phpf] und [phpf]mysql_real_escape_string[/phpf] - Zur Verwendung und Hinweisen einfach mal anklicken.

Somit werden zB Anführungszeichen und dergleichen escaped. Vorher hätte $_GET['id'] mit dem Wert ' OR 1 != ' Folgendes ergeben:
SQL:
SELECT *
FROM `t1`
WHERE `t1`.`id` = '' OR 1 != ''
Wenn nun mysql_real_escape_string zum Einsatz kommt, ergibt sich dann dieses Query:
SQL:
SELECT *
FROM `t1`
WHERE `t1`.`id` = '\' OR 1 != \''

Jedoch ist die Funktion übertrieben, wenn man lediglich mit einem kleinen zu erwartenden Zeichenvorrat arbeiten möchte, wie zB Integerwerten oder Fließkommazahlen. Hier bietet sich entweder ein Regulärer Ausdruck (siehe [phpf]preg_match[/phpf]), eine [phpf]ctype[/phpf] Funktion oder das einfache Typecasting via (int) oder (float) an:
PHP:
$sql = "SELECT * FROM `t1` WHERE `t1`.`id` = '" . (int) $_GET['id'] . "';";

Generell ist man aber immer auch gut bedient und auf der sicheren Seite mit den Escape-Funktionen ;)
 
Ohman danke für den sehr sehr guten tipp!
Na das wäre ja was geworden! Ich werdemich mal aber schlauer machen! Grossen dank !

Ichhabe da jetzt zwei prüfungen gemacht die ich sicher finde einmal wenn man ein falschen wert eingibt und wenn die id nicht gibt ! Vonn allein wäre ich darauf ja garnihct gekommen! Grossen dank nochmal!
 
Zurück