Autore Topic: Porcheggiando Ho guadagnato un Posto d'onore nel girone dei bestemmiatori  (Letto 638 volte)

ARM_

  • Visitatore
Allora, mi rimetto all'infinita saggezza dei frequentatori del forum.

Premessa: Ho messo le zampe su un sito, lo sto tirando su tutto a manina perchè le soluzioni che trovo in giro non mi garbano e ho viglia di imparare.

Per imitare il comportamento dei frame ho ripiegato su PHP, usando la funzione include(), che appunto mi include su una pagina fissa contenuti diversi per ogni link che struco.

tutto funziona bene, ma ora voglio importare anche i valori dei tag <meta name=description e <meta name=keywords.

valori dei suddetti tag li ho messi all'inizio di ogni pagina da includere, all'interno di
Codice: [Seleziona]
<?php
 $keywords
="blablabla";
 
$description="blablabla";
?>

il problema è che non ho idea di come richiamarli quando è ora di generare il contenuto dei tag meta.

se uso
Codice: [Seleziona]
    echo '<meta name="keywords" content="'.$keywords.'">';
    echo '<meta name="description" content="'.$description.'">';
ovviamente mi risponde cippidimerlo e i tag restano vuoti.

se uso anche qui include(paginahtml) raggiungo il risultato ma mi trovo il contenuto inserito due volte

la soluzione di mettere i tag in un file diverso funzionerebbe ma vorrei evitarla, appesantirebbe troppo il lavoro, specie quello di manutenzione.

giocare con i commenti <<!-- --> e qualche funzione di sostituzione funzionerebbe ma come soluzione mi induce una sana regolarità intestinale.

la situazione attuale è:

index.php con:
<head>
   title, meta, stylesheet e favicon
</head>
<body>
   scheletro del sito
   script php che richiama dinamicamente le sottopagine da visualizzare (e relativi controlli su chi richiama cosa)
</body>

chiedo aiuto

turlando

  • Visitatore
Re:Porcheggiando Ho guadagnato un Posto d'onore nel girone dei bestemmiatori
« Risposta #1 il: Dicembre 02, 2011, 07:33:29 pm »
Non tocco php da tanto tempo, ma credo che echo "<meta name=\"description\" content=\"$description\">"; possa funzionare.

Ti consiglio di fare così, comunque:
index.php
Codice: [Seleziona]
<?php
define
('YOMAMA'1);
require_once 
'init.php';
?>

init.php
Codice: [Seleziona]
<?php
if (!YOMAMA) die 'Hacking attempt.';
require_once 
'config.php'// dove metti ad esempio $keywords="blablabla";
?>

<!doctype html>
<html lang="it">
<head>
<title>pagina</title>
<meta name="keywords" content="<?php echo $keywords?>" />
</head>
<body>
</body>
</html>

Il codice è scritto di fretta e senza indentazione, è solo per darti un'idea, poi dovrai riscriverlo.
In poche parole obblighi gli utenti a passare da index.php, ovviamente devi mettere if (!YOMAMA) die 'Hacking attempt.'; in ogni pagina e tutto deve passare da index.php.
Ti do alcune dritte di programmazione e markup:
- In php evita di usare gli short tags (<? blargh(); ?>, etc...) e prediligi sempre i long tags (<?php blargh(); ?>).
- Evita di far generare a php codice html. Ergo niente echo "<html><tag><p>yomama</p></tag></html>";
- Non usare roba che funziona solo su Netscape 2.03 prerelease-beta-dev e quindi attento a ciò che metti nei css e ai tag deprecati di html. Attieniti sempre allo standard che vai a scegliere (html 4.01, html 5...)
- Mi verrà qualcos'altro in mente.
« Ultima modifica: Dicembre 02, 2011, 07:47:32 pm da turlando »

ARM_

  • Visitatore
Re:Porcheggiando Ho guadagnato un Posto d'onore nel girone dei bestemmiatori
« Risposta #2 il: Dicembre 02, 2011, 09:48:58 pm »
Grazie mille, ma non riesco a capire cosa faccia il codice. e poi con require_once non riuscirei più a includere il resto del documento più sotto nei meandri della pagina. o sbaglio?

pensandoci sarebbe molto più semplice se si potesse passare a include() un'altra funzione che fa includere un documento solo fino a una determinata stringa. A questo punto tra lo script php che mi assegna le variabili e il testo html da includere basterebbe inserire quella stringa.

turlando

  • Visitatore
