Visualizzazione risultati 1 fino 12 di 12

Discussione: Stampare stringhe contenenti codice php senza che venga eseguito?

  1. #1
    Guest

    Predefinito Stampare stringhe contenenti codice php senza che venga eseguito?

    Salve, volevo sapere se è possibile, utilizzando php, stampare una variabile contenente lo stesso codice php senza che esso venga eseguito dal server
    Codice PHP:
    <?php
    $var
    = "<?php echo 'Ciao.'; ?>";
    echo
    $var;
    ?>
    e che questo codice dia come output qualcosa tipo <?php echo 'Ciao.'; ?> senza che il codice venga eseguito dal server

  2. #2
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,683

    Predefinito

    In realtà così come lo hai scritto, quella stringa non viene eseguita dal server, ma stampa proprio quello che vuoi. Il fatto che non "si veda" è che ci sono i caratteri "< ... >" e i browser lo interpretano come tag html, quindi non lo mostrano a video (ma se guardi nel sorgente html, c'é!).

    Quindi, ad esempio dovresti farlo passare nella htmlentities() così di trasformare i vari caratteri nelle rispettive entità html.

    Ti linko anche questa funzione che può servirti.

    Ciao!

  3. #3
    Guest

    Predefinito

    Citazione Originalmente inviato da alemoppo Visualizza messaggio
    In realtà così come lo hai scritto, quella stringa non viene eseguita dal server, ma stampa proprio quello che vuoi. Il fatto che non "si veda" è che ci sono i caratteri "< ... >" e i browser lo interpretano come tag html, quindi non lo mostrano a video (ma se guardi nel sorgente html, c'é!).

    Quindi, ad esempio dovresti farlo passare nella htmlentities() così di trasformare i vari caratteri nelle rispettive entità html.

    Ti linko anche questa funzione che può servirti.

    Ciao!
    Il motivo originale per questa mia domanda era che stavo cercando un modo per creare nuovi file php dinamicamente direttamente in una pagina web ma mantenendo in tutti il codice php di base. Nel mio caso sto cercando di creare un sistema che permetta di scrivere articoli e creare pagine dinamiche che li visualizzino cercando nel database un id che è presente nel nome stesso del file dell'articolo.
    La domanda quindi diventerebbe: si può fare quello che ho scritto sopra?

    Codice PHP:

    $article_php = "
    <?php
    session_start
    ();
    error_reporting(E_ALL);
    require_once(
    '../../scripts/config.php');
    require_once(
    '../../scripts/connection.php');

    $article_id = substr($_SERVER[PHP_SELF], 10);
    $article_id = explode('-', $article_id);
    $query = sprintf('SELECT article_author, article_title, article_body, article_date FROM articles WHERE article_id=%d', mysql_real_escape_string($article_id[0]));
    $result = mysql_query($query) or die(mysql_error());
    if(
    mysql_num_rows($result) == 1){
    $row = mysql_fetch_array($result);
    $author = $row[article_author];
    $title = $row[article_title];
    $body = $row[article_body];
    $date = $row [article_date];
    }
    ?>
    <!doctype html>
    <html>
    <head>
    <meta charset='utf-8'>
    <title><? echo $title; ?> | Zombie</title>
    </head>

    <body>
    <h1><?php echo $title; ?></h1>
    <h5>Scritto da <?php echo $author; ?> il <?php echo $date; ?></h5>
    <div><p><?php echo $body; ?></p></div>
    </body>
    </html>";
    $article_path = "../Articoli/".$a_num."-".$url_title;
    mkdir($article_path, 0777);
    $article = fopen("../Articoli/".$a_num."-".$url_title."/index.php", "w");
    fputs($article, ARTICLE_PHP);
    fclose($article);
    Il codice qui sopra idealmente servirebbe per creare un file contenente il codice della variabile $article_php, ma visto che non funziona mi chiedo dove sto sbagliando o se c'è un altro modo per fare ciò.
    Grazie

  4. #4
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,683

    Predefinito

    • Codice PHP:
      $article_php = "
      è fuori i tag <php ?>, quindi non verrà interpretato.
    • visto che usi le sessioni (in praticolare session_start(), anche se non ne ho capito il motivo), prima della sua invocazione non puoi scrivere alcun output html, quindi sia il ritorno a capo, sia il pezzo php sopra fuori dai tag php dovresti eliminarli.
    • Perché dopo il tag di chiusura </html>, hai i caratteri "; ?
    • Con questo:
      Codice PHP:
      $article_path = "../Articoli/".$a_num."-".$url_title;
      mkdir($article_path, 0777);
      $article = fopen("../Articoli/".$a_num."-".$url_title."/index.php", "w");
      fputs($article, ARTICLE_PHP);
      fclose($article);
      Stai cercando di aprire lo stesso file?. Ma in questo modo leggi anche il sorgente (in pratica copi tutto il file, completo). Una cosa simile si potrebbe fare impostando l'url completa (http://tuosito.altervista.org/file.php), così lo script pensa che sia un file esterno dal tuo sito e preleva soltanto il codice html (quindi il PHP già interpretato). Però questa non è assolutamente il modo migliore e più intelligente di procedere: sfruttando PHP, puoi creare "al volo" pagine differenti specificando di parametri GET per distinguerle. Non è semplicissimo spiegarlo, quindi ti faccio un esempio:

      articolo.php:
      Codice PHP:
      <?php
      if(isset($_GET['id']))
      {
      $article_id = $_GET['id'];

      /* tuo codice */
      $query = sprintf('SELECT article_author, article_title, article_body, article_date FROM articles WHERE article_id=%d',
      mysql_real_escape_string($article_id[0]));
      $result = mysql_query($query) or die(mysql_error());
      if(
      mysql_num_rows($result) == 1){
      $row = mysql_fetch_array($result);
      $author = $row['article_author'];
      $title = $row['article_title'];
      $body = $row['article_body'];
      $date = $row ['article_date'];
      }
      }
      ?>
      <!doctype html>
      <html>
      ...
      <title><?= $title ?></title>
      <body>
      ...
      <?= $author ?>
      ...
      <?= $body ?>
      ..
      </body>
    • Infine (anche se questo non è un errore), come dice la documentazione è bene utilizzare la libreria delle funzioni improved (ovvero le funzioni mysqli_*, e non mysql_* che sono ormai obsolete...).


    Il parametro GET si da tramite l'url, del tipo:
    tuosito.altervista.org/articolo.php?id=3

    Spero di essermi spiegato decentemente...

    Ciao!
    Ultima modifica di alemoppo : 19-02-2014 alle ore 12.43.44

  5. #5
    Guest

    Predefinito

    Allora ho capito cosa intendi ma quello che ho inserito non è il codice completo della pagina che sarebbe il seguente
    Codice PHP:
    <?php
    session_start
    ();
    error_reporting(E_ALL);
    require_once(
    '../scripts/config.php');
    require_once(
    '../scripts/connection.php');
    require_once(
    '../Login e registrazione/Users_class.php');
    $user = new Users;
    /* Controllo se l'utente è loggato */
    $is_logged = $user->is_logged();
    if(
    $is_logged === FALSE){
    header("Location: ../Login e registrazione/Signin.php");
    exit;
    }

    /* Controllo privilegi utente */
    $group_permitted = $user->check_group(1);
    if(
    $group_permitted === FALSE){
    echo
    "Non sei autorizzato a visitare questa pagina.";
    exit;
    }

    /* Se l'articolo è stato inviato */
    if(isset($_POST['a_submit']) AND isset($_POST['a_title']) AND isset($_POST['a_body'])){
    $title = trim($_POST['a_title']);
    $body = trim($_POST['a_body']);
    $url_title = str_replace(" ", "-", $title);
    $user_id = $_SESSION['auth'];
    $author = $_SESSION['username_logged'];
    $query = sprintf("SELECT * FROM users WHERE user_id='%d' and username='%s'", mysql_real_escape_string($user_id), mysql_real_escape_string($author));
    $result = mysql_query($query) or die('Err_1: ' .mysql_error());
    $row = mysql_fetch_assoc($result);
    $query = sprintf("INSERT INTO articles
    (article_author_id, article_author, article_title, article_body, article_date)
    VALUES
    ('%d', '%s', '%s', '%s', NOW())"
    ,
    mysql_real_escape_string($user_id),
    mysql_real_escape_string($username),
    mysql_real_escape_string($title),
    mysql_real_escape_string($body));
    $result = mysql_query($query) or die('Err_2 '.mysql_error());
    $a_num = mysql_insert_id();
    $article_php = "
    <?php
    session_start();
    error_reporting(E_ALL);
    require_once('../../scripts/config.php');
    require_once('../../scripts/connection.php');

    $article_id = substr($_SERVER[PHP_SELF], 10);
    $article_id = explode('-', $article_id);
    $query = sprintf('SELECT article_author, article_title, article_body, article_date FROM articles WHERE article_id=%d', mysql_real_escape_string($article_id[0]));
    $result = mysql_query($query) or die(mysql_error());
    if(mysql_num_rows(
    $result) == 1){
    $row = mysql_fetch_array($result);
    $author = $row[article_author];
    $title = $row[article_title];
    $body = $row[article_body];
    $date = $row [article_date];
    }
    ?>
    <!doctype html>
    <html>
    <head>
    <meta charset='utf-8'>
    <title><? echo
    $title; ?> | Zombie</title>
    </head>

    <body>
    <h1><?php echo
    $title; ?></h1>
    <h5>Scritto da <?php echo
    $author; ?> il <?php echo $date; ?></h5>
    <div><p><?php echo
    $body; ?></p></div>
    </body>
    </html>"
    ;
    $article_path = "../Articoli/".$a_num."-".$url_title;
    mkdir($article_path, 0777);
    $article = fopen("../Articoli/".$a_num."-".$url_title."/index.php", "w");
    fputs($article, ARTICLE_PHP);
    fclose($article);
    // redirect all'articolo creato
    exit;
    }
    ?>
    <!doctype html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>Crea un nuovo articolo</title>
    </head>

    <body>
    <form action="Prova_2.php" method="post" id="new_article">
    <input name="a_title" type="text" size="50" maxlength="50" placeholder="Inserisci il titolo"/><br />
    <textarea name="a_body" cols="80" rows="15" placeholder="Scrivi qui il tuo articolo"></textarea>
    <br />
    <input type="submit" value="Pubblica" name="a_submit"><br />
    </form>
    </body>
    </html>
    Questa pagina prima verifica che sia stato eseguito il login e nel caso fa un redirect, poi verifica che l'utente sia un amministratore cercando nel database se il campo user_group ha valore 1 per quell'utente infine se l'articolo è stato inviato inserisce i dati nel database e quello che vorrei che facesse sarebbe creare una cartella ed un file index.php al suo interno per che visualizzi l'articolo, se poi l'articolo non è stato inviato visualizza un form per scrivere l'articolo.
    Non so se sono stato abbastanza chiaro ma grazie!

  6. #6
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,683

    Predefinito

    Ah, adesso mi è più chiaro. Nella fputs sostituisci ARTICLE_PHP con $article_php. Comunque, questo modo non è il più corretto. Ad esempio, mettiamo caso che hai 100 articoli e vuoi cambiare una parte del sito (ad esempio la grafica o la posizione di qualcosa, come un banner, etc), dovresti modificare a mano 100 file (o costruire uno script apposito che faccia la modifica in automatico!). Invece, nel modo che ti ho detto sopra è sufficiente modificare solo la pagina principale, perché i contenuti sono dinamici. Inoltre, in quel modo occupi spazio inutile visto che se generi le pagine, queste occupano solo per una.
    Vedi anche questo, che salva il contenuto su file. Se lo salvi su database è la stessa cosa (invece dell'include, stampi il contenuto prelevato da database).

    Ciao!

  7. #7
    Guest

    Predefinito

    La principale ragione per cui non sto utilizzando la variabile GET è perché essendo ancora un "beginner" in php sto sperimentando vari metodi che non siano tanto funzionali ma che mi servano per capire il funzionamento delle funzioni principali di php. Riguardo al mio codice nella fputs dove avevo inserito ARTICLE_PHP l'avevo già corretto ma inserendo il codice in questa discussione ne ho preso una copia meno recente e non corretta in ogni caso vorrei capire perché da quel codice una volta inviato il form ne viene fuori questa sorgente
    Codice HTML:
    <head></head><body><br>
    <b>Notice</b>:  A session had already been started - ignoring session_start() in <b>/membri/zombiesproexperience/Login e registrazione/Users_class.php</b> on line <b>2</b><br>
    <br>
    <b>Notice</b>:  Undefined variable: username in <b>/membri/zombiesproexperience/Articoli/Prova_2.php</b> on line <b>37</b><br>
    <br>
    <b>Notice</b>:  Undefined variable: article_id in <b>/membri/zombiesproexperience/Articoli/Prova_2.php</b> on line <b>49</b><br>
    <br>
    <b>Notice</b>:  Undefined variable: article_id in <b>/membri/zombiesproexperience/Articoli/Prova_2.php</b> on line <b>50</b><br>
    <br>
    <b>Notice</b>:  Undefined variable: article_id in <b>/membri/zombiesproexperience/Articoli/Prova_2.php</b> on line <b>51</b><br>
    <br>
    <b>Notice</b>:  Undefined variable: article_id in <b>/membri/zombiesproexperience/Articoli/Prova_2.php</b> on line <b>51</b><br>
    <br>
    <b>Notice</b>:  Undefined index:  article_author in <b>/membri/zombiesproexperience/Articoli/Prova_2.php</b> on line <b>55</b><br>
    <br>
    <b>Notice</b>:  Undefined index:  article_title in <b>/membri/zombiesproexperience/Articoli/Prova_2.php</b> on line <b>56</b><br>
    <br>
    <b>Notice</b>:  Undefined index:  article_body in <b>/membri/zombiesproexperience/Articoli/Prova_2.php</b> on line <b>57</b><br>
    <br>
    <b>Notice</b>:  Undefined variable: date in <b>/membri/zombiesproexperience/Articoli/Prova_2.php</b> on line <b>58</b><br>
    <br>
    <b>Notice</b>:  Undefined variable: date in <b>/membri/zombiesproexperience/Articoli/Prova_2.php</b> on line <b>71</b><br>
    
    <!--?php
    session_start();
    error_reporting(E_ALL);
    require_once('../../scripts/config.php');
    require_once('../../scripts/connection.php');
    
     = substr(/Articoli/Prova_2.php, 10);
     = explode('-', );
    INSERT INTO articles
                   (article_author_id, article_author, article_title, article_body, article_date)
                   VALUES
                   ('Id_utente', 'username_utente', 'Titolo_articolo', 'Corpo_articolo', NOW()) = sprintf('SELECT article_author, article_title, article_body, article_date FROM articles WHERE article_id=%d', mysql_real_escape_string());
    1 = mysql_query(INSERT INTO articles
                   (article_author_id, article_author, article_title, article_body, article_date)
                   VALUES
                   ('Id_utente', 'username_utente', 'Titolo_articolo', 'Corpo_articolo', NOW())) or die(mysql_error());
    if(mysql_num_rows(1) == 1){
    	Array = mysql_fetch_array(1);
    	Username_utente = ;
    	Titolo_articolo = ;
    	Corpo_articolo = ;
    	 = Array [article_date];
    }
    ?-->
    
    
    
    <meta charset="utf-8">
    <title>&lt;? echo Prova; ?&gt; | Zombie</title>
    
    
    
    <h1><!--?php echo Titolo_articolo; ?--></h1>
    <h5>Scritto da <!--?php echo Username_utente; ?--> il <!--?php echo ; ?--></h5>
    <div><p><!--?php echo Corpo_utente; ?--></p></div>
    
    </body>
    Ho sostituito al nome nome dell'utente username_utente, all'id dell'utente Id_utente, al titolo dell'articolo Titolo_articolo, al corpo dell'articolo Corpo_articolo. La mia domanda è perché la pagina che crea un articolo genera questo codice e perché alcuni parti come la data sono completamente mancanti?
    Ps. Nella pagina che lo crea (quella del codice dei messaggi precedenti) ho inserito prima dell'exit dopo l'inserimento nel database dei dati, un echo $article_php e questo è la sorgente del risultato.

  8. #8
    Guest

    Predefinito

    Non ne sono sicuro, ma prova a sostituire nel file che "creatore" i $ con \$ ...

  9. #9
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,683

    Predefinito

    Citazione Originalmente inviato da ZombiesProExperience Visualizza messaggio
    essendo ancora un "beginner" in php sto sperimentando vari metodi che non siano tanto funzionali ma che mi servano per capire il funzionamento delle funzioni principali di php.
    Ah, okok.
    Hai una session_start() in qualche pagina inclusa (Users_class.php). Se invochi quella funzione più volte, appare quel "notice".
    Rimanendo nella session_start(), non puoi scrivere dell'html prima di invocare quella funzione:
    Codice PHP:
    <head></head><body><br>
    [..
    vari notice..]
    <!--?
    php
    session_start
    ();
    Inoltre, noto che stai usando "<!--?php" ma non è corretto: per aprire php in generale, devi usare:
    Codice PHP:
    <?php
    Probabilmente hai visto dallo script sopra questo:
    Codice PHP:
    <?=
    che non è altro che una forma compatta per scrivere:
    Codice PHP:
    <?php echo
    Per i simboli "$", puoi fare come ti ha detto tampertools, oppure usare gli apici singoli per delimitare le stringhe: con i doppi apici, il PHP sostituisce invece le variabili che scrivi con il loro valore. Invece con gli apici singoli scrive il "nome" della variabile, senza sostituire il suo valore.

    Inoltre, visto che stai imparando ora, non ti conviene utilizzare le funzioni mysql_* perché sono deprecate. Dovresti usare la versione "improved", ovvero le funzioni (o metodi) mysqli_*

    Ciao!

  10. #10
    Guest

    Predefinito

    Credo di essere riuscito finalmente a risolvere il tutto dividendo il codice di base per ogni file che diviene un articolo in due parti: una solo php e una html; la prima passandola attraverso la funzione eval() viene esguita dal server, la seconda stampa i risultati a video nel codice html. Vi lascio qui il codice:
    Codice PHP:
    <?php
    session_start
    ();
    error_reporting(E_ALL);
    require_once(
    '../scripts/config.php');
    require_once(
    '../scripts/connection.php');
    require_once(
    '../Login e registrazione/Users_class.php');
    $user = new Users;
    /* Controllo se l'utente è loggato */
    $is_logged = $user->is_logged();
    if(
    $is_logged === FALSE){
    header("Location: ../Login e registrazione/Signin.php");
    exit;
    }

    /* Controllo privilegi utente */
    $group_permitted = $user->check_group(1);
    if(
    $group_permitted === FALSE){
    echo
    "Non sei autorizzato a visitare questa pagina.";
    exit;
    }

    /* Se l'articolo è stato inviato */
    if(isset($_POST['a_submit']) AND isset($_POST['a_title']) AND isset($_POST['a_body'])){
    $title = trim($_POST['a_title']);
    $body = trim($_POST['a_body']);
    $url_title = str_replace(" ", "-", $title);
    $user_id = $_SESSION['auth'];
    $author = $_SESSION['username_logged'];
    $query = sprintf("SELECT * FROM users WHERE user_id='%d' and username='%s'", mysql_real_escape_string($user_id), mysql_real_escape_string($author));
    $result = mysql_query($query) or die('Err_1: ' .mysql_error());
    $row = mysql_fetch_assoc($result);
    $query = sprintf("INSERT INTO articles
    (article_author_id, article_author, article_title, article_body, article_date)
    VALUES
    ('%d', '%s', '%s', '%s', NOW())"
    ,
    mysql_real_escape_string($user_id),
    mysql_real_escape_string($author),
    mysql_real_escape_string($title),
    mysql_real_escape_string($body));
    $result = mysql_query($query) or die('Err_2 '.mysql_error());
    $a_num = mysql_insert_id();
    $article_php = eval('
    session_start();
    error_reporting(E_ALL);
    require_once("../scripts/config.php");
    require_once("../scripts/connection.php");

    $article_id = substr($_SERVER[PHP_SELF], 10);
    $article_id = explode("-", $article_id);
    $query = sprintf("SELECT article_author, article_title, article_body, article_date FROM articles WHERE article_id=%d", mysql_real_escape_string($article_id[0]));
    $result = mysql_query($query) or die(mysql_error());
    if(mysql_num_rows($result) == 1){
    $row = mysql_fetch_array($result);
    $author = $row[article_author];
    $title = $row[article_title];
    $body = $row[article_body];
    $date = $row["article_date"];
    }'
    );
    $article_php .= "
    <!doctype html>
    <html>
    <head>
    <meta charset='utf-8'>
    <title>
    $title | Zombie</title>
    </head>

    <body>
    <h1>
    $title</h1>
    <h5>Scritto da
    $author il $date </h5>
    <div><p>
    $body</p></div>
    </body>
    </html>"
    ;
    $article_path = "../Articoli/".$a_num."-".$url_title;
    mkdir($article_path, 0777);
    $article = fopen("../Articoli/".$a_num."-".$url_title."/index.php", "w");
    fputs($article, $article_php);
    fclose($article);
    // redirect all'articolo creato
    exit;
    }
    ?>
    <!doctype html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>Crea un nuovo articolo</title>
    </head>

    <body>
    <form action="Prova_2.php" method="post" id="new_article">
    <input name="a_title" type="text" size="50" maxlength="50" placeholder="Inserisci il titolo"/><br />
    <textarea name="a_body" cols="80" rows="15" placeholder="Scrivi qui il tuo articolo"></textarea>
    <br />
    <input type="submit" value="Pubblica" name="a_submit"><br />
    </form>
    </body>
    </html>
    Ciao e grazie per l'aiuto ;)

  11. #11
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,683

    Predefinito

    Non ho capito perché hai usato eval().

    Ciao!

  12. #12
    Guest

    Predefinito

    Perchè se non usassi eval il server che esegue lo script non inserirebbe il codice della stringa $article_php considerandolo come codice php e quindi da eseguire al caricamento della pagina ma stamperebbe la variabile come testo
    Ciao :D

Regole di scrittura

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