2010-07-29 15 views
5

Ho iniziato a lavorare con php e mysql oggi. Fondamentalmente, quello che ho, è una pagina vuota con dei pezzi che riempio dalla ricerca di un id in un database. Così sulla mia home page ho un URL che assomiglia a questo:php e mysql, best practice

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

E poi nel mio display.php ho questo:

<?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; 
?> 

E 'una tabella sparsa in che non tutti i campi avrà informazioni (molte potrebbero essere nulle). Fondamentalmente essi contiene i nomi di file e poi in html Ho codice che assomiglia a questo:

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

Un paio di domande,

  1. È questo il modo migliore per farlo?
  2. Ogni volta che visito display.php, sto riaprendo una connessione al database, giusto? Non può essere buono ...
  3. Ho scelto di mettere i nomi dei file nel database, piuttosto che i nomi di interi percorsi, o anche i file veri e propri, immaginando che, se cambio il nome del file I può andare nel database e aggiornarlo per il file che voglio cambiare. Se cambio il percorso, posso semplicemente cambiarlo una volta in html. È la migliore idea?

Grazie!

+0

(ri) l'apertura di una connessione al database è una pratica comune, non dovrebbe avere molta importanza. Mi chiedo perché tu voglia ogni proprietà dell'oggetto in un'altra variabile? – Wrikken

+0

Suppongo quindi di non dover avvolgere l'intero sito in quel ciclo while ... Suppongo di poterlo fare anche se – JPC

risposta

6

1) No, anche se questo è il modo più semplice per iniziare. Dopo esserti sentito a tuo agio con le basi, dovresti dedicare del tempo a considerare diversi approcci alla struttura dell'applicazione. La regola più importante è separare le preoccupazioni. Non mescolare il codice del database con il codice della logica aziendale con il codice di presentazione. Ma come ho detto, non è qualcosa di cui dovresti preoccuparti il ​​primo giorno. Per ora basta imparare le basi.

2) Non c'è altro modo in realtà. Per un'applicazione Web, ciascuna richiesta del browser è come una singola esecuzione dell'applicazione. Esiste la possibilità di utilizzare le cosiddette connessioni persistenti del database, ma proprio come nel punto precedente, è qualcosa che non dovresti affrontare il primo giorno, poiché richiedono una configurazione specifica del tuo server web. Per il momento, usa solo le normali connessioni.

3) Questa è un'idea abbastanza sensata. Puoi anche definire il percorso dell'immagine come costante PHP, in modo che, nel caso in cui sia necessario un cambiamento, tu cambi solo questa costante.

4) Quello che dice sAc nella sua risposta è molto importante. Leggi le iniezioni SQL e come prevenirle.

+0

1) Ho familiarità con l'approccio MVC. Tuttavia, sono abbastanza nuovo per PHP. Ho usato Struts 2 e il framework è stato messo insieme per facilitare la separazione di business, dati e presentazioni. Per riferimento futuro, mi piacerebbe saperne di più su come farlo in PHP. Qualche consiglio su una buona guida per iniziare? Grazie! – JPC

+0

Oh, in tal caso è un discorso completamente diverso :) Ci sono diversi framework MVC per PHP disponibili che differiscono notevolmente nei dettagli di implementazione. Uno molto popolare è Zend Framework, molti dicono che in realtà è una raccolta di classi vagamente accoppiate. D'altra parte ci sono framework come Symfony che implementano il modello 'configurazione per convenzione'. Troverai sicuramente qualcosa che si adatta alle tue esigenze. – Mchl

+0

@Col. Shrapnel Sono ancora un po 'nuovo in questo sito e nel rispondere al protocollo. Non avevo capito che potevo scegliere solo una risposta. – JPC

6

si sono vulnerabili a SQL injection, digitare correttamente gettato le variabili:

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

utilizzare le funzioni quali mysql_real_escape_string o anche utilizzare meglio:

+2

+1 per le istruzioni preparate – Wrikken

+0

Ho usato istruzioni preparate per jdbc ma non per php quindi I ' m un po 'familiare. Lo controllerò. Dal momento che il mio id non è un int, è a cosa serve mysql_real_escape_string? Grazie – JPC

+0

@JPC: Sì, puoi usare 'what mysql_real_escape_string'. – Sarfraz

1

SQL injection & le dichiarazioni preparate sono già menzionate.Un aggiunta a ciò potrebbe essere:

else echo $mysqli->error; 

Change che a:

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

Perché si chiede? Perché i visitatori non dovrebbero avere idea del tuo database e non possono correggere l'errore, quindi non dovrebbero vederlo. In questo modo, è possibile sviluppare in modo sicuro con display_errors attivo e sul sito attivo display_errors disattivato e in un registro errori.

+0

dove vengono registrati gli errori? devo configurare display_errors e log_errors da qualche parte? – JPC

+0

Direi che in realtà il modo migliore è trasformare tutti gli errori in ErrorExceptions come descritto qui http://php.net/manual/en/class.errorexception.php, ma ancora una volta è un argomento un po 'più avanzato. – Mchl

+1

Le eccezioni di @Mchl sono più di errore * di gestione * mentre Wrikken sta parlando di errore * monitoraggio *. sono mondi diversi, che non interferiscono. In realtà puoi usare entrambi nello stesso script. –

1

Sembra che tu abbia una buona padronanza di ciò che vuoi fare. Non so quanti background di sviluppo hai, ma sarebbe una buona idea iniziare a conoscere MVC in php come CakePHP, Fuse, o anche Zend Framework (bleh !!!). Ti farò risparmiare tempo su applicazioni più robuste definendo tutta la tua interfaccia db di base, la gestione dei template, la gestione delle sessioni e ti preoccuperai di problemi di livello superiore, come quello che è per pranzo! :)