Re:Porcheggiando Ho guadagnato un Posto d'onore nel girone dei bestemmiatori
« Risposta #3 il: Dicembre 02, 2011, 09:52:57 pm »
Grazie mille, ma non riesco a capire cosa faccia il codice. e poi con require_once non riuscirei più a includere il resto del documento più sotto nei meandri della pagina. o sbaglio?
Sì, infatti quei files devono essere inclusi SOLO una volta.

pensandoci sarebbe molto più semplice se si potesse passare a include() un'altra funzione che fa includere un documento solo fino a una determinata stringa. A questo punto tra lo script php che mi assegna le variabili e il testo html da includere basterebbe inserire quella stringa.
Non ho capito :asd:

ARM_

  • Visitatore
Re:Porcheggiando Ho guadagnato un Posto d'onore nel girone dei bestemmiatori
« Risposta #4 il: Dicembre 02, 2011, 10:06:25 pm »
faccio prima a piazzare un bell'esempio, che sennò cominciamo a bestemmiare tutti. Così poi ci troviamo tutti insieme all'inferno...

il mio index.php

Codice: [Seleziona]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="it"><head>

<!--qui inizia il patetico script che dovrebbe importare solo keywords e description. Ovviamente non c'è, lo sto smandruppando -->

<meta name="robots" content="index,follow">
<!-- carica set caratteri Unicode Transformation Format -->
<meta content="text/html; charset=utf-8" http-equiv="content-type">
<!-- favicon -->
<link rel="shortcut icon" href="favicon.ico">
<!-- foglietto di stile -->
<link rel="stylesheet" type="text/css" href="Css/style.css">
</head>
<body>
<!-- div per titolo -->
<div id="Titolo">
 <? include("titolo.html"); ?>
</div>
<!-- div per menù e frasetta -->
<div id="Sinistro">
 <? include("menu.html"); ?>
 <div style="margin: 280px 5px 5px 5px; padding: 5px 5px 5px 5px;">
  <?
   $f = file("./frase.txt");
   $c = count($f);
   $n = rand(0, ($c-1));
   echo $f[$n];
  ?>
 </div>
</div>
<!-- div per le news -->
<div id="Destro">
 <div style="text-align: center; font-size: 30pt">
  <p><b>NEWS!</b></p>
 </div>
 <?
//include("news.html");
   $f = @fopen("news.html", "r");  // apre il file in sola lettura
   for ($conto = 0; $conto <= 2; ++$conto) {
    $riga = fgets($f,4096);  // legge la riga
    echo $riga;  // visualizza la riga
   }
   @fclose($f);  // è importante chiudere il file
 ?>
 <p style="margin-top: 150px;">
  <a href="http://validator.w3.org/check?uri=referer"><img style="float: left;"
      src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01 Strict" height="31" width="88"></a>&nbsp;&nbsp;
  <a href="http://www.mozilla.org/it"><img alt="get firefox" src="http://www.getfirefox.net/buttons/88x31_b.png"></a>
 </p>
</div>
<!-- codice php che con include al centro della pagina una seconda pagina proveniente da un separato file -->
<div id="Centro">
 <?
  $id = $_GET["id"];
//pariamoci il culo | controllo dell'id in input
  if (strpos($id, ".")) {
  include("index2.html");
  exit(); }
//pariamoci il culo | controllo dell'esistenza del file chiamato
  if($id == "") {
   include("index2.html");
 } else {
   if (is_readable("$id.html")) {
    include("$id.html");
 } else {
    include("errore404.html");
 }}

 ?>
</div>
</body></html>

questa invece è un tipico file incluso

Codice: [Seleziona]
<?php
 $keywords
="blablabla";
 
$description="blablabla";
 
$title="blablabla";
?>

<div class="AlignCenter">
 <img style="width: 99%;" alt="foto di un cucciolo di tigre" src="immagini/piccola_tigre.jpg"><br>
<p style="font-size: 32pt"><b> Sito in crescita</b><br>Ancora un po' di pazienza</p>

</div>



turlando

  • Visitatore
Re:Porcheggiando Ho guadagnato un Posto d'onore nel girone dei bestemmiatori
« Risposta #5 il: Dicembre 02, 2011, 10:15:21 pm »
Scusa, ma creare un file vars.php, config.php, sarcass.php, contenente SOLO le variabili che ti servono e includerlo in testa? :asd:

vars.php
Codice: [Seleziona]
<?php
$keywords
="blablabla";
?>


index.php
Codice: [Seleziona]
<?php require_once 'vars.php'?>
<html>
<head>
<meta name="keywords" content="<?php echo $keywords?>" />
</head>
</html>

