2010-07-29 2 views
5

Ich begann heute mit php und mysql zu arbeiten. Was ich eigentlich habe, ist eine leere Seite mit Stücken, die ich aus einer ID in einer Datenbank auslese. Also auf meiner Homepage habe ich eine URL, die wie folgt aussieht:php und mysql, Best Practices

<a href="content/display.php?id=id1"> 

Und dann in meinem display.php Ich habe dies:

<?php 
    include '../includes/header.php'; 
    $id = $_GET['id']; 
    $mysqli = new mysqli('localhost','username','password','dbname'); 
    if($result = $mysqli->query("SELECT * FROM portfolio WHERE id='".$id."'")) 
    { 
     while($row = $result->fetch_object()) 
     { 
      $head = $row->head; 
      $img1 = $row->img1; 
      $img2 = $row->img2; 
      $img_url = $row->imgurl; 
      $img_thumb = $row->imgthumb; 
      $vid = $row->vid; 
      $swf = $row->swf; 
      $url = $row->url; 
      $url_text = $row->urltext; 
      $text = $row->text; 
     } 
    } 
    else echo $mysqli->error; 
?> 

Es ist ein spärlicher Tisch, dass nicht alle dieser Felder wird Informationen haben (viele könnten null sein). Im Wesentlichen enthält sie Dateinamen und dann in der HTML-I-Code, der wie folgt aussieht:

if(isset($img1)) 
        { 
         echo '<img src="images/'.$img1.'" />'; 
        } 

Ein paar Fragen,

  1. Ist dies der beste Weg, dies zu tun?
  2. Jedes Mal, wenn ich die display.php besuche, öffne ich wieder eine Datenbankverbindung, richtig? Das kann nicht gut sein ...
  3. Ich entschied mich, die Namen der Dateien in die Datenbank zu setzen, anstatt ganze Pfadnamen oder sogar die eigentlichen Dateien selbst, um herauszufinden, ob ich den Namen der Datei I ändere kann in die Datenbank gehen und sie für die Datei aktualisieren, die ich ändern möchte. Wenn ich den Pfad ändere, kann ich es nur einmal im HTML ändern. Ist das die beste Idee?

Vielen Dank!

+0

(Re) Öffnen einer Datenbankverbindung ist gängige Praxis, sollte es nicht viel ausmachen. Ich wundere mich, warum Sie jede Eigenschaft des Objekts in einer anderen Variable möchten? – Wrikken

+0

Ich denke, also musste ich nicht die gesamte Website in diese While-Schleife wickeln ... Ich nehme an, dass ich das tun kann, obwohl – JPC

Antwort

6

1) Nein, obwohl das der einfachste Weg für den Anfang ist. Nachdem Sie sich mit den Grundlagen vertraut gemacht haben, sollten Sie einige Zeit damit verbringen, verschiedene Ansätze für die Anwendungsstruktur zu betrachten. Die wichtigste Regel ist die Trennung von Anliegen. Mischen Sie keinen Datenbankcode mit einem Geschäftslogikcode mit Präsentationscode. Aber wie gesagt, du solltest dir am ersten Tag keine Sorgen machen. Für jetzt nur Grundlagen lernen.

2) Es gibt eigentlich keinen anderen Weg. Für eine Webanwendung ist jede Anfrage vom Browser wie eine einzelne Anwendung. Es besteht die Möglichkeit, so genannte persistente Datenbankverbindungen zu verwenden, aber genau wie im vorherigen Punkt sollten Sie dies am ersten Tag nicht tun, da sie eine spezifische Konfiguration Ihres Webservers erfordern. Verwenden Sie zur Zeit nur normale Verbindungen.

3) Das ist ziemlich vernünftige Idee. Sie können Ihren Image-Pfad auch als PHP-Konstante definieren, so dass Sie im Falle einer Änderung nur diese eine Konstante ändern.

4) Was sAc in seiner Antwort sagt, ist sehr wichtig. Lesen Sie über SQL-Injektionen und wie Sie sie verhindern können.

+0

1) Ich kenne den MVC-Ansatz. Ich bin jedoch relativ neu in PHP. Ich habe Struts 2 verwendet und das Framework wurde zusammengestellt, um die Trennung von Geschäft, Daten und Präsentation zu erleichtern. Für zukünftige Referenz würde ich gerne mehr darüber erfahren, wie dies in PHP zu tun ist. Irgendwelche Tipps eines guten Führers mit anzufangen? Danke! – JPC

+0

Oh in diesem Fall ist es völlig anders reden :) Es gibt mehrere MVC-Frameworks für PHP zur Verfügung, die sich stark in Details der Implementierung unterscheiden. Eine sehr beliebte ist Zend Framework, viele sagen, es ist eigentlich eine Sammlung von lose gekoppelten Klassen. Auf der anderen Seite gibt es Frameworks wie Symfony, die das "configuration by convention" -Modell implementieren. Sie werden bestimmt etwas finden, das Ihren Bedürfnissen entspricht. – Mchl

+0

@ Col. Schrapnell Ich bin immer noch ein bisschen neu auf dieser Seite und antworte auf dem Protokoll. Ich wusste nicht, dass ich nur eine Antwort wählen konnte. – JPC

6

Sie sind anfällig für SQL injection, geben Sie richtig Ihre Variablen Stimmen:

$id = (int) $_GET['id']; 

Verwenden Funktionen wie mysql_real_escape_string oder noch besser nutzen:

+2

+1 für vorbereitete Anweisungen – Wrikken

+0

Ich habe vorbereitete Anweisungen für jdbc verwendet, aber nicht für php. Ich bin etwas vertraut. Ich werde das überprüfen. Da meine ID kein int ist, ist das was mysql_real_escape_string ist? Danke – JPC

+0

@JPC: Ja, Sie können 'what mysql_real_escape_string' verwenden. – Sarfraz

1

SQL-Injektion & vorbereitete Anweisungen werden bereits erwähnt.Eine Erweiterung das wäre:

else echo $mysqli->error; 

Ändern Sie diesen an:

else trigger_error($mysqli->error,E_USER_ERROR); 

Warum fragen Sie? Weil Besucher keine Ahnung von Ihrer Datenbank haben sollten und den Fehler nicht beheben können, sollten sie ihn also nicht sehen. Auf diese Weise können Sie sicher mit display_errors weitermachen, und auf der Live-Site display_errors ist ausgeschaltet, und Sie log_errors in einem Fehlerprotokoll.

+0

Woher werden die Fehler protokolliert? Muss ich display_errors und log_errors irgendwo konfigurieren? – JPC

+0

Ich würde argumentieren, dass der beste Weg ist, alle Fehler in ErrorExceptions zu transformieren, wie hier beschrieben http://php.net/manual/en/class.errorexception.php, aber wieder ist es ein etwas fortgeschritteneres Thema. – Mchl

+1

@Mchl Ausnahmen ist mehr von Fehler * Handhabung * während Wrikken spricht von Fehler * Tracking *. das sind andere Welten, die sich nicht einmischen. Eigentlich können Sie beide im selben Skript verwenden. –

1

Sieht so aus, als hätten Sie einen guten Griff auf was Sie tun möchten. Ich weiß nicht, wie viel Entwicklungshintergrund man hat, aber es wäre eine gute Idee, über MVC's in PHP wie CakePHP, Fuse oder sogar Zend Framework (bh !!!) zu lernen. Ich erspare Ihnen Zeit für robustere Anwendungen, indem ich vor allem all Ihre grundlegenden db-Schnittstellen, das Vorlagenhandling und die Sitzungsbehandlung definiere und Sie sich um Probleme auf höherer Ebene kümmern muss, wie zum Beispiel was zum Mittagessen gehört! :)