Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Link Aufruf mit 2 Variablen?!

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Link Aufruf mit 2 Variablen?!

    Hallo Forum,

    bitte nicht gleich erschlagen...
    Ich hab nicht soviel Plan von PHP aber bewege mich gerade auf einem Terrain, der mir einfach zu hoch ist. Ich weiss.....ich muss erstmal die Grundlagen lernen. Ich bin dabei....

    Ich habe ein gekauftes Script aus und die Fa. hat sich nicht wirklich einen guten Namen gemacht im Netz. Nichts desto trotz. Habe schon viele Probleme behoben und auch schon sehr viel bearbeitet.
    Seit 4 Monaten!!! arbeite ich nun an einer automatischen Generierung von Verträgen. Habe jetzt gedacht ich wäre in den Endzügen jedoch habe ich ein Problem entdeckt der mir nicht aufgefallen war und mir jetzt Kopfschmerzen macht. Ich versuche viel zu erklären, damit ich nur die notwendigen Code hier reinkopiere.

    So sieht die Seite aus um die es geht.


    Hier kann jeder seine Einkäufe sehen, Rechnung runterladen(generiert mit mPDF) und jetzt soll der Vertrag auch noch dazu kommen(auch mit mPDF).

    Der Link wird in der Methode definiert die für die Anzeige der Seite zuständig ist :
    LINK für VERTRAG: aufgerufen nach music_order_id
    PHP-Code:
                        $showMusiclists_arr['row'][$inc]['light_window_url_1'] = $this->CFG['site']['music_url'].'members/listenerTransactionList.php?music_order_id='.$row['music_order_id'].'&light_window=1'
    LINK FÜR RECHNUNG aufgerufen nach music_id
    PHP-Code:
                        $showMusiclists_arr['row'][$inc]['light_window_url'] = $this->CFG['site']['music_url'].'members/listenerTransactionList.php?music_id='.$row['music_id'].'&light_window=1'


    So sieht der Code für den Vertrag aus:
    PHP-Code:
            public function displayContractDetailsList($music_order_id='')
            {
                global 
    $LANG_LIST_ARR;
                global 
    $smartyObj;
                
    $displayDetails_arr = array();
                    
                    
    $sql 'SELECT einige abfragen FROM '.
                    
                    
    $this->CFG['db']['tbl']['mXXX'].' AS m LEFT JOIN '.
                    
    $this->CFG['db']['tbl']['mXXX'].' as mp ON mp.music_id=m.music_id LEFT JOIN '.
                    
    $this->CFG['db']['tbl']['uXXX'].' AS u ON mp.user_id = u.user_id LEFT JOIN '.
                    
    $this->CFG['db']['tbl']['mXXX'].' AS mca ON mca.user_id = mp.owner_id '.
                    
    ' WHERE mp.user_id = '.$this->CFG['user']['user_id'].' AND mp.music_order_id = '.$this->dbObj->Param('music_order_id').
                    
    ' GROUP BY mp.music_order_id ';
                                    
                
    $stmt $this->dbObj->Prepare($sql);
                
    $rs $this->dbObj->Execute($stmt, array($music_order_id));
                if (!
    $rs)
                    
    trigger_error($this->dbObj->ErrorNo().' '.
                    
    $this->dbObj->ErrorMsg(), E_USER_ERROR);
                
    $displayDetails_arr['record_count'] = false;
                if(
    $row $rs->FetchRow())
                {
                    
    $displayDetails_arr['record_count'] = true;
                    
    $displayDetails_arr['music'] = true;
            
                
                    
                    
                    
                    
    $mpdf = new mPDF();
                    
    $mpdf->useOnlyCoreFonts true;    // false is default
                    
    $mpdf->SetProtection(array('print'));
                    
    $mpdf->SetTitle("Nutzungsvertrag");
                    
    $mpdf->SetAuthor("www.youbeats.net");
                    
    $mpdf->SetCreator('Nutzungsvertrag / Contract');
                    
    $mpdf->SetWatermarkText("www.youbeats.net");
                    
    $mpdf->showWatermarkText true;
                    
    $mpdf->watermark_font 'DejaVuSansCondensed';
                    
    $mpdf->watermarkTextAlpha 0.025;
                    
    $mpdf->SetDisplayMode('fullpage');
                    
    $name 'Vertrag zu '.$row['music_order_id'].'_'.$row['music_title'].'_'.$row['seller_name']. " www.youbeats.net".".pdf";
                    
    $html '
                    

                    VERTRAGS HTML // wird auch alles angezeigt und bearbeitet
                    
                    
                    '
    ;
                    
    $mpdf->WriteHTML($html);
                    
    $mpdf->Output($name,'I');
                    
    $path '/var/www/vhosts/XXX';
                    
    $mpdf->Output($path.$name,'F');
                    exit;
                    

                    }
                
    $smartyObj->assign('displayDetails_arr'$displayDetails_arr);
            } 
    Nun wird das ganze in der PHP folgendermaßen aufgerufen und somit komm ich zu meinem Problem:
    PHP-Code:
    if ($transactiondetails->isShowPageBlock('songlist_block'))
    {
        
        
    $transactiondetails->sanitizeFormInputs($_REQUEST);
        
    $transactiondetails->isShowPageBlock('displaysonglist_block');
        if(
    $transactiondetails->getFormField('music_album_id'))
        {
            
    $transactiondetails->displayAlbumDetailsList($transactiondetails->getFormField('music_album_id'));
        }
        else if(
    $transactiondetails->getFormField('music_id'))     //<-- hiermit wird die rechnung aufgerufen
        
    {
            
    $transactiondetails->displayMusicDetailsList($transactiondetails->getFormField('music_id'));
        }
        else if(
    $transactiondetails->getFormField('music_order_id')) //<-- hiermit wird Vertrag aufgerufen
        
    {
            
    $transactiondetails->displayContractDetailsList($transactiondetails->getFormField('music_order_id'));
        }
        
        
    setTemplateFolder('general/''music');
        
    $smartyObj->display('listenerInvoice.tpl');
        
    $transactiondetails->includeFooter();
        exit;
        } 

    An der Stelle wo der Vertrag aufgerufen wird, stimmt die Zuordnung nicht und die Anzeige zeigt nicht die richtigen Daten zu dem gekauften Beat an, da die Bestellnummer mehrere Beats betreffen kann.


    Als erstes habe ich den Link geändert, damit der zu jedem Beat einmalig ist. die music_id in kombination mit music_order_id ist ja einmalig.
    PHP-Code:
    $showMusiclists_arr['row'][$inc]['light_window_url_1'] = $this->CFG['site']['music_url'].'members/listenerTransactionList.php?'.$row['music_order_id'].'&'.$row['music_id'].'&light_window=1'
    Ab hier gehts nicht mehr weiter. Ich weiß nicht wie ich die beiden Variablen nun in die Methode packen und aufrufen soll, alle meine Versuche sind gescheitert. Die Methode soll ja nun genau die music_order_id und die music_id abfragen und für die betroffene Reihe den Vertrag öffnen.

    Ich hoffe ich konnte das alles genau erklären.


  • #2
    Die SQL Anweisung in "displayContractDetailsList" gruppiert auf music_order_id und reduziert dadurch die Detail-Informationen, die beim JOIN zusammenkommen.

    Lass dir das generierte SQL mal anzeigen und gib es im PMA ein, dann entfern das GROUP BY und du wirst feststellen, das die Details (Beats) vorhanden sind.
    Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

    Kommentar


    • #3
      Zitat von lstegelitz Beitrag anzeigen
      Die SQL Anweisung in "displayContractDetailsList" gruppiert auf music_order_id und reduziert dadurch die Detail-Informationen, die beim JOIN zusammenkommen.

      Lass dir das generierte SQL mal anzeigen und gib es im PMA ein, dann entfern das GROUP BY und du wirst feststellen, das die Details (Beats) vorhanden sind.
      Klappt leider auch nicht. Das hatte ich vorher auch schon probiert. Du hast aber Recht. Das GROUP BY music_order_id nehme ich da raus, da ich ja jede Bestellung/Kauf angezeigt bekommen möchte.

      Somit bleibt die definition weiterhin auf music_order_id und davon habe ich mehrere reihen. Man kann ja in einem Bestellvorgang mehrere music_id's (also Beats) kaufen. Daher muss ich die Definiton music_id irgendwie mit reinstellen.

      Ich habe übrigens den Link erneuern müssen. So war ein Fehler drin.
      Sieht nun so aus:
      PHP-Code:
      $showMusiclists_arr['row'][$inc]['light_window_url_1'] = $this->CFG['site']['music_url'].'members/listenerTransactionList.php?music_order_id='.$row['music_order_id'].'&music_id='.$row['music_id'].'&light_window=1'

      Kommentar


      • #4
        Somit bleibt die definition weiterhin auf music_order_id und davon habe ich mehrere reihen.
        Genau hinschauen!
        Eine Order-ID kann aus mehreren Beats bestehen, dh. alles mit der gleichen Order-ID gehört zusammen, hat aber unterschiedliche music_ids.

        Ohne eine Nachbearbeitung der vom JOIN-SQL gelieferten Daten wird es nicht gehen (allerdings kannst du dir mal GROUP_CONCAT anschauen, das könnte im Ansatz schon weiterhelfen, die Titel der einzelnen Beats einer Bestellung zu sammeln).
        Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

        Kommentar


        • #5
          Zitat von lstegelitz Beitrag anzeigen
          Genau hinschauen!
          Eine Order-ID kann aus mehreren Beats bestehen, dh. alles mit der gleichen Order-ID gehört zusammen, hat aber unterschiedliche music_ids.
          Hab ich das nicht geschrieben? Jeder Beat hat verschiedene Rechte, deswegen muss unbedingt jeder eingekaufte beat seinen eigenen Vertrag haben. Über die Definition der music_order_id klappt das nicht, da zu jeder Order mehrere Beats gehören. Deswegen muss ich der Methode irgendwie mitteilen, dass er die Daten nicht nur aus der music_order_id sondern auch aus der music_id beziehen soll. Das ist dann GENAU 1 Definierte Reihe in der Datenbank.

          Hier kann ich GROUP_CONCAT nicht gebrauchen. Aber vielen Dank für den Hinweis. Das kann ich sehr gut für die Rechnungsgenerierung gebrauchen. Dann kann der Käufer pro Bestellung eine Rechnung downloaden und nicht pro gekauften Beat.

          Kommentar


          • #6
            Jeder Beat hat verschiedene Rechte, deswegen muss unbedingt jeder eingekaufte beat seinen eigenen Vertrag haben.
            Oh sorry, dann hab ich dich mißverstanden.
            Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

            Kommentar


            • #7
              Ok. Hast leider auch keine andere Idee oder?

              Kommentar


              • #8
                Irgendwie erschliessen sich mir die Tabellenbeziehungen nicht wirklich... Von "Rechten" die ein Beat haben muss/kann war im Eingangspost keine Rede (auch nicht vor Post #5 - dort erwähnst du es das erste mal, deswegen war ich wohl auch verwirrt).

                Leg doch mal schematisch genauer dar, wie deine Tabellen miteinander verbunden sind. 1:1 Beziehungen (z.B. jeder Beat hat genau einen Vertrag) stören einen JOIN nicht, erst bei Mehrfachzuweisungen (jeder Beat hat 1-n Rechte) kommt das zum Tragen.
                Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                Kommentar


                • #9
                  Die Rechte Spielen in diesem Fall auch nicht wirklich eine Rolle. Ich hatte es nur erwähnt um zu verdeutlichen warum diese Methode in dem Link unbedingt genau auf den gekauften Beat zugewiesen werden muss.

                  Beispiel:
                  Im ersten Post erwähnte ich diesen Abschnitt hier:
                  PHP-Code:
                  else if($transactiondetails->getFormField('music_id'))     //<-- hiermit wird die rechnung aufgerufen 
                      

                          
                  $transactiondetails->displayMusicDetailsList($transactiondetails->getFormField('music_id')); 
                      } 
                  Hier wird die Rechnung aufgerufen bestimmend nach der music_id. Deswegen klappt das auch ohne Probleme.

                  In dem linkaufruf zur Vertrags methode
                  PHP-Code:
                   else if($transactiondetails->getFormField('music_order_id')) //<-- hiermit wird Vertrag aufgerufen 
                      

                          
                  $transactiondetails->displayContractDetailsList($transactiondetails->getFormField('music_order_id')); 
                      } 
                  Hier würde ich auch gerne mit music_id aufrufen dann wäre es klar zugewiesen und ich hätte dieses Problem nicht. Geht aber nicht. Sobald ich hier auch music_id verwende wird mir statt Vertrag die Rechnung aufgemacht. Ist ja klar.
                  Deswegen habe ich mir gedacht die Kombi aus music_id und music_order_id müsste ja auch klappen und dafür Suche ich eine Lösung.

                  Kommentar


                  • #10
                    Hat denn jemand eine andere Idee wie ich das machen könnte?

                    Kommentar


                    • #11
                      Zitat von webmaster2208 Beitrag anzeigen
                      Deswegen habe ich mir gedacht die Kombi aus music_id und music_order_id müsste ja auch klappen und dafür Suche ich eine Lösung.
                      Dazu wirst du mehrere Anpassungen vornehmen müssen...
                      - Die Funktionssignatur für die ContractDetails, sowie den Code der Funktion
                      - Die Reihenfolge in den if-Abfragen zum Aufruf der Funktion
                      - Das Formular, welches die Daten sendet, sowie den Code der dieses Formular erstellt

                      (und vielleicht noch mehr)
                      Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                      Kommentar


                      • #12
                        Ich habe es nun tatsächlich hinbekommen:
                        Den Link sieht nun so aus:
                        PHP-Code:
                        $showMusiclists_arr['row'][$inc]['light_window_url_1'] = $this->CFG['site']['music_url'].'members/transactionList.php?music_order_id='.$row['music_order_id'].'&music_id='.$row['music_id'].'&light_window=1'

                        Dann habe ich folgendes geändert in der Methode:
                        PHP-Code:
                        public function displayContractDetailsList($music_order_id$music_id)  //<-- hier die Variable $music_id hinzugefügt
                                
                        {
                                    global 
                        $LANG_LIST_ARR;
                                    global 
                        $smartyObj;
                                    
                        $displayDetails_arr = array();
                                        
                                        
                        $sql 'Diverse Abfragen FROM '.
                                        
                                        
                        $this->CFG['db']['tbl']['mXXX'].' AS m LEFT JOIN '.
                                        
                        $this->CFG['db']['tbl']['mXXX'].' as mp ON mp.music_id=m.music_id LEFT JOIN '.
                                        
                        $this->CFG['db']['tbl']['uXXX'].' AS u ON mp.user_id = u.user_id LEFT JOIN '.
                                        
                        $this->CFG['db']['tbl']['mXXX'].' AS mca ON mca.user_id = mp.owner_id '.
                                        
                        ' WHERE mp.owner_id = '.$this->CFG['user']['user_id'].' AND mp.music_id = '.$this->dbObj->Param('music_id').' AND mp.music_order_id = '.$this->dbObj->Param('music_order_id');  //<-- neben der Abfrage zur Bestellnummer habe ich die music_id noch dazu genommen
                                                        
                                    
                        $stmt $this->dbObj->Prepare($sql);
                                    
                        $rs $this->dbObj->Execute($stmt, array($music_id,$music_order_id)); //<-- und hier nochmal die Variable $music_id
                                    
                        if (!$rs)
                                        
                        trigger_error($this->dbObj->ErrorNo().' '.
                                        
                        $this->dbObj->ErrorMsg(), E_USER_ERROR);
                                    
                        $displayDetails_arr['record_count'] = false;
                                    if(
                        $row $rs->FetchRow())
                                    { 
                        Aufegrufen wird das ganze dann ganz am Ende
                        PHP-Code:

                        if ($transactiondetails->isShowPageBlock('songlist_block'))
                        {
                            
                        $transactiondetails->sanitizeFormInputs($_REQUEST);
                            
                        $transactiondetails->isShowPageBlock('displaysonglist_block');
                            if(
                        $transactiondetails->getFormField('music_album_id'))
                            {    
                                
                        $transactiondetails->includeHeader();
                                
                        $transactiondetails->displayAlbumDetailsList($transactiondetails->getFormField('music_album_id'));
                            }
                            else if(
                        $transactiondetails->getFormField('music_order_id'))
                            {
                                
                        $transactiondetails->displayContractDetailsList($transactiondetails->getFormField('music_order_id'),($transactiondetails->getFormField('music_id'))); //<-- die Abfrage musste ich im gegensatz zum ersten Post vor der $music_id Abfrage vorziehen.
                            
                        }
                            else if(
                        $transactiondetails->getFormField('music_id'))
                            {    
                        $transactiondetails->includeHeader();

                                
                        $transactiondetails->displayMusicDetailsList($transactiondetails->getFormField('music_id'));
                            }
                            
                            
                        setTemplateFolder('general/''music');
                            
                        $smartyObj->display('transactionDetailsList.tpl');
                            
                        $transactiondetails->includeFooter();
                            exit;


                        Hab es jetzt oft getestet. Mir ist jetzt erstmal nichts mehr aufgefallen. Ich bedanke mich nochmal für deine zahlreiche Unterstützung und Hilfestellung. Sollte kein Problem mehr auftauchen, dann werde ich das Thema als erledigt markieren. Bis dann

                        Kommentar

                        Lädt...
                        X