Spero di aver compreso il problema :\

ARM_

  • Visitatore
Re:Porcheggiando Ho guadagnato un Posto d'onore nel girone dei bestemmiatori
« Risposta #6 il: Dicembre 02, 2011, 10:28:33 pm »
lo hai compreso in pieno, ed è il modo che, credo, adotterò. Così facendo però avrò due file distinti per ogni contenuto che vorrò includere, e volevo farne uno solo chiamandolo due volte, una per i meta tag, l'altra per il contenuto.

finchè le pagine saranno poche la cosa sarà facile, ma se il numero di contenuti aumenterà la cosa si farà problematica, ed essendo ancora alle prime armi (ho imparato l'html l'altra domenica e php domenica scorsa) non vorrei che la situazione mi sfuggisse di mano in futuro o che un mio eventuale sostituto diventi matto a capire chi fa cosa e come.

ARM_

  • Visitatore
Re:Porcheggiando Ho guadagnato un Posto d'onore nel girone dei bestemmiatori
« Risposta #7 il: Dicembre 03, 2011, 02:54:22 pm »
alla fine mi sono arreso. Fanculo e i tag li ho messi su file separati, su una sottodirectory.

Codice: [Seleziona]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
 <?php
/*script per richiamare contenuto dinamico nel <div> centrale, meta tag
per i motori di ricerca e titolo. Questi ultimi sono nei file presenti
nella nella directory /meta_tag, il contenuto vero e proprio invece è
direttamente negli omonimi file in /.
i controlli sulla leggibilità dei file da richiamare sono fatti qui */
  
$id $_GET["id"];
//pariamoci il culo | controllo dell'id in input
  
if (strpos($id".")) {
    
$keywords="";
    
$description="Nice try lamer";
    
$title="Nice try lamer";
    
$load="index2.html";
} else {
//pariamoci il culo | controllo dell'esistenza del file chiamato
    
if($id == "") {
      include_once(
"meta_tag/index2.html");
      
$load="index2.html";
  } else {
      if ((
is_readable("meta_tag/$id.html")) && (is_readable("$id.html"))) {
        include_once(
"meta_tag/$id.html");
        
$load="$id.html";
    } else {
        
$keywords="";
        
$description="errore404";
        
$title="Ouch!";
        
$load="errore404.html";
 }}}
 
?>

<html lang="it"><head>
<!--dichiarazione-->
<!--metatag per motori di ricerca -->
<meta name="keywords" content="<?php echo $keywords?>">
<meta name="description" content="<?php echo $description?>">
<meta name="robots" content="index,follow">
<!-- carica set caratteri Unicode Transformation Format -->
<meta content="text/html; charset=utf-8" http-equiv="content-type">
<!-- favicon -->
<link rel="shortcut icon" href="favicon.ico">
<!-- titolo -->
<title><?php echo $title?></title>
<!-- foglietto di stile -->
<link rel="stylesheet" type="text/css" href="Css/style.css">
</head>
<body>

[...]

<div id="Centro">
 <?php include_once("$load"); ?>
</div>
</body></html>

A proposito, per evitare che qualche lamer tenti di passare come id=http://sitodellamer.com/scriptmalizioso.php il controllo che faccio è sufficiente o avete consigli in tal senso? in teoria il mio hosting non consente di includere indirizzi assoluti, ma se in futuro cambiasse idea vorrei farmi trovare già preparato.

turlando

  • Visitatore
Re:Porcheggiando Ho guadagnato un Posto d'onore nel girone dei bestemmiatori
« Risposta #8 il: Dicembre 03, 2011, 03:03:45 pm »
Oppure puoi gestire la cosa con degli arrays:

vars.php
Codice: [Seleziona]
<?php
$keywords
[1] = "blabla";
$keywords[2]= "blabla";
?>

index.php
Codice: [Seleziona]
<?php
$id 
$_GET['id'];
require_once 
'vars.php';
?>

<!doctype html>
<html>
<head>
<meta name="keywords" content="<?php echo $keywords[$id]; ?>">
</head>
</html>

Puoi anche creare una variabile $keywords['testo'] nel caso in cui gli id non siano numerici.

ARM_

  • Visitatore
Re:Porcheggiando Ho guadagnato un Posto d'onore nel girone dei bestemmiatori
« Risposta #9 il: Dicembre 03, 2011, 03:35:56 pm »
a questo punto però avrei un file dove dentro vengono messi i $keywords per ogni pagina.

alla fine ho sempre due contenuti su due file diversi da gestire.


ci penso

danke