Ankündigung

Einklappen
Keine Ankündigung bisher.

hilfe für richtige Codierung erwünscht

Einklappen

Neue Werbung 2019

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

  • hilfe für richtige Codierung erwünscht

    Hallo Leute,

    ich bin ein absoluter Anfänger in Sache PHP und MySQL. Hab jetzt mein eigenes Script erstellt mit wohl sehr unprofessionellen Code-Formulierungen. Ich weiß aber, daß bestimmte Aufgaben mit unterschiedliche Methoden viel schneller und sauberer ausgeführt werden können, aber ich hab keine Ahnung wie. Auch mit MySQL Anweisungen kann es manchmal sinnvoller sein, bestimmtes richtiger zu formulieren.

    Daher lege ich erst mal meine Codes hier rein, wer Zeit und Interesse hat, mir meine Codes Korektur zu lesen, dafür wäre ich sehr dankbar.

    Zur Erläuterung der Codes:
    Ich mache ein Webseit mit der Absicht, chinesische Rock Scene auf Englisch vorzustellen. Daher überlege ich einen Datenbank für Bänds zu erstellen und dieser Script unten dient einfach zunächst erst mal zum Anzeigen aller oder bestimmter archivierte Banddaten, auch mit Anzeigesortierung und Seitenverteilung. Suchfunktion hab ich noch nicht eingebaut.

    Das ganze läuft auch schon online als test:
    http://www.rockinchina.com/test/

    Nun hier die Codes:
    PHP-Code:
    <?php

    //set amount of rows to be displayed each page:
    $pagerows 20;        
        
    include(
    "inc_db_inf.php");        //DB infos
    mysql_connect($host,$user,$pass);
    mysql_select_db($db) or die( "Unable to select database");

    //_GET uebernimmt Werte aus den URL Angaben xxx.php?sort=Wert 
    $sort $_GET["sort"];            
    $Sortmethod $_GET['sortmethod'];

    //Ermittelt Werte fuer den Sortiervorgang
    if ($sort == "") {
        
    $query="SELECT * FROM BandIndex";
    } else {
      if (
    $Sortmethod == "") { 
          
    $sortmethod "ASC"
      } elseif (
    $Sortmethod == "DESC") { 
          
    $sortmethod "ASC";
      } elseif (
    $Sortmethod == "ASC") {
          
    $sortmethod "DESC";
      }
      
    $query="SELECT * FROM BandIndex ORDER BY $sort $sortmethod";
      
    $sorttmp "Sorted by $sort";
    }

    $result mysql_query($query);
    $num mysql_num_rows($result); 

    mysql_close();

    //Page Header Infos geladen:    
    include("inc_header.php");

    //Page Codes:
    echo '<div class="BandMain">
        <div class="MainHeading">
        [url="admin_index.php"]Band Index All[/url]
        </div>

        

    Click on each Columneheader to sort the data, click again to sort reverse.</p>
    '
    ;

    //Wenn Sortiervorgang aktive: Sortierweise anzeigen
    if ($sort != "") echo "

    $sorttmp ($sortmethod)</p>";

    //Tabellenkopf mit Sortierungsangaben als Links
    ?>
    <table border="2" width="100%">
    <tr> 
    <td width="40%"><p class="ContentSubHeading"><a href="admin_index.php?sort=BandEN&amp;sortmethod=<? 
    echo "$sortmethod"; ?>">Bandname</a> [url="admin_index.php?sort=BandCN"][chn. Pin Yin][/url]</p></td>
    <td><p class="ContentSubHeading"><a href="admin_index.php?sort=Genre&amp;sortmethod=<? 
    echo "$sortmethod"; ?>">Genre</a></p></td>
    <td><p class="ContentSubHeading"><a href="admin_index.php?sort=City&amp;sortmethod=<? 
    echo "$sortmethod"; ?>">Origin</a></p></td>
    <td><p class="ContentSubHeading"><a href="admin_index.php?sort=Since&amp;sortmethod=<? 
    echo "$sortmethod"; ?>">Since</a></p></td>
    <td><p class="ContentSubHeading"><a href="admin_index.php?sort=Status&amp;sortmethod=<? 
    echo "$sortmethod"; ?>">Status</a></p></td> 
    </tr>

    <?

    //Falls in URL angegeben, Wert fuer den aktuellen Page uebernehmen:
    $page = $_GET['page'];

    //Falls nicht angegeben, Page-Wert = 1. Seite:
    if ($page == "") {$page = 1;}

    //Berechnung der Datensatznr., die am Anfang und am Ende einer Seite angezeigt werden sollen.
    $pagelastrow = $page * $pagerows;
    $pagefirstrow = $pagelastrow - $pagerows + 1;

    //Wenn mehr Datensaetze gefunden als 20 (passt nicht alles auf einer Seite):
    if ($num > $pagerows) {
    //Vorletzte Seitenzahl und letzte DatensatzNr. der vorletzte Seite ermitteln:
       $pagess = (int)($num / $pagerows);
       $lastpr = $pagess * $pagerows;
    //Gesamtseitenzahl und letzte Datensatznr. der letzten Seite ermitteln:
       if ($num > $lastpr) {
             if ($page > $pagess) {
                   $temp = $num - $lastpr; 
                   $pagelastrow = $lastpr + $temp;
             }
          $pages = $pagess + 1;
       } else {
             $pages = $pagess;
       }
    } else {
       $pages = 1;
       $pagelastrow = $num;
    }

    //Werte der auf einer jeden Seite anzuzeigenden Datensaetze ermitteln:
    while ($pagefirstrow < $pagelastrow) {
        $id=mysql_result($result,$pagefirstrow,"id");
        $BandEN=mysql_result($result,$pagefirstrow,"BandEN");
        $BandCN=mysql_result($result,$pagefirstrow,"BandCN");
        $Link=mysql_result($result,$pagefirstrow,"Link");
        $Genre=mysql_result($result,$pagefirstrow,"Genre");
        $City=mysql_result($result,$pagefirstrow,"City");
        $Since=mysql_result($result,$pagefirstrow,"Since");
        $Status=mysql_result($result,$pagefirstrow,"Status"); 

        ?>

    //Datenwerte in HTML-Tabelle anzeigen und mit Links versehen, die div. Zwecken erfuellen:    
        <tr> 
        <td width="30%">
           


              <? if ($Link != "") {
                   //Link zu der entsprechenden Bandseite anzeigen falls es exitiert:
                 echo '<a href="http://www.rockinchina.com/'; 
                 echo "$Link"; echo '">'; 
                 echo "[b]$BandEN[/b]
    [$BandCN]</a>";
              } else {
                 echo "[b]$BandEN[/b]
    [$BandCN]";
              } ?>
           </p>
        </td>
        <td width="30%">
           


              <? echo "$Genre"; ?>
           </p>
        </td>
        <td>
           


              <? $LinK = "../Szene_$City.html";                        
              //Link auf die Cityseite verlegen, falls es existiert:
              if (file_exists($LinK)) {
                  echo "<a href=\"$LinK\">$City</a>";
              } else {
                   echo "$CityK";
              }
              ?>
           </p>
        </td>
        <td>
           


              <? echo "$Since"; ?>
           </p>
        </td>
        <td>
           


              <? echo "$Status"; ?>
           </p>
        </td>
        </tr>
        <? 

        ++$pagefirstrow;
    }

        echo "</table>\n

    Page(s): ";
        //Links zu den uebrigen Seiten anzeigen mit Angaben fuer Sortieranforderungen und Seitenzahlen
        $p = 0;
        while ($p < $pages) {
            ++$p;
            echo "[<a href=\"admin_index.php?page=$p&amp;pages=$pages&amp;sort=$sort&amp;sortmethod=$Sortmethod\">$p</a>] ";
        }
        echo "</p>";

    //Editors Notes:
    echo "

    [b]New Functions that work sofar[/b]:

                1) Sort displayed data ASC or DESC by click on the Columne Header.

                2) City Value automatically linked the City Scene Page if exist.

                3) Edit and Delete Data (for Administrators only!).

                4) Add a new Datarecord (for Adnimistrators only!).

                5) Seperate all found data on Subpages (Works also for sorted Data).</p>
                

    [b]To Do List[/b]:

                1) Search Function for various properties like Origin, Stlye, Genre, Since etc.

                2) Set display Genre as a Link for Genre-Search-Funktions.</p>
                

    [b]Yang's Comment[/b]: it's so fuxxing [b]COOL[/b] 
    to have all this running so far!!! I didnt have any knowledge about PHP or 
    MySQL before starting this Project, now the baby is growing just fine and I 
    hope we can offer you a much comfortable way to access to our data and 
    info archive incl. Band Index, Rereases, Gig Dates etc. Since I am not 
    finished with all functions on my wish list, this project will remain a test. 
    Try to navigate throu all links on the page and report buggs on our forum 
    or per Email to [email]yang@rockinchina.com[/email], have fun!</p>";

    echo "</div>\n
    </div>\n
    </html>\n
    </body>";

    ?>
    www.rockinchina.com


  • #2
    Noch paar Fragen:

    a) Muß ich denn jedes mal den DB connectieren um die selben Daten auf unterschiedlichen Seiten anzuzeigen? Ich hab ja ein Blättern-Funktion eingebaut, aber muß jedes mal die Daten noch mal abfragen, geht es denn einfacher und schneller? Z. B. Daten einmalig abfragen und irgendwo zwischen speichern bis die Daten noch mal abgefragt werden?

    b) Verliert ein Variable den Wert, wenn die die PHP Seite noch mal lade (ohne eine Wertveränderungsbefehl zu aktivieren)?
    www.rockinchina.com

    Kommentar


    • #3
      Bemerkung:

      ich will ja nicht, daß jemanden mir die ganze Arbeit abnimmt. Nur verstehen ich in manchen Dingen nicht, wie man es machen soll. Daher wäre es sinnvoll wenn irgendeiner mir irgend einen Abschnitt aus obiger Codes entnehmen kann, um mir zu verdeutlichen, was man da besser machen kann.

      Danke ...
      www.rockinchina.com

      Kommentar


      • #4
        Zitat von rockinchina
        Noch paar Fragen:

        a) Muß ich denn jedes mal den DB connectieren um die selben Daten auf unterschiedlichen Seiten anzuzeigen? Ich hab ja ein Blättern-Funktion eingebaut, aber muß jedes mal die Daten noch mal abfragen, geht es denn einfacher und schneller? Z. B. Daten einmalig abfragen und irgendwo zwischen speichern bis die Daten noch mal abgefragt werden?

        b) Verliert ein Variable den Wert, wenn die die PHP Seite noch mal lade (ohne eine Wertveränderungsbefehl zu aktivieren)?
        Das Script hab ich mir jetzt nicht angeguckt sondern will nur mal diese zwei Fragen da beantworten.

        Du musst zunächst mal begreifen, wie der HTTP-Server funktioniert.
        Jeder Seitenaufruf wird von einer eigenen Instanz des Webservers abgearbeitet. Die einzigen Informationen, die der Webserver zur Verfügung hat, sind die Informationen, die der Client mitschickt.
        Das sind:
        - die gewünschte URL (Host, Verzeichnis, Datei, evtl. Parameter)
        - Informationen über den User-Agent (Browser)
        - gesetzte Cookies dieser Website
        - Eingabefelder aus einem Formular.

        Da wirst Du nirgends was finden, was darauf hindeutet, zu welchem vorhergehenden Aufruf der selben Seite ein neuer Aufruf gehört.
        Das kann der gleiche Besucher sein oder ein anderer.

        Ein wiederholtes Laden einer Seite sind für den Webserver komplett getrennte Anfragen ohne Bezug zueinander.

        Somit ist es erstmal unmöglich, Variablen von einem Seitenaufruf bei einem anderen weiter zu verwenden.

        Ebenso ergibt sich daraus, dass Du bei jedem Seitenaufruf eine neue Verbindung zur DB aufbauen musst.
        Sobald die Abarbeitung eines Scripts beendet ist, wird diese Verbindung wieder geschlossen.


        Wenn Du Daten über mehrere Aufrufe hinweg benutzen willst, solltest Du hier mal nach Cookies und Sessions suchen.
        Darin können Variablen länger gespeichert werden.
        Evtl. kannst Du damit auch das Ergebnis Deiner DB-Abfrage zwischenspeichern und bei Folgeseiten ausgeben.
        **********************************
        Nein, ich bin nicht die Signatur.
        Ich putze hier nur.
        **********************************

        Kommentar


        • #5
          Zitat von Der_Gerhard
          Das Script hab ich mir jetzt nicht angeguckt sondern will nur mal diese zwei Fragen da beantworten. ...
          Hallo und vielen Dank für Deine Antwort, das hilf mir schon sehr, diese Dinge besser zu verstehen, denn ich hab bis her kaum was darüber erfahren und weiß auch nicht so genau, wo ich über solche grundlegende Dinge nachlesen kann.

          Cookies kenne ich von Foren her, von Sessions hab ich nur etwas erfahren, als ich mir einige User-Management-Codes und Tools durchgesehen habe, verstehen tu ich noch nicht. Aber wird wohl schon werden.

          Ich schätze, es macht wohl auch kaum Sinn gelesene Daten aus einer DB per Session zu speichern, das würde wohl den Aufwand, DB neuzuverbinden, gleich kommen.

          Inzwischen hab ich auch schon den Suchfunktion in meinem Script eingebaut, allerdings erst mal nur einfache Suche nach einem Kriterium, zu Wildcards usw. bin ich noch nicht vorgestossen.

          Vielen Dank für Deine Antwort.

          Ich hätte noch eine Frage:

          Ich habe kaum mit Arrays gearbeitet, daher die Frage, würde z. B. die Manipulation einer Zeichenkette mit einer Array-Lösung schneller verarbeitet als z. B. mit einer verschachtelten Schleife? Ich neige nämlich dazu, alles mit If, For oder While zu lösen ...
          www.rockinchina.com

          Kommentar


          • #6
            Ob es sich lohnt, die Ergebnisse der durchgeführten Suche zu speichern hängt von der Komplexität der Abfrage ab.
            Normalerweise ist es ausreichend, bei jedem Seitenaufruf neu zu suchen. Durch Angabe von LIMIT wird dann nur der entsprechende Bereich ausgewählt.

            Sessions werden Je nach Konfiguration entweder in einer DB verwaltet oder in einer Datei.
            Vom Browser wird dann die Session-ID als Cookie oder als Parameter übergeben. Details dazu findest Du, wenn Du hier mal nach einem Tutorial für Sessions suchst.

            Zu Deiner neuen Frage:
            Ich hab leider keine Ahnung, was Du machen willst, was Du unter der Array-Lösung versteht und wie die verschachtelten Schleifen aussehen soll.

            If, for und while wirst Du als grundlegende Kontrollstrukturen fast in jedem Script brauchen.
            **********************************
            Nein, ich bin nicht die Signatur.
            Ich putze hier nur.
            **********************************

            Kommentar


            • #7
              Wie Du vielleicht an meinem Script siehst, LIMIT behersche ich noch nicht und mein Paging-Funktion stellt einfach eine bestimmte Menge an Datenzeilen von den gesamt gelesenen Daten auf einer Seite dar, anstatt die Datenmenge schon bei dem Einlesen zu limitieren. Daher läuft mein Script vielleicht langsamer als erwartet.

              Wegen Array, ich bin mir nicht sicher, ob in PHP so was wie Select Case (wie im VB) gibt, aber Array in Kombination mit einer For Schleife würde wohl die Variablen auf ähnlicher Weise bearbeiten. Mir fallen jetzt konkret kein Beispiel ein zur Erläuterung meiner Frage.

              Was genau kann so ein Skript beschleunigen oder verlangsamen, jetzt auf die Art des Coding betrachtet? Gilt der Grundsatz, je weniger Berechnungs/Befehlsschritte desto schneller der Script oder verhalten sich unterschiedliche Befehlsmethoden auch unterschiedlich in der Geschwindigkeit?

              z. B.

              $x = 1
              $x = $x + 1
              echo $x

              oder

              $x = 1
              echo ++$x

              würden sich beide Schreibweise theoretisch gleichermaßen verhalten oder läuft das zweite etwas schneller?
              www.rockinchina.com

              Kommentar


              • #8
                Hmmmm stimmt. LIMIT magst DU wohl noch nicht.
                Du solltest dringend mal nachgucken, wie das funktioniert. Ist auch keine schlimme Sache.
                Mach einfach "LIMIT $pagefirstrow, $pagerows" hinter die Abfrage.

                Auf jeden Fall solltest Du die unzähligen Aufrufe von mysql_result() eliminieren.
                Hol Dir lieber mit mysql_fetch_assoc() eine Zeile nach der anderen und nicht jedes Feld einzeln.
                Damit dürftest Du ne Menge Zeit sparen.

                Zur Optimierung:
                Die genannten Operationen dürften sich nicht nennenswert unterscheiden.
                Bei der zweiten muss PHP wohl einmal weniger in nach der Variable $x suchen, aber sonst ist da kein Unterschied.
                Wichtig ist, dass man nicht in einer Schleife unnötig Werte ermittelt, die sich nicht verändern und somit auch schon vorher einmalig berechnet werden können.
                Außerdem solltest Du nicht die ganze DB auslesen, wenn Du nicht alle Spalten brauchst. SELECT * ist also nicht so doll.

                Ach ja:
                Meinst Du das mit $Sortmethod und $sortmethod wirklich ernst? Zwei derart ähnliche Variablennamen sind ganz sicher keine gute Idee.
                **********************************
                Nein, ich bin nicht die Signatur.
                Ich putze hier nur.
                **********************************

                Kommentar


                • #9
                  Hai,

                  Danke fuer Deine Worte, mit LIMIT hab ich mich noch nicht befasst, aber ich komme wohl nicht drum herum. Ueber mysql_fetch_assoc() bin ich heute zufaellig gestossen, hab auch noch nicht alles verstanden, aber hab auch nicht wirklich Zeit dafuer genommen. Mir steht noch einiges bevor.

                  Hab heute die Sortierung und Seitenteilung jeweils in Funktionen auf einer externe Seite abgeleg und durch include() eingelesen. Mir faellt auf, dass auf dieser Weise alles etwas langsamer laeuft.

                  Das mit SELECT * weiss ich jetzt schon, aber bin noch nicht dazu gekommen, um das zu aendern, weil ich erst mal all die anderen Fragen verstehen wollte. Ausserdem hatte ich wirklich in dem Fall alle Spalten einzulesen gebraucht, tut also jetzt noch nicht so weh.

                  Haha, oh je, ja, dass mit den $Sortmethod und $sortmethod hab ich tatsaechlich ernst gemeint und bin deswegen heute bei der Codeumaenderung auf oben erwahnten Function-Basis (nur mal ausprobieren) etwas auf die Nase gefallen. Jetzt hab ich $Sortmethd zu $SortMethD umgeaendert, hehe, aber ne gute Idee wird es trotzdem nicht, aber jetzt bin ich ja schon eines besseren gelernt.

                  Schade, dass ich jetzt nicht so viel Zeit habe, um mich ausgiebiger in die Materie reinzulesen. Aber bin schon stolz :P drauf, was ich in zwei Wochen von Null zu dem vorgestossen bin, was jetzt bei mir auf dem Server laeuft.

                  Also, Hausaufgabe fuer die naechsten paar Tage, LIMIT schlau machen und mysql_fetch_assoc() ausprobieren.

                  Wenn ich damit erfolgreich war, werde ich die geaenderten Codes hier rein tun.

                  ciao. Yang
                  www.rockinchina.com

                  Kommentar


                  • #10
                    Gibt es eine direktere Moeglichkeit, die Gesamtzeilenanzahl einer Tabelle zu ermitteln ausser mit "SHOW TABLE STATUS FROM"?

                    Hab naemlich gemerkt, dass mein
                    <? $num = mysql_num_rows($result); ?>
                    kein Sinn mehr macht, wenn ich beim SELECT-Befehl mit LIMIT angeben. Denn danach wird immer $num <= 20 sein.

                    Also muss ich irgendwie die Gesamtzeilenanzahl einer Tabelle herausfinden, aber hab nur "SHOW TABLE STATUS FROM" gefunden und das liefert wohl ein Array Wert, den ich wieder mit mysql_fetch_arrey() auseinander nehmen muss. Oder?
                    www.rockinchina.com

                    Kommentar


                    • #11
                      genau, andere und schwachsinnige lösung ist: normale abfrage und in der while vom fetch_assoc ne variable hochzählen
                      keine

                      Kommentar


                      • #12
                        Die Anzahl der Einträge kannst Du mit "SELECT COUNT(*) AS anzahl FROM..." abfragen.
                        Nach dem mysql_query natürlich wieder mysql_fetch_assoc() und dann den Index 'anzahl' nehmen.

                        mysql_num_rows() liefert die Zeilen im Ergebnis nicht in der Tabelle. Das war bei Dir vorher nur deswegen so, weil Du vollkommen unnötig die ganze Tabelle ausgelesen hast.

                        Was meinst Du mit externer Seite? Wie bindest Du die mit include ein?

                        Dass $Sortmethod und $sortmethod keine gute Idee war hast Du ja inzwischen gemerkt.

                        Alle Aufrufe von mysql_query() liefern ein Ergebnis, das Du danach mic mysql_fetch_assoc() abholen und auswerten kannst. Es gibt ja noch andere mysql_fetch_xyz Varianten, aber das darfst Du selbst in der Doku nachschlagen.
                        **********************************
                        Nein, ich bin nicht die Signatur.
                        Ich putze hier nur.
                        **********************************

                        Kommentar


                        • #13
                          Ich weiss nicht ob ich was falsch gemacht habe, aber hab viel probiert und gelesen und bin trotzdem nicht schlauer geworden.

                          Ich will einfach eine limitierte Menge an Datensaetzen ausgeben und gleichzeitig ermitteln, wieviel Datensatzzeilen es insgesammt gibt.

                          PHP-Code:
                          <?php

                          include("inc_db_inf.php");      //DB infos
                          mysql_connect($host,$user,$pass);
                          mysql_select_db($db) or die( "Unable to select database");

                          $result mysql_query("SELECT COUNT(*) AS anzahl 
                                                             FROM BandIndex 
                                                             LIMIT 0, 20"
                          );

                          $arr mysql_fetch_assoc($result);  
                          $num intval($arr['anzahl']);
                          //Ich konnte hier soweit erfolgreich die Gesamt Zeilen Zahl $num ermitteln
                                           
                          mysql_close();


                          while( 
                          $aaa=mysql_fetch_assoc($result) ) {
                          // wie kann ich die jeweiligen Werte der jeweiligen Zelle ausgeben?
                              
                          $id $aaa["id"]; 
                              
                          $BandEN =$aaa["BandEN"];
                              
                          $BandCN=$aaa["BandCN"];
                              
                          $Link=$aaa["Link"];
                              
                          $Genre=$aaa["Genre"];
                              
                          $City=$aaa["City"];    
                              
                          $Since=$aaa["Since"]; 
                                  echo 
                          "

                          $BandEN $BandCN $Genre</p>";

                          // so vielleicht?
                                  
                          echo $aaa['id'];
                          }

                          ?>
                          hier nach zeigt php zwar die $num richtig an aber bei der Ausgabe der Resultat-Arrey $aaa wird keine Zeile angezeigt, soll das dann heissen, dass da nichts gefunden wurde?

                          Kann ich denn
                          SELECT *
                          gleichzeitig mit
                          COUNT(*)
                          benutzen? oder
                          SELECT *
                          vielleicht
                          AS inhalt
                          oder sowas?
                          www.rockinchina.com

                          Kommentar


                          • #14
                            PHP-Code:
                            <?php
                            $num 
                            intval($arr['anzahl']);
                            //Ich konnte hier soweit erfolgreich die Gesamt Zeilen Zahl $num ermitteln
                                             
                            mysql_close(); // <-?
                            ?>
                            was soll das? du schließt die MySQL-Verbindung?

                            Kommentar


                            • #15
                              Na und?
                              Danach wird nur noch das Ergebnis des vorherigen Querys ausgelesen.
                              Die Verbindung dürfte doch nur für weitere Aufrufe von mysql_query notwendig sein.
                              **********************************
                              Nein, ich bin nicht die Signatur.
                              Ich putze hier nur.
                              **********************************

                              Kommentar

                              Lädt...
                              X