Visualizzazione risultati 1 fino 16 di 16

Discussione: Gestione titolo pagine in PHP e MySQL

  1. #1
    Data registrazione
    22-07-2013
    Residenza
    Isola d'Elba
    Messaggi
    18

    Lightbulb Gestione titolo pagine in PHP e MySQL

    Salve a tutti,
    mi rivolgo a voi non per un problema, ma per qualche consiglio utile da utilizzare.
    Sto facendo un sito che ha in tutte le pagine una sola pagina header, in modo che, se dovessi fare qualche modifica al codice di una pagina, non debba scrollare tutta la pagina dell'editor, e siccome non c'è la possibilità in HTML di fare diversi titoli per diverse pagine in un unico header, ho subito pensato a gestirlo tutto in PHP (un po' come avviene con Wordpress).
    Quello che ho fatto immediatamente è di creare una tabella "Pagine" con i campi "ID" (INT 11, Auto Increment), "Titolo" (VARCHAR 255) e "Url" (TEXT), ho inserito già una riga e ho iniziato a scrivere il codice PHP in un nuovo file chiamato "titolo.php", che verrà incluso nell'header con include. Questo è quello che ho fatto all'inizio:
    Codice PHP:
    <?php
    $url
    ="http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];

    $query="SELECT ID, Titolo FROM Pagine WHERE Url=$url";
    $res=mysql_query($query);

    if(
    $res && mysql_num_rows($res)>0){
    while(
    $row=mysql_fetch_assoc($res)){
    $titolo=$row['Titolo']."";
    ?>
    <title>Nome sito - <?php echo $titolo; ?></title>
    <?php }
    } else {
    ?>
    <title>Nome sito - No Titolo</title>
    <?php }
    ?>
    Il problema è che mi da il risultato dell'else, quindi è come se non avesse trovato nulla.
    Poi ho pensato. Siccome lavoro su una cartella e accedo con /nomecartella/ e non con /nomecartella/index.php (come avevo inserito nella colonna "Url", ho aggiunto un nuovo campo "Url2" con le stesse caratteristiche del campo "Url" e ho rinominato quest'ultimo in "Url1", ho modificato la query in "SELECT ID, Titolo FROM Pagine WHERE Url1=$url OR Url2=$url", ma il risultato non cambia.
    Inoltre, proprio in questo momento stavo cercando una soluzione per gli index delle cartelle e del root, in modo che, anche se si scrive /nomecartella/index.php, mi vada in /nomecartella/ e lo stesso con /index.php che vada in /. Cosa posso fare?
    Ringrazio in anticipo per qualsiasi risposta. :)

  2. #2
    L'avatar di javascripter
    javascripter non è connesso Moderatore
    Data registrazione
    14-02-2010
    Messaggi
    1,114

    Predefinito

    Per me c'è un errore nella query, per confrontare una stringa in SQL devi racchiuderla tra gli apici.
    Inoltre è opportuno utilizzare una funzione di escape per evitare iniezioni nelle query.

    E, comunque, ci sono delle funzioni che aiutano parecchio a determinare gli errori: mysql_error.
    Infine ti consiglio di passare a mysqli, mysql sarà un'estensione deprecata a partire da php5.5.0 (sarà rimossa in futuro).

    Per rimuovere index.php alla fine del percorso, puoi usare una semplice regola del modulo mod_rewrite di apache, inserisci questo nel file .htacess della cartella principale (root):
    Codice:
    RewriteEngine On
    RewriteBase /
    RewriteRule ^([^/]*?/?)index\.(php|html)$ $1 [R]
    Ultima modifica di javascripter : 01-09-2014 alle ore 14.11.43

  3. #3
    Data registrazione
    22-07-2013
    Residenza
    Isola d'Elba
    Messaggi
    18

    Predefinito

    Citazione Originalmente inviato da javascripter Visualizza messaggio
    Per rimuovere index.php alla fine del percorso, puoi usare una semplice regola del modulo mod_rewrite di apache, inserisci questo nel file .htacess della cartella principale (root):
    Codice:
    RewriteEngine On
    RewriteBase /
    RewriteRule ^([^/]*?/?)index\.(php|html)$ $1 [R]
    Grazie, infatti avevo pensato fosse una cosa da fare tramite .htaccess, però, non conoscendo bene .htaccess, non sapevo come fare.
    Citazione Originalmente inviato da javascripter Visualizza messaggio
    Per me c'è un errore nella query, per confrontare una stringa in SQL devi racchiuderla tra gli apici.
    Inoltre è opportuno utilizzare una funzione di escape per evitare iniezioni nelle query.
    Come potrei fare?
    Citazione Originalmente inviato da javascripter Visualizza messaggio
    Infine ti consiglio di passare a mysqli, mysql sarà un'estensione deprecata a partire da php5.5.0 (sarà rimossa in futuro).
    Inizierò a darci un'occhiata ;)

    EDIT: mi sono dimenticato di dire che ho risistemato la tabella del database, togliendo il campo Url2 e modificando "Url1" in "Url" e di conseguenza ho aggiornato la query
    EDIT2: ho preferito usare nella raccolta dell'Url solo $_SERVER['REQUEST_URI'], così da evitare di riscrivere tutto il dominio durante l'inserimento dell'Url nella tabella
    Ultima modifica di stefanograssi : 02-09-2014 alle ore 12.01.34

  4. #4
    L'avatar di javascripter
    javascripter non è connesso Moderatore
    Data registrazione
    14-02-2010
    Messaggi
    1,114

    Predefinito

    È molto semplice:
    Codice PHP:
    <?php
    $url
    = mysql_real_escape_string('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
    $query = "SELECT ID, Titolo FROM Pagine WHERE Url = '$url'";
    $res = mysql_query($query) || die('Errore: ' . mysql_error());

    if(
    mysql_num_rows($res) > 0) {
    $row = mysql_fetch_assoc($res);
    $titolo = $row['Titolo'];
    } else {
    $titolo = 'No Titolo';
    }
    ?>
    <title>Nome sito - <?php echo $titolo; ?></title>

  5. #5
    Data registrazione
    22-07-2013
    Residenza
    Isola d'Elba
    Messaggi
    18

    Predefinito

    Citazione Originalmente inviato da javascripter Visualizza messaggio
    È molto semplice:
    Codice PHP:
    <?php
    $url
    = mysql_real_escape_string('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
    $query = "SELECT ID, Titolo FROM Pagine WHERE Url = '$url'";
    $res = mysql_query($query) || die('Errore: ' . mysql_error());

    if(
    mysql_num_rows($res) > 0) {
    $row = mysql_fetch_assoc($res);
    $titolo = $row['Titolo'];
    } else {
    $titolo = 'No Titolo';
    }
    ?>
    <title>Nome sito - <?php echo $titolo; ?></title>
    Stessa storia... eppure è tutto collegato...

  6. #6
    L'avatar di javascripter
    javascripter non è connesso Moderatore
    Data registrazione
    14-02-2010
    Messaggi
    1,114

    Predefinito

    Puoi allegare il contenuto della tabella `Pagine`?

  7. #7
    Data registrazione
    22-07-2013
    Residenza
    Isola d'Elba
    Messaggi
    18

    Predefinito

    id titolo url
    1 Home /newsite/
    2 La prova funziona /newsite/prova.php
    Ultima modifica di stefanograssi : 02-09-2014 alle ore 17.42.45

  8. #8
    L'avatar di javascripter
    javascripter non è connesso Moderatore
    Data registrazione
    14-02-2010
    Messaggi
    1,114

    Predefinito

    Ecco, in php nella variabile url ci aggiungi http:// poi l'host (= tuosito.altervista.org).
    Quindi la query restituisce un insieme vuoto.

    Sostituisci nel codice, $url = ... con questo:
    Codice PHP:
    $url = mysql_real_escape_string($_SERVER['REQUEST_URI']);

  9. #9
    Data registrazione
    22-07-2013
    Residenza
    Isola d'Elba
    Messaggi
    18

    Predefinito

    Citazione Originalmente inviato da javascripter Visualizza messaggio
    Ecco, in php nella variabile url ci aggiungi http:// poi l'host (= tuosito.altervista.org).
    Quindi la query restituisce un insieme vuoto.

    Sostituisci nel codice, $url = ... con questo:
    Codice PHP:
    $url = mysql_real_escape_string($_SERVER['REQUEST_URI']);
    Citazione Originalmente inviato da stefanograssi Visualizza messaggio
    EDIT2: ho preferito usare nella raccolta dell'Url solo $_SERVER['REQUEST_URI'], così da evitare di riscrivere tutto il dominio durante l'inserimento dell'Url nella tabella
    Già ci avevo pensato

  10. #10
    Data registrazione
    22-07-2013
    Residenza
    Isola d'Elba
    Messaggi
    18

    Predefinito

    Vi aggiorno su quello che ho fatto.
    Allora, prima di tutto ho sistemato il codice con i consigli datomi da javascripter, solo che continua a non funzionare, non perchè non è corretto il codice, ma per un altro motivo: nella riga con include di config.php ho aggiunto
    Codice PHP:
    <?php
    include 'config.php' || die('Errore: ' . mysql_error());
    ?>
    e semplicemente mi dice che non ho selezionato nessun database, ma io avevo già fatto il collegamento.
    Non capisco però dove sto sbagliando, perchè comunque è un problema di collegamento al database. Nel caso vi lascio anche il config:
    Codice PHP:
    <?php

    mysql_connect
    ("thevolutiondrift.altervista.org", "thevolutiondrift", "password");
    mysql_select_db(my_thevolutiondrift);

    ?>
    edit:
    Non riesco a risolvere. Tutto sembra apposto, ma risulta sempre che non sia stato selezionato nessun database.
    Comunque vorrei farvi un'altra domanda: come faccio a includere una pagina che si trova ad esempio in un'altra directory? Perchè se faccio
    Codice PHP:
    <?php
    include '/cartella/file.php';
    include
    '/file.php';
    include
    '../file.php';
    ?>
    non mi appaiono? Devo per forza avere quei file nella stessa directory per forza? Questo vale sia per include_once che per require.
    Ultima modifica di javascripter : 05-09-2014 alle ore 20.29.29

  11. #11
    L'avatar di javascripter
    javascripter non è connesso Moderatore
    Data registrazione
    14-02-2010
    Messaggi
    1,114

    Predefinito

    L'host è semplicemente localhost, non nickname.altervista.org.
    Vedi qui per sapere meglio che dati usare per la connessione al db: http://forum.it.altervista.org/php-m...hpmyadmin.html

    Per quanto riguarda l'inclusione di file in diversi livelli (directory), puoi usare il percorso assoluto che è /membri/tuonickname/ (corrisponde alla directory root: /) oppure i percorsi relativi (.. per salire di una directory).
    Un'altra alternativa è di impostare l'include path (non se funziona su av) e richiedere i file semplicemente dal loro nome (e non includendo la directory nel percorso).
    Ultima modifica di javascripter : 05-09-2014 alle ore 20.30.13

  12. #12
    Data registrazione
    22-07-2013
    Residenza
    Isola d'Elba
    Messaggi
    18

    Predefinito

    Citazione Originalmente inviato da javascripter Visualizza messaggio
    L'host è semplicemente localhost, non nickname.altervista.org.
    Vedi qui per sapere meglio che dati usare per la connessione al db: http://forum.it.altervista.org/php-m...hpmyadmin.html
    La situazione non è cambiata per niente. Continua a fare quello che fa sempre, ovvero a darmi il risultato dell'else (senza il die sul config) o l'errore di connessione (con il die).
    Citazione Originalmente inviato da javascripter Visualizza messaggio
    Per quanto riguarda l'inclusione di file in diversi livelli (directory), puoi usare il percorso assoluto che è /membri/tuonickname/ (corrisponde alla directory root: /) oppure i percorsi relativi (.. per salire di una directory).
    Un'altra alternativa è di impostare l'include path (non se funziona su av) e richiedere i file semplicemente dal loro nome (e non includendo la directory nel percorso).
    Grazie per la risposta :)
    Ultima modifica di stefanograssi : 05-09-2014 alle ore 20.47.34

  13. #13
    L'avatar di javascripter
    javascripter non è connesso Moderatore
    Data registrazione
    14-02-2010
    Messaggi
    1,114

    Predefinito

    Comunque, giusto per precisare, rimuoverei l'or ( || ) qui:
    Codice PHP:
    include 'config.php' || die('Errore: ' . mysql_error());
    dato che il valore di ritorno include non ha nulla a che vedere con il successo della connessione al database.
    Piuttosto fai dei controlli in config.php direttamente.
    Ultima modifica di javascripter : 05-09-2014 alle ore 21.23.19

  14. #14
    Data registrazione
    22-07-2013
    Residenza
    Isola d'Elba
    Messaggi
    18

    Predefinito

    Citazione Originalmente inviato da javascripter Visualizza messaggio
    Ma hai attivato il database dal pannello di controllo?
    Certamente
    Citazione Originalmente inviato da javascripter Visualizza messaggio
    Comunque, giusto per precisare, rimuoverei l'or ( || ) qui:
    Codice PHP:
    include 'config.php' || die('Errore: ' . mysql_error());
    dato che il valore di ritorno include non ha nulla a che vedere con il successo della connessione al database.
    Piuttosto fai dei controlli in config.php direttamente.
    Farò quello che mi hai detto ;)

    EDIT: Nel config.php ho fatto in questo modo
    Codice PHP:
    <?php
    $con
    = mysql_connect("localhost", "thevolutiondrift", "password");
    if(!
    $con){
    die(
    "Connessione non riuscita - " . mysql_error());
    }
    $con_db = mysql_select_db("my_thevolutiondrift", $con);
    if (!
    $con_db){
    die(
    "Connessione non riuscita al database - " . mysql_error());
    }
    ?>
    E ancora una volta mi da il risultato dell'else... per l'ennesima volta...
    Ultima modifica di stefanograssi : 05-09-2014 alle ore 22.32.07

  15. #15
    L'avatar di javascripter
    javascripter non è connesso Moderatore
    Data registrazione
    14-02-2010
    Messaggi
    1,114

    Predefinito

    Credo di aver capito il problema:
    Codice PHP:
    $res = mysql_query($query) || die('Errore: ' . mysql_error());
    php valuta questa espressione e restituisce un valore booleano (true/false), quindi si perde il riferimento restituito da mysql_query.
    mysql_num_rows(true) non dovrebbe restituire valori superiori a 0 ed ecco che entra nell'else.

    Sostituiscilo con un semplice controllo:
    Codice PHP:
    $res = mysql_query($query);
    if(!
    $res) {
    die(
    'Errore: ' . mysql_error());
    }
    in questo modo il valore restuito da mysql_query resta integro.

    Mi scuso per aver introdotto questo problema

    P.S. Si può anche usare l'operatore or (anziché del simbolo ||) per preservare il valore di ritorno in condizioni come la precedente:
    Codice PHP:
    $res = mysql_query(...) or die('Errore: ' . mysql_error());
    Ultima modifica di javascripter : 06-09-2014 alle ore 12.27.14

  16. #16
    Data registrazione
    22-07-2013
    Residenza
    Isola d'Elba
    Messaggi
    18

    Predefinito

    Citazione Originalmente inviato da javascripter Visualizza messaggio
    Credo di aver capito il problema:
    Codice PHP:
    $res = mysql_query($query) || die('Errore: ' . mysql_error());
    php valuta questa espressione e restituisce un valore booleano (true/false), quindi si perde il riferimento restituito da mysql_query.
    mysql_num_rows(true) non dovrebbe restituire valori superiori a 0 ed ecco che entra nell'else.

    Sostituiscilo con un semplice controllo:
    Codice PHP:
    $res = mysql_query($query);
    if(!
    $res) {
    die(
    'Errore: ' . mysql_error());
    }
    in questo modo il valore restuito da mysql_query resta integro.

    Mi scuso per aver introdotto questo problema

    P.S. Si può anche usare l'operatore or (anziché del simbolo ||) per preservare il valore di ritorno in condizioni come la precedente:
    Codice PHP:
    $res = mysql_query(...) or die('Errore: ' . mysql_error());
    Ho visto ora il tuo post, ho sostituito direttamente || con or nella variabile $res e finalmente funziona come dovrebbe.
    Grazie di tutto.

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •