[MySQL] - JOIN mit 2 Dropboxen und Textfeld (PHP)

  • SQL

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von shaebich.

    [MySQL] - JOIN mit 2 Dropboxen und Textfeld (PHP)

    Hi Leute, ich suche verzweifelt nach einer Lösung für mein Problem.

    Also ich habe mit MySQL / PHP ein Verwaltungswebinterface gebastelt (einfach aus just for fun) - möchte da jetzt Kundendaten eingeben, und diese Abrufen und Aufzählen bearbeiten und Löschen - geht alles, kein Problem!

    Mein Problem ist, dass ich aus 2 verschiedenen Tabellen in meiner Datenbank Datensätze auswählen möchte um ein Angebot z.b. erstellen zu lassen. Das ganze ist mit einer DropBox für den Namen (oder Nachnamen, Straße des Kunden zu finden) dann die 2. DropBox für die KFZ Pakete (Wachs, Nano). Die Übername der Kundendaten ins Musterformular lief einwandfrei. Sprich die Kundendaten werden anzeigt und auch die Kundennummer. Wenn ich jetzt die 2. Box einbaue, um die KFZ Pakte auszuwählen, sagt mir Mysql kann nix finden in der Tabelle "kunden" weil meine KFZ Daten in der Tabelle "pakete" liegen.

    Die Aktion mit JOIN will nicht so ganz fruchten, da ich ja die boxen und das Textfeld drin habe.

    SQL-Abfrage

    1. $query = "SELECT * FROM kunden where like $suchfeld = '$suchbegriff' JOIN pakete '$suchfeld2'";


    Da mecker er dann:

    SQL-Abfrage

    1. 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 'like 'kuname' = 'Michael' JOIN pakete 'paname'' at line 1


    Irgendwie fliegt da alles durcheinander? Habt ihr einen Tipp?

    Verschoben. ~Trade
    Ihr sucht Webspace für eure Projekte? Dann sagt bescheid - kostenfrei und ohne Werbung!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Trade“ ()

    Ich für meinen Teil bin Fan von ORMs, wenn es um MySQL in PHP geht.
    Das ORM kümmert sich um das MySQL und - im Falle von Eloquent - bin ich meistens sehr zufrieden mit dem generierten SQL.
    Eine Installationsanleitung findest du hier edzynda.com/use-laravels-eloquent-orm-outside-of-laravel/

    Prinzipiell halte ich die Verwendung eines Frameworks für PHP sinnvoll (Templating, Routing, ...), für ein einfaches Upgrade deines Projektes erscheint mir das aber mit Kanonen auf Spatzen geschossen.
    Eine umfangreiche Dokumentation für das Eloquent ORM findest du hier laravel.com/docs/5.1/eloquent und vielleicht überzeugt dich ja Laravel (eben ein solches Framework), aber wie gesagt, Kanone.

    chenjung schrieb:

    SQL-Abfrage

    $query = "SELECT * FROM kunden where like $suchfeld = '$suchbegriff' JOIN pakete '$suchfeld2'";


    hmm ich würde da glatt behaupten der JOIN ist falsch :D

    Ein JOIN sollte so aussehen:

    SQL-Abfrage

    1. SELECT *
    2. FROM tableA
    3. JOIN tableB ON tableB.Fremdschlüssel = tableA.PrimaryKey
    4. WHERE tableA.FieldX = 'Suchbegriff'


    mfg
    @Trade Danke

    @noBlubb: werde es mir mal ansehen

    @shaebich: Oha, du hast recht :D Mal ausmerzen, mal sehen ob es dann klappt :D Danke für den Tipp!

    Mein Kopf ... :D ich glaube ich bin fast am Ziel ich bleib am Ball xD

    Ich glaube ich verenne mich da mit den Boxen:

    SQL-Abfrage

    1. ​$query = "SELECT * FROM kunden JOIN pakete ON pakete.paname = kunden.kunr WHERE kunden.* '$suchfeld2' LIKE '$suchfeld' = 'Suchbegriff'";
    Ihr sucht Webspace für eure Projekte? Dann sagt bescheid - kostenfrei und ohne Werbung!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „chenjung“ ()

    chenjung schrieb:

    @Trade Danke

    @noBlubb: werde es mir mal ansehen

    @shaebich: Oha, du hast recht :D Mal ausmerzen, mal sehen ob es dann klappt :D Danke für den Tipp!

    Mein Kopf ... :D ich glaube ich bin fast am Ziel ich bleib am Ball xD

    Ich glaube ich verenne mich da mit den Boxen:

    SQL-Abfrage

    1. ​$query = "SELECT * FROM kunden JOIN pakete ON pakete.paname = kunden.kunr WHERE kunden.* '$suchfeld2' LIKE '$suchfeld' = 'Suchbegriff'";



    Hmm sieht immer noch falsch aus xD
    Ich glaube kaum das der paname = kundennummer ist.

    Wie ist denn die Relation zwischen Kunden und Pakete?
    Welche Tabellenfelder existieren.

    Ich glaube wir müssen hier dein Model korrigieren.
    Hi, also das ganze sieht jetzt so aus:

    Datenbank:
    kunden

    kunden
    - columns
    - - kunr
    - - kuname
    - - kuvorname
    - - kuort
    - pakete
    - columns
    - - paname
    - - pabesch
    - - papreis

    Also ganz falsch ist es wohl nicht, irgendwie kann ich aber den logischen Zusammenhange für JOIN nicht machen?

    Weil angeommen:
    SELECT *
    FROM tableA
    JOIN tableB ON tableB.Fremdschlüssel = tableA.PrimaryKey
    WHERE tableA.FieldX = 'Suchbegriff'

    Würde ja bedeuten:
    SELECT *
    FROM kunden <- Tabelle in der Datenbank kunden (Tabelle kunden)

    JOIN pakete <- JOIN also (rein Sprung?) in die tabelle pakete (in der DB kunden)

    ON pakete.paname = kunden.kunr <- paname ist in der Tabelle pakete (DB kunden)

    WHERE kunden.FieldX = 'Suchbegriff'

    Weil FiledX ? damit kann ich zur Zeit nichts anfangen? ^^

    kunden.kunr weil kunr = Primary ist in der Tabelle

    Ich danke dir für deine Hilfe (da ich so verplant bin) xD
    Ihr sucht Webspace für eure Projekte? Dann sagt bescheid - kostenfrei und ohne Werbung!
    Kenn mich mit SQL nicht so aus, aber du solltest dir mal das LIKE ansehen, das ist ein Vergleichsoperator - also nicht iwie LIKE a = bsondern a LIKE b
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais

    chenjung schrieb:

    Hi, also das ganze sieht jetzt so aus:

    kunden
    - columns
    - - kunr -> Primärschlüssel
    - - kuname
    - - kuvorname
    - - kuort




    pakete
    - columns
    - - paname -> Primärschlüssel
    - - pabesch
    - - papreis


    Also ganz falsch ist es wohl nicht, irgendwie kann ich aber den logischen Zusammenhange für JOIN nicht machen?


    hmm wenn du mich frägst ist das schon falsch...

    1. Ich kann dir wirklich nur raten eine Integer Spalte als Primärschlüssel zu verwenden und die Spalte paname Unique zu stellen, damit ersparst du dir ne Komplexität, da das Arbeiten mit Integer Werten im Datenbankbereich deutlich einfacher ist. (FINDE ICH).

    JETZT kommt definitiv ein Fehler, relationale Datenbanken:

    EIN Kunde kann doch EIN/MEHRERE Paket/e buchen oder etwa nicht?

    Wie stellst DU nun die relation zwischen Kunde und Paket her?
    Du benötigst eine zweite Tabelle in der mit Hilfe der jeweiligen Primärschlüssel eine Verbindung zwischen den beiden Tabellen hergestellt wird.

    z.B.

    Quellcode

    1. Kunde_Paket
    2. -columns
    3. --ID
    4. --ID_Kunde
    5. --ID_Paket


    so, nun steht eine Verbindung zwischen Kunde und Paket.

    Wenn du jetzt abfragen möchtest welcher Kunde welches Paket gebucht hat kannst du über die relation zwischen den Tabellen folgendermaßen mittels einem JOIN die Daten abfragen.

    SQL-Abfrage

    1. SELECT hier deine zu selektierenden Felder...
    2. FROM Kunde_Paket
    3. JOIN kunden ON kunden.ID = Kunde_Paket.ID_Kunde
    4. JOIN paket ON paket.ID = Kunde_Paket.ID_Paket
    5. WHERE kunden.NAME LIKE 'Mueller'






    Würde ja bedeuten:
    SELECT *
    FROM kunden <- Tabelle in der Datenbank kunden (Tabelle kunden)


    RICHTIG


    JOIN pakete <- JOIN also (rein Sprung?) in die tabelle pakete (in der DB kunden)
    ON pakete.paname = kunden.kunr <- paname ist in der Tabelle pakete (DB kunden)


    FALSCH, ein JOIN springt nicht in eine Tabelle. Man kann sich den JOIN als Verbindung vorstellen, welche über [b]2 gleiche[/b] Werte in den jeweiligen Zeilen der Tabelle mit einander Verbindet, wodurch du die jeweiligen Datensätze selektieren kannst.



    WHERE kunden.FieldX = 'Suchbegriff'

    Weil FiledX ? damit kann ich zur Zeit nichts anfangen?


    FieldX = FELD. Damit meinte ich eigentlich nur ein Feld wie z.B. kunden.NAME etc.
    Danke für deine Ausführliche Hilfe (das bringt völlig neue Sichtweisen!)

    Stimmt, deine Lösung mit der Tabelle Kunden + Pakten ist mir noch garnicht nicht den Sinn gekommen ^^ Danke.

    Kann ich dann dennoch die DropBoxen nutzen? Ja oder? (War ja für Suche Kunde + Auswahl Paket)

    DANKE für deine Hilfe ich werde später mal daran basteln ^^ Heute aber erstmal BDay feiern :D
    Ihr sucht Webspace für eure Projekte? Dann sagt bescheid - kostenfrei und ohne Werbung!

    chenjung schrieb:

    Danke für deine Ausführliche Hilfe (das bringt völlig neue Sichtweisen!)


    chenjung schrieb:

    Stimmt, deine Lösung mit der Tabelle Kunden + Pakten ist mir noch garnicht nicht den Sinn gekommen ^^ Danke.


    -> Kein Lösung...DIE Lösung ;)


    chenjung schrieb:

    Kann ich dann dennoch die DropBoxen nutzen? Ja oder? (War ja für Suche Kunde + Auswahl Paket)


    Klar kannst du die Daten immernoch an die ComboBoxen binden.

    chenjung schrieb:

    DANKE für deine Hilfe ich werde später mal daran basteln ^^ Heute aber erstmal BDay feiern :D


    Na dann mal herzlichen Glückwunsch :D
    Das Problem mit dem JOIN habe ich erstmal nach hinten geschoben, da ich alles andere erstmal überarbeite.

    Dabei kommt folgender Fehler, den ich mir nicht ganz erklären kann.

    Parse error: syntax error, unexpected end of file in D:\web\htdocs\auto\kunden_aendern2.php on line 58

    Aber in Zeile 58 wird der TAG <?php / ?> geschlossen, also ist die Fehlermeldung doch irgendwie wirr oder? Oder ich habe zu lange auf diesen Code geschaut ^^

    PHP-Quellcode

    1. <head>
    2. <meta http-equiv="Content-Language" content="de">
    3. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    4. <link rel="stylesheet" type="text/css" href="css/page.css">
    5. </head>
    6. <?php
    7. include ("db.php");
    8. // Verbindung zum Datenbankserver herstellen
    9. $link=mysql_pconnect($dbserver, $dbuser, $dbpasswd);
    10. if ($link == FALSE)
    11. {
    12. echo "<p><b>Leider kann keine Verbindung zur Datenbank hergestellt werden. Bitte
    13. versuchen Sie es später noch einmal.\n";
    14. echo "</BODY></HTML>\n"; // HTML Dokument abschliessen
    15. exit (); // PHP-Script beenden
    16. }
    17. // Datenbank auswaehlen
    18. $dblink=mysql_select_db($dbname);
    19. if ($dblink == FALSE)
    20. {
    21. echo "<p><b>Leider kann die Datenbank nicht geöffnet werden. Bitte
    22. versuchen Sie es später noch einmal.\n";
    23. echo "</BODY></HTML>\n"; // HTML Dokument abschliessen
    24. exit (); // PHP-Script beenden
    25. }
    26. $id=$_POST['id'];
    27. $kuvorname=$_POST['kuvorname'];
    28. $kunachname=$_POST["kunachname"];
    29. $kuanschrift=$_POST["kuanschrift"];
    30. $kuanzusatz=$_POST["kuanzusatz"];
    31. $kuplz=$_POST["kuplz"];
    32. $kuort=$_POST["kuort"];
    33. $kutelefon=$_POST["kutelefon"];
    34. $kumobil=$_POST["kumobil"];
    35. $kuemail=$_POST["kuemail"];
    36. $kukfz=$_POST["kukfz"];
    37. $kufahrzeug=$_POST["kufahrzeug"];
    38. $query = "UPDATE autoputzerkundendaten
    39. SET
    40. kuvorname='$kuvorname',
    41. kunachname='$kunachname',
    42. kuanschrift='$kuanschrift',
    43. kuanzusatz='$kuanzusatz',
    44. kuplz='$kuplz',
    45. kuort='$kuort',
    46. kutelefon='$kutelefon',
    47. kumobil='$kumobil',
    48. kuemail='$kuemail',
    49. kukfz='$kukfz',
    50. kufahrzeug='$kufahrzeug'
    51. id='$id';
    52. $result=mysql_query($query);
    53. mysql_close();
    54. ?>
    Ihr sucht Webspace für eure Projekte? Dann sagt bescheid - kostenfrei und ohne Werbung!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „chenjung“ ()

    chenjung schrieb:

    $kuvorname=$_POST['kuvorname'];
    $kunachname=$_POST["kunachname"];


    Mir ist da aufgefallen das du einmal mit einem Hochkomma arbeitest und dann mit 2 Hockomma

    ​ id='$id';


    Hier würde dann das Doppelte hockomma Fehlen

    PHP-Quellcode

    1. id='$id' ";​


    Hab jetzt leider kein Server hier um das zu testen.
    Ihr habt recht !! Wie blind kann ich denn bitte sein ?? :S

    Den Wald vor lauter Bäumen nicht gesehen ... Danke für euren Tipp. Spielt es denn eine rolle ob ' oder " mache?
    Ihr sucht Webspace für eure Projekte? Dann sagt bescheid - kostenfrei und ohne Werbung!
    Erstmal vielen lieben Dank an alle, die geholfen haben ! Ohne euch würde ich immer noch wie ein Ochse vor dem Berge stehen! <3

    Ich habe die " nun durch die ' ersetzt, dass das ganze einheitlich aussieht, aber es meckert immer noch ? O.o

    Notice: Undefined index: id in D:\web\htdocs\auto\kunden_aendern2.php on line 26

    Das Script wie gezeigt, ändert die bestehenden Kundendaten. Das Formular zuvor zeigt die Kundendaten, dort änder man was und klickt auf weiter, so kommt man dann auf dieses Script hier, welche die Daten in die Datenbank schreiben soll. Daher ist ID wichtig um den Kunden eindeutig zuzuordnen. Ähnlich wie im Script Kunden auflisten, dort wird in der Liste die ID, Name, Vorname usw. ausgegeben.

    Aber ID ist doch definiert? Ebenfalls in der Datenbank weil Primary Key.

    PHP-Quellcode

    1. <head>
    2. <meta http-equiv="Content-Language" content="de">
    3. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    4. <link rel="stylesheet" type="text/css" href="css/page.css">
    5. </head>
    6. <?php
    7. include ("db.php");
    8. // Verbindung zum Datenbankserver herstellen
    9. $link=mysql_pconnect($dbserver, $dbuser, $dbpasswd);
    10. if ($link == FALSE)
    11. {
    12. echo "<p><b>Leider kann keine Verbindung zur Datenbank hergestellt werden. Bitte
    13. versuchen Sie es später noch einmal.\n";
    14. echo "</BODY></HTML>\n"; // HTML Dokument abschliessen
    15. exit (); // PHP-Script beenden
    16. }
    17. // Datenbank auswaehlen
    18. $dblink=mysql_select_db($dbname);
    19. if ($dblink == FALSE)
    20. {
    21. echo "<p><b>Leider kann die Datenbank nicht geöffnet werden. Bitte
    22. versuchen Sie es später noch einmal.\n";
    23. echo "</BODY></HTML>\n"; // HTML Dokument abschliessen
    24. exit (); // PHP-Script beenden
    25. }
    26. $id=$_POST['id'];
    27. $kuvorname=$_POST['kuvorname'];
    28. $kunachname=$_POST['kunachname'];
    29. $kuanschrift=$_POST['kuanschrift'];
    30. $kuanzusatz=$_POST['kuanzusatz'];
    31. $kuplz=$_POST['kuplz'];
    32. $kuort=$_POST['kuort'];
    33. $kutelefon=$_POST['kutelefon'];
    34. $kumobil=$_POST['kumobil'];
    35. $kuemail=$_POST['kuemail'];
    36. $kukfz=$_POST['kukfz'];
    37. $kufahrzeug=$_POST['kufahrzeug'];
    38. $query = "UPDATE autoputzerkundendaten
    39. SET
    40. kuvorname='$kuvorname',
    41. kunachname='$kunachname',
    42. kuanschrift='$kuanschrift',
    43. kuanzusatz='$kuanzusatz',
    44. kuplz='$kuplz',
    45. kuort='$kuort',
    46. kutelefon='$kutelefon',
    47. kumobil='$kumobil',
    48. kuemail='$kuemail',
    49. kukfz='$kukfz',
    50. kufahrzeug='$kufahrzeug'
    51. id='$id'";
    52. $result=mysql_query($query);
    53. mysql_close();
    54. ?>
    Ihr sucht Webspace für eure Projekte? Dann sagt bescheid - kostenfrei und ohne Werbung!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „chenjung“ ()

    Die Fehlermeldung kommt durch
    $id=$_POST['id'];

    Du weißt ja nicht, ob es den Post Parameter tatsächlich gibt. Theoretisch müsstest du alle mit isset vorher prüfen. Zur Laufzeit könnte $_POST['id']; nämlich null sein. Das Ganze ist aber keine Exception sondern nur eine Notice, da es zur Laufzeit auch funktionieren kann, wenn alle Parameter gesetzt sind (In deinem Fall wird es zur Laufzeit dann halt nur bewirken, dass die Werte mit NULL in der DB gesetzt werden). Der Interpreter kann das aber nicht vorher wissen und daher die Notice. Die Notizen kann man auch ausstellen und im Livebetrieb tun das afaik auch die meisten.

    Ich würde dir auch generell dringend raten MySQLi zu verwenden und prepared statements um SQL Injection zu unterbinden.
    http://php.net/manual/en/book.mysqli.php

    //Edit
    Mir ist gerade noch aufgefallen:

    PHP-Quellcode

    1. $query = "UPDATE autoputzerkundendaten
    2. SET
    3. kuvorname='$kuvorname',
    4. kunachname='$kunachname',
    5. kuanschrift='$kuanschrift',
    6. kuanzusatz='$kuanzusatz',
    7. kuplz='$kuplz',
    8. kuort='$kuort',
    9. kutelefon='$kutelefon',
    10. kumobil='$kumobil',
    11. kuemail='$kuemail',
    12. kukfz='$kukfz',
    13. kufahrzeug='$kufahrzeug'
    14. id='$id'";


    Dir ist schon klar das du mit diesem Query ALLE Datensätze updatest ? Du hat keine Where Einschränkung über die ID.
    Das ist meine Signatur und sie wird wunderbar sein!