Verschachtelte Datenbankabfrage

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Verschachtelte Datenbankabfrage

    Hallo erst mal,

    ich bin langsam dem verzweifeln nah. Von PHP habe ich noch nicht viel Ahnung aber dafür ein, wie ich finde, recht schwieriges Problem.

    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

    In meiner MySQL-Datenbank befinden sich vier Tabellen, die ich mittels Suchfeld abfragen möchte.

    Tabelle 1 = address

    Spalten: MYID, COMPANY, LASTNAME, FIRSTNAME, ADDRESS, POSTALCODE, CITY

    Tabelle 2 = verkauf

    Spalten: MYID, RECHNUNGID, POSITIONID, POS_TEXT, POS_MENGE, POS_PREIS, NOTE

    Tabelle 3 = rechnung

    Spalten: MYID, DATUM, RECHNUNGID

    Tabelle 4 = position

    Spalten: POSITIONID, POS_NAME

    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

    In der kunden.php befindet sich ein Suchfeld, in dass ich die Kundennr. (MYID) eingeben.

    Hier mal die kunden.php:

    PHP-Code:
    <html xmls="http://www.w3.org/TR/xhtml1">
    <
    head>
    <
    title>Datenbankabfrage</title>
    </
    head>
    <
    body>
    <
    h1>Kundenanalyse</h1>
    <
    hr>
    <
    form action=kunden1.php method=post>
    Kundennr.:
    <
    INPUT TYPE="text" MAXLENGTH="30" SIZE="30" NAME="suchbegriff">
    <
    INPUT TYPE="submit" VALUE="Suchen" METHOD="post">
    </
    form>
    </
    body>
    </
    html
    Die Ausgabe findet auf der anzeige.php statt und klappt auch recht gut.

    Hier mal die anzeige.php

    PHP-Code:
    <?PHP
    /*--------- Datenbank Info---------*/
    $hostname="localhost";
    $mysql_login="root";
    $mysql_password="abrechnung";
    $database="Rechnung";


    // Verbindung mit der Datenbank
    if (!($db mysql_pconnect($hostname$mysql_login $mysql_password)))
    {
      die(
    "Keine Verbindung möglich.");    
    }
    else
    {
      
    // Datenbank wählen
        
    if (!(mysql_select_db("$database",$db)))
        {
          die(
    "Keine Verbindung möglich.");
        }
       else
        echo 
    "Kundeninformation.";
    }
     
    ?> 
     <hr>
    <?PHP
    $suchfeld
    =$_POST['MYID'];
    $suchbegriff=$_POST["suchbegriff"];

    $query "SELECT * FROM address  where MYID = '$suchbegriff'";
    $result mysql_query($query);
    $num mysql_Num_Rows($result);
    if (
    $num != 0);
    ?>

    <table border="0" width="450">
        <tr>
            <td width="75">Kundennr.:</td>
            <td width="285"><?php echo mysql_result($result0"MYID")?></td>
        </tr>
        <tr>
            <td width="75">Firma:</td>
            <td width="285"><?php echo mysql_result($result0"COMPANY")?></td>
        </tr>
        <tr>
            <td width="75">Name:</td>
            <td width="285"><?php echo mysql_result($result0"LASTNAME")?></td>
        </tr>
        <tr>
            <td width="75">Vorname:</td>
            <td width="285"><?php echo mysql_result($result0"FIRSTNAME")?></td>
        </tr>
        <tr>
            <td width="75">Strasse:</td>
            <td width="285"><?php echo mysql_result($result0"ADDRESS")?></td>
        </tr>
        <tr>
            <td width="75">PLZ:</td>
            <td width="285"><?php echo mysql_result($result0"POSTALCODE")?></td>
        </tr>
        <tr>
            <td width="75">Ort:</td>
            <td width="285"><?php echo mysql_result($result0"CITY")?></td>
        </tr>
    </table>
    <hr>
    Nun möchte ich auf der anzeige.php unter den Kundendaten:

    MYID, COMPANY, LASTNAME, FIRSTNAME, ADDRESS, POSTALCODE, CITY

    Noch ein Eingabefeld haben, das mir das Anzeigen der Rechnungen mit einem Datums Filter ermöglicht.

    Dafür wäre die Tabelle rechnung zuständig.

    Nun sollen die Rechnungen der Kundennr. (MYID) aus dem Ausgewählten Datum Bereich
    (z. B. von 01.01.2008 – 31.12.2008) Angezeigt werden.

    Format:

    RECHNUNGID, DATUM, POSITIONID, POS_NAME, POS_TEXT, POS_PREIS, POSITION_MENGE, NOTE


    Also eine Mischung aus den Tabellen.

    Zu guter letzt möchte ich die Ausgabe über einen Button als .xls (wenn möglich) downloaden können.

    Ich weiss, das ist jetzt eine ganze Menge; für mich als absoluter Anfänger in Sachen PHP auf jeden Fall zu viel.

    Kann mir vielleicht jemand von euch helfen?

    Danke schon mal vorab.

  • #2
    die mysql abfrage machst du so

    abfrage der tabelle rechnung wenn datum kleiner gleich wert a und größer gleich wert b mit der id des kunden - bsp.:

    select * from tabelle_rechnung where wert_a<='wert_a' && wert_a >='wert_b' && kundenid='id'

    wert a = eingegebenes datum
    wert b = wert a + toleranz

    für das xls gibt es genug generatoren, die deine mysql abfrage umwandeln können - ich empfehle daher mal bei google nach php+xls zu suchen.
    Signatur-Text ...

    Kommentar


    • #3
      Danke!
      Mit Excel mache ich mich mal schlau....hoffe das ich das mit PEAR alles so hinbekomme.

      Das mit der Abfrage klappt aber nicht wirklich (oder ich stelle mich einfach mal blöd an).

      Ich habe nun ein Eingabefeld in die kunden1.php gesetzt

      PHP-Code:
      <?PHP
      //Datum Suchfeld
      ?>
      <form action=kunden2.php method=post>
      <INPUT TYPE="text" MAXLENGTH="30" SIZE="30" NAME="datum1">
        bis  
      <INPUT TYPE="text" MAXLENGTH="30" SIZE="30" NAME="datum2">
      <INPUT TYPE="submit" VALUE="Suchen" METHOD="post">
      </form>
      <br>

      <?PHP
      require_once("../kunden2.php");
      ?>
      Die kunden2.php sieht so aus:

      PHP-Code:
      <?PHP
      /*--------- Datenbank Info---------*/
      $hostname="localhost";
      $mysql_login="root";
      $mysql_password="abrechnung";
      $database="Rechnung";


      // Verbindung mit der Datenbank
      if (!($db mysql_pconnect($hostname$mysql_login $mysql_password)))
      {
        die(
      "Keine Verbindung möglich.");    
      }
      else
      {
        
      // Datenbank wählen
          
      if (!(mysql_select_db("$database",$db)))
          {
            die(
      "Keine Verbindung möglich.");
          }
         else
          echo 
      "Kundeninformation.";
      }
       
      ?> 
       <hr>
      <?PHP
      $query 
      ="select * from verkauf where MYID = 'MYID'and '$datum1 BETWEEN '$datum2'";
      $result mysql_query($query);
      ?>

      Rechnungsnr.: <?php echo mysql_result ($result$RECHNUNGID)?>
      Da bekomme ich dann folgenden Fehler:
      • Warning: require_once(../kunden2.php) [function.require-once]: failed to open stream: No such file or directory in C:\xampp\htdocs\1\kunden1.php on line 79

        Fatal error: require_once() [function.require]: Failed opening required '../kunden2.php' (include_path='.;C:\xampp\php\pear\') in C:\xampp\htdocs\1\kunden1.php on line 79


      Und sorry, wenn's doofe Fragen sind aber ich habe erst vor zwei Wochen mit PHP angefangen.

      Kommentar


      • #4
        No such file or directory in
        Ja, als programmierer, sollte man wenigstens grundlegende Englisch-Kenntnisse haben. Wenn du so einfache Fehlermeldungen nicht verstehen kannst, wirst du nie in der Lage sein, deine Fehler zu beheben.

        Für sowas kann man jedenfalls nicht dauernd in ein Forum rennen. Und falls doch, dann benutzt man wenigstens die Suche und bemerkt dass es das Thema schon tausend mal gibt und bedient sich einer vorhanden Lösung.

        Danke!
        ICH BIN ICH!!!

        Kommentar


        • #5
          Prima, auf so eine Antwort habe ich gewartet.
          Englisch sitzt schon...es ging mehr darum, dass ich den Fehler nicht ausmerzen kann.

          Und eine vorhandene Lösung habe ich nicht gefunden!
          Gesucht habe ich schon danach.

          Außerdem habe ich mich niemals als Programmierer bezeichnet...wie auch nach zwei Wochen probieren!?

          Ich bin Kaufmann und will das auch bleiben; habe auf diesem Weg nur ein Problem lösen wollen, dass mir bei der täglichen Arbeit begegnet.

          Das Script das ich dazu einsetze ist phpRechnung.
          Das hat schon eine interne Abfrage aber die ist noch nicht genau genug.
          Außerdem brauche ich die Daten als Excel, weil ich damit einen Jahresbonus nur für bestimmte Artikel berechnen muss.

          Musste jetzt mal Frust ablassen....schlage mich seit einigen Tagen mit diesem Problem, bis jeweils tief in die Nacht, rum und dann so eine "tolle" Antwort!

          Danke

          Kommentar


          • #6
            • Ich weiss ja nicht, wo deine Dateien liegen, aber wahrscheinlich hast du in
              PHP-Code:
              require_once("../kunden2.php"); 
              einfach einen Punkt zuviel.
            • SELECT * FROM solltest du dir gar nicht erst angewöhnen.
            • Zu mysql_result(): es mag Ausnahmen geben, wo das sinnvoll sein kann, bei die sicher nicht. Das Handbuch sagt dazu (inklusive Schreibfehler):
              Empfohlende, leistungsfähigere Alternativen: mysql_fetch_row(), mysql_fetch_array(), mysql_fetch_assoc() und mysql_fetch_object().
            • Nach einem mysql_query() solltest du immer auf Fehler abfragen, so etwa
              PHP-Code:
              mysql_query($sql) || die("Fehler: " .mysql_error() . "<br />Abfrage: $sql<br />"
            • Eine Excel Tabelle kannst du - vorausgesetzt dein Script läuft auf einem Windows-Server - mit einem COM-Objekt erstellen. Ich vermute aber, dass für deine Zwecke auch eine viel einfacher zu erstellende CSV-Datei genügen würde. Die kannst du ja auch mit Excel öffnen
            Gruss
            H2O

            Kommentar


            • #7
              Danke, das werde ich mal ausprobieren.
              Das Script läuft übrigens auf einem Linux-Server.

              Kommentar


              • #8
                Und gerade ein Kaufmann der schon mehrere Nächte damit verbracht hat, sollte mal ernsthaft drüber nachdenken, ob es nicht resourcen-schonender wäre, das ganze professionell machen zu lassen.
                Natürlich! Hast ja in dem Punkt Recht...ist aber eine Frage der Kosten!
                Bin erst seit kurzem Selbstständig...da muss man auf jeden Cent achten.

                Wenn du mir aber ein faires Angebot machst, können wir gerne reden!


                Ihr Menschen seid schließlich unveränderlich.
                Du gehörst wohl nicht zu dieser Gattung?

                Kommentar


                • #9
                  Und nimm hier aus deinen Beiträgen die Zugangsdaten zu deiner Datenbank raus, die braucht ja keiner zu wissen. Am besten lagerst du diese in eine externe Datei aus. Sonst ist schon fast alles im folgenden kleinen Script drin:
                  PHP-Code:
                  <html xmls="http://www.w3.org/TR/xhtml1">
                  <head>
                  <title>Datenbankabfrage</title>
                  </head>
                  <body>
                  <h1>Kundenanalyse</h1>
                  <hr>
                  <table border='0'>
                  <?php
                  if(isset($_POST['go'])){
                      include 
                  './connect.inc.php';    // Verbindung zur Datenbank
                      
                  $sql "SELECT
                                  a.myid,
                                  a.company,
                                  a.lastname,
                                  a.firstname,
                                  a.address,
                                  a.postalcode,
                                  a.city,
                                  r.rechnungid,
                                  r.datum,
                                  v.positionid,
                                  p.pos_name,
                                  v.pos_text,
                                  v.pos_menge,
                                  v.pos_preis,
                                  v.note
                              FROM
                                  address a
                              INNER JOIN
                                  rechnung r USING(myid)
                              INNER JOIN
                                  verkauf v USING(rechnungid)
                              INNER JOIN
                                  position p USING(positionid)
                              WHERE
                                  a.myid = " 
                  $_POST['suchbegriff'] . "
                                AND
                                    r.datum BETWEEN " 
                  $_POST['datum1'] . " AND " $_POST['datum1'];
                      
                  $res mysql_query($sql) || die("Fehler: " .mysql_error() . "<br />Abfrage: $sql<br />";
                      if(isset(
                  $_POST['csv'])){
                          
                  $csv true;
                          
                  $fp fopen('./daten/csv_file.csv''w');  // Oder wie die Datei denn heissen soll
                      
                  }
                      
                  $obj mysql_fetch_object($res);        // erste Zeile
                      
                  printf("<tr><td>%d</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td colspan='2'>%s</td></tr>",
                              
                  $obj->myid$obj->company$obj->lastname$obj->firstname$obj->address$obj->postalcode$obj->city);
                      
                  printf("<tr><td>%d</td><td>%s</td><td>%d</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>",
                              
                  $obj->rechnungid$obj->datum$obj->positionid$obj->pos_name
                              
                  $obj->pos_text$obj->pos_preis$obj->position_menge$obj-note);
                      if(
                  $csv){
                          
                  fprintf($fp"%d;%s;%s;%s;%s;%s;%s\r\n",
                              
                  $obj->myid$obj->company$obj->lastname$obj->firstname$obj->address$obj->postalcode$obj->city);
                          
                  fprintf($fp"%d;%s;%d;%s;%s;%s;%s;%s\r\n",
                              
                  $obj->rechnungid$obj->datum$obj->positionid$obj->pos_name
                              
                  $obj->pos_text$obj->pos_preis$obj->position_menge$obj->note);
                      }
                      while(
                  $obj mysql_fetch_object($res)){        // weitere Zeilen, gehören ja alle zur ersten Adresse
                          
                  printf("<tr><td>%d</td><td>%s</td><td>%d</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>",
                                  
                  $obj->rechnungid$obj->datum$obj->positionid$obj->pos_name
                                  
                  $obj->pos_text$obj->pos_preis$obj->position_menge$obj-note);
                          if(
                  $csv){
                              
                  fprintf($fp"%d;%s;%d;%s;%s;%s;%s;%s\r\n",
                                  
                  $obj->rechnungid$obj->datum$obj->positionid$obj->pos_name
                                  
                  $obj->pos_text$obj->pos_preis$obj->position_menge$obj->note);
                          }
                      }
                      if(
                  $csv){
                          
                  fclose($fp);
                      }
                  }
                  else{
                      echo 
                  "
                          <form action='" 
                  $_SERVER['PHP_SELF'] . "method='post'>
                          <tr><td>Kundennr.:</td><td><input  maxlength='30' size='30' name='suchbegriff' /></td></tr>
                          <tr><td>Datum von:</td><td><input  maxlength='30' size='30' name='datum1' /></td></tr>
                             <tr><td>Datum bis:</td><td><input maxlength='30' size='30' name='datum2' /></td></tr>
                          <tr><td colspan='2'><input type='checkbox' name='csv' />als CSV speichern</td></tr>
                          <tr><td colspan='2'><input type='submit' value='Suchen' name='go' /></td></tr>
                          </form>\n"
                  ;
                  }
                  ?>
                  </table>
                  </body>
                  </html>
                  Gruss
                  H2O

                  Kommentar


                  • #10
                    Wow, erst mal vielen Dank für deine Arbeit!!!

                    Bekomme jetzt nach der Eingabe der Daten folgende Fehlermeldung:

                    Objekt nicht gefunden!
                    Der angeforderte URL konnte auf dem Server nicht gefunden werden. Der Link auf der verweisenden Seite scheint falsch oder nicht mehr aktuell zu sein. Bitte informieren Sie den Autor dieser Seite über den Fehler.

                    Sofern Sie dies für eine Fehlfunktion des Servers halten, informieren Sie bitte den Webmaster hierüber.

                    Error 404

                    Liegt das daran, dass ich das gerade in Windows test? (WAMP)

                    Kommentar


                    • #11
                      Nach dem absenden kommt diese Browser(!)-Fehlermeldung? Dann ist wohl der Form-Action-Path falsch... Lässt sich schnell über nen Blick in den Quelltext prüfen.

                      Was steht in der Adresszeile, wenn du diese Meldung siehst?
                      ICH BIN ICH!!!

                      Kommentar


                      • #12
                        Ich denke, es braucht noch eine Leerstelle vor method, ausserdem fehlt dort ein Anführungszeichen:
                        PHP-Code:
                                <form action='" . $_SERVER['PHP_SELF'] . "' method='post'
                        PS
                        Selber mal genauer kontrollieren ist nicht verboten. Es hat sicher auch sonst noch ein paar Fehler, da ungetestet.
                        Gruss
                        H2O

                        Kommentar


                        • #13
                          So, Fehlermeldung ist weg aber dafür gibt die Datei nur "0" aus.

                          Ich habe jetzt mal (denke ich zumindest) den Part rausgefunden, der im Original-Script für die Ausgabe von:

                          Rechnungsnr. (rechnungsid) Kunde (company, lastname, firstname), Datum und Gesamtsumme (Re-Summe)

                          verantwortlich ist.

                          Nach dem Datum sollen nun noch die anderen Felder wie:

                          POSITIONID, POS_NAME, POS_TEXT, POS_PREIS, POSITION_MENGE, NOTE

                          stehen und diese dann mit dem Code von H2O ins .csv geladen werden können.

                          Hier mal der Part aus dem original:

                          PHP-Code:
                                  <?php
                                  $query 
                          "SELECT A.MYID, A.FIRSTNAME, A.LASTNAME, A.COMPANY,
                                      R.RECHNUNGID, R.MYID, DATE_FORMAT(R.DATUM,'%d.%m.%Y') AS DATUM, R.RE_SUMME
                                      from rechnung AS R, address AS A WHERE R.MYID=
                          $myid AND A.MYID=$myid AND TO_DAYS(R.DATUM) BETWEEN TO_DAYS('$Datum_Vom_Mysql') AND TO_DAYS('$Datum_Bis_Mysql') ORDER BY R.DATUM ASC";
                                  
                          $result = @mysql_query($query);
                                  
                          $intMaxRows = @mysql_num_rows($result);

                                  
                          $query2 "SELECT FIRMENLOGO, FIRMENLOGO_BREITE, FIRMENLOGO_HOEHE, BNAME, WAEHRUNG from einstellung";
                                  
                          $result2 = @mysql_query($query2);
                                  
                          $f2 = @mysql_fetch_array($result2);
                                  
                          ?>
                                  <!-- Tabellenkopf -->
                                  <tr><td align="center" colspan="4"><h2>
                                  <?php
                                  
                          if (!empty($f2['FIRMENLOGO'])) {
                                  
                          ?>
                                      <img border="0" src="../images/<?php echo $f2['FIRMENLOGO'?>"
                                      width="<?php echo $f2['FIRMENLOGO_BREITE'?>"
                                      height="<?php echo $f2['FIRMENLOGO_HOEHE'?>"
                                      title="<?php echo $f2['BNAME'?>" alt="<?php echo $f2['BNAME'?>">
                                  <?php
                                  
                          } else {
                                      echo 
                          $f2['BNAME'];
                                  }
                                  
                          ?>
                                  </h2></td></tr>
                                  <tr><td align="center" colspan="4"><h2><?php echo $a['re_ausgang'?></h2></td></tr>
                                  <tr><td align="center" colspan="4"><?php echo $a['datum_vom'].'&nbsp;'.$Datum_Vom1.'&nbsp;'.$a['datum_bis'].'&nbsp;'.$Datum_Bis1 ?></td></tr>
                                  <tr><td>&nbsp;</td></tr>
                                  <tr class="mblueTD"><td nowrap><?php echo $a['re_belegnr'?></td><td><?php echo $a['kunde'?></td><td align="center"><?php echo $a['datum'?></td><td align="right"><?php echo $a['re_summe'?></td></tr>
                                  <?php
                                  
                          if ($intMaxRows == 0) {
                                  
                          ?>
                                      <tr><td align="center" colspan="4"><?php echo $a['kein_eintrag'?></td></tr>
                                  <?php
                                  
                          } else {
                                      
                          $intPosition 0;
                                      while(
                          $f mysql_fetch_array($result)) {
                                          
                          $seite_gesamt += $f['RE_SUMME'];
                                          
                          $intPosition++;
                                          if (
                          $intPosition%2) {
                                          
                          ?>
                                              <tr class="grayTD">
                                          <?php
                                          
                          } else {
                                          
                          ?>
                                              <tr class="wTD">
                                          <?php
                                          
                          }
                                          
                          ?>
                                          <td valign="top"><a title="<?php echo $a['info_alle'?>&nbsp;<?php echo $a['re_belegnr'?>&nbsp;<?php echo $f['RECHNUNGID'?>" class="ninfolink" href="../rechnung/info.php?myid=<?php echo $f['MYID'?>&rid=<?php echo $f['RECHNUNGID'?>&infoid=2&Datum_Vom1=<?php echo $Datum_Vom1 ?>&Datum_Bis1=<?php echo $Datum_Bis1 ?>&<?php echo session_name()."=".session_id()?>">
                                          <?php
                                          
                          if ($f['RECHNUNGID']) {
                                              echo 
                          $f['RECHNUNGID'];
                                          }
                                          
                          ?>
                                          </td><td valign="top">
                                          <?php
                                          
                          if ($f['LASTNAME']) {
                                              echo 
                          $f['LASTNAME'];
                                              
                          ?>
                                              &nbsp;
                                          <?php
                                          
                          }
                                          if (
                          $f['FIRSTNAME']) {
                                              echo 
                          $f['FIRSTNAME'];
                                              
                          ?>
                                              ,&nbsp;
                                          <?php
                                          
                          }
                                          if (
                          $f['COMPANY']) {
                                              echo 
                          $f['COMPANY'];
                                          }
                                          
                          ?>
                                          </td>
                                          <td valign="top" align="center"><?php echo $f['DATUM'?></td><td nowrap valign="top" align="right"><?php echo number_format($f['RE_SUMME'],2,",","."); ?></td></tr>
                                      <?php
                                      
                          }
                                  }
                                  
                          ?>
                                  <tr><td>&nbsp;</td></tr>
                                  <tr><td colspan="3" align="right"><b><?php echo $a['re_summe'].'&nbsp;'.$f2['WAEHRUNG'?>:</b></td><td align="right"><?php echo number_format($seite_gesamt,2,",","."); ?></td></tr>
                                  <tr><td>&nbsp;</td></tr>
                                  <tr><td id="top8" align="center" colspan="4">
                                  <?php
                                  Benutzereingabe
                          ();
                                  
                          ?>
                                  </td></tr>
                                  </tbody></table>
                              <?php
                              
                          }
                              
                          ?>
                              </td></tr>
                              <tr><td id="td2_20" width="20%"><br></td><td id="td2_2" width="2%"></td>
                              <td width="78%" valign="top"><br></td></tr></tbody></table>
                              <?php
                              Ende
                          ();
                          }
                          ?>
                          P.S. Denke das ich langsam nerve aber ich habe wirlich noch keinen Schimmer von PHP....

                          Kommentar

                          Lädt...
                          X