Include und Wertübergabe per Link

Ich bin mit meinen Latein am Ende und suche eine Lösung auf mein Problem, was ich gleich schildern werde.
Ich versuche zur Zeit eine Webseite mit PHP zu gestalten und habe in meiner index.php folgenden Script angelegt:
(Um das Script ist nur HTML)
Code:
<?
  //Speichern wir den Wert $_GET Variable in einer normalen Variable
  $getpage = $_GET['getpage'];
  // nun vergleichen wir den Inhalt der Variable mit hilfe einer "switch" anweisung
  switch($getpage)
  {
     case 'news':
                 //Falls $seite == 'news' ist einbinden von news.php
                 include 'news/artikel.php';
                 // break anweisung damit der rest der case blöcke nicht auch noch dursucht wird
                 break;
      case 'artikel':
                 include 'news/showarticle.php';
                 break;
      //hier kann man noch was definieren was standard mässig ausgeführt wird, falls sonst nichts zutrifft
       case 'newsmore':
                 include 'news/showarticle.php?aid=$row->id';
                 break;	  
	   default:
                 include 'news/artikel.php';
                 break;
   }
		
		
		?>

In den Ordner news, habe ich wiederum mein Newsscript angelegt.
Sinn des Scriptes soll sein, an der Stelle wo das oben aufgeführte PHP-Script steht, eine Seite per include eingefügt werden soll. Die Seiten werden dann entsprechend included, wenn der Wert $getpage einen entsprechenden Übergabewert über den Link bekommt.
Also wenn ich den Link http://localhost/index.php?getpage=news aufrufe, dann wird wie gewollt die Seite artikel.php in die entsprechende Stelle eingefügt.

Um zu meinen eigentlichen Problem zu kommen, muss ich noch einen Script von der Seite artikel.php posten:

Code:
<html>
<head>
<title>Artikel - Übersicht</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link href="style.css" rel="stylesheet" type="text/css">
</head>

<body bgcolor="#1F2D32">
  <?
include('admin/config.php');
$verbindung = mysql_connect ($dbhost, $dbuser, $dbpass) // Username und Passwort angeben
or die ("Leider kann das script keine Verbindung zu der Mysql Datenbank aufbauen ");
mysql_select_db($dbname) //hier name der Datenbank eingeben
or die ("Leider kann das script keine Verbindung zu der Datenbank aufbauen");

$getpage2 = a;
$seite = $_GET["seite"];  //Abfrage auf welcher Seite man ist
//Wenn man keine Seite angegeben hat, ist man automatisch auf Seite 1
if(!isset($seite))
   {
   $seite = 1;
   }   
//Einträge pro Seite: Hier 5 pro Seite
$eintraege_pro_seite = 5;
//Ausrechen welche Spalte man zuerst ausgeben muss:
$start = $seite * $eintraege_pro_seite - $eintraege_pro_seite;

       $abfrage = "SELECT * FROM free_news ORDER BY `id` DESC LIMIT $start, $eintraege_pro_seite "; //abfrage
       $ergebnis = mysql_query($abfrage);
       while($row = mysql_fetch_object($ergebnis)) //while schleife solange bis alles ausgegeben ist
       {
	   
	   
	   //=====[Hier kann evtl. etwas am Erscheinungsbild des Artikels geändert werden]=====//
             echo " 
             <table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" align=\"center\" class=\"table\">
  			<tr>
    		<td height=\"30\" colspan=\"2\" class=\"head\">$row->name</td>
  			</tr>
  			<tr>
    		<td colspan=\"2\" class=\"text\">$row->stext<br><a href=\"index.php?getpage=newsmore\"> mehr...</a></td>
  			</tr>
  			<tr>
    		<td class=\"bottom\">$row->datum</td>
    		<td width=\"200\" align=\"right\" class=\"bottom\"><a href=\"comments.php?nid=$row->id\">";			
			$abfrage =  mysql_query("SELECT id FROM free_comments WHERE nid='$row->id'");
			$mengec = mysql_num_rows($abfrage);
			echo "($mengec) comments";
			echo'</a></td>
  			</tr>
			</table><br><br>';}
			
		  //=====[Hier nichts mehr editieren]=====//	 
     
       
//Jetzt kommt das "Inhaltsverzeichnis",
//sprich dort steht jetzt: Seite: 1 2 3 4 5

$result = mysql_query("SELECT id FROM free_news ORDER BY `id` DESC");
$menge = mysql_num_rows($result);

//Errechnen wieviele Seiten es geben wird
$wieviel_seiten = $menge / $eintraege_pro_seite;

//Ausgabe der Seitenlinks:
echo "<div align=\"center\"><br>";
echo "<b>Seite:</b> ";


//Ausgabe der Links zu den Seiten
for($a=0; $a < $wieviel_seiten; $a++)
   {
   $b = $a + 1;

   //Wenn der User sich auf dieser Seite befindet, keinen Link ausgeben
   if($seite == $b)
      {
      echo "  <b>$b</b> ";
      }

   //Aus dieser Seite ist der User nicht, also einen Link ausgeben
   else
      {
      echo "  <a href=\"index.php?site=book/gb&seite=$b\">$b</a> ";
      }


   }
 echo "</div>";
  ?>
 </body>
</html>

Wenn ich nun die artikel.php wie gewollt included habe, werden alle aus der Datenbank gespeicherten Newsboxen aufgerufen. In einer Newsbox steht nur ein kleiner Teil dieser News, diesen kann man aber zu den vollständigen Newstext erweitern, wenn man auf den Link "mehr..." klickt.
Den Link findet ihr im Script übrigens im echo. Die vielen "\" sind gewollt, sonst funktioniert das echo nicht wie es soll.
Den Link den ich nun mit mehr.. aufrufe, lautet: index.php?getpage=newsmore
Damit soll dann in der index.php folgender Link ausgeführt werden:
news/showarticle.php?aid=$row->id
Leider bekomme ich dann immer die Fehlermeldung:

Warning: include(news/showarticle.php?aid=$row->id) [function.include]: failed to open stream: Invalid argument in E:\web\xampp\xampp\htdocs\site\index.php on line 69

Warning: include() [function.include]: Failed opening 'news/showarticle.php?aid=$row->id' for inclusion (include_path='.;e:\web\xampp\xampp\php\pear\') in E:\web\xampp\xampp\htdocs\site\index.php on line 69

Der Link news/showarticle.php?aid=$row->id funktioniert dann nur, wenn ich ihn direkt in die artikel.php anstatt des Links: index.php?getpage=newsmore schreibe.
Leider bekomme ich aber damit den ungewollten Effekt, dass die aufgerufene Seite nicht included wird und im ganzen Fenster geladen wird.
Wie bekomme ich nun Seiten included, die eine Wertübergabe in ihren Link durchführen? Z.B.: news/showarticle.php?aid=$row->id
 
muss das nicht eigentlich
include "news/showarticle.php?aid=$row->id";
anstatt
include 'news/showarticle.php?aid=$row->id';
heißen (anführungszeichen statt apostroph). denn es soll doch bestimmt der wert von $row-id genutzt werden und nicht der string "$row-id", oder?!

und wegen dem include mit parametern. benutze an diesen stellen mal den absoluten pfad bzw. die vollständige url.
include "http://www.???.de/news/showarticle.php?aid=$row->id";

PHP:
// Won't work; looks for a file named 'file.php?foo=1&bar=2' on the
// local filesystem.
include 'file.php?foo=1&bar=2';

// Works.
include 'http://www.example.com/file.php?foo=1&bar=2';
auszug aus http://de2.php.net/manual/de/function.include.php
 
Geht nicht auf allen Server. Ich habe mir dein Code nicht angeschaut, aber ich glaube, Funktionen würden dir weiterhelfen.
 
wenn du das mit den ' machst wird die Variable nicht interpretiert das siehst du übrigens an der fehlermeldung wenn es richtig wäre würde da der wert eingetragen. entweder machst du es wie iavgotmail
oder du machst es indem du 'url' . $var
also mit dem punktoperator, sonst kannste es auch mal das mit include mit klammern machen (ich mach es so, find ich sinnreicher ist ja auch ne funktion^^) also include("datei.php");

@digi ich denke das dies nicht das Problem lösen wird (mein mit funktionen) und wenn dieser befehl verboten wäre würde die fehlermeldung anders aussehen
 
Das eigentliche Problem ist nicht, dass die Variable nicht den Wert ausgibt, sondern dass die Datei nicht geöffnet werden kann. Wenn allow_url_fopen false gesetzt ist, dann geht das mit http:// nicht. (Ich bin mir nicht sicher, ob es an allow_url_fopen liegt oder an einer anderen Einstellung).

Mit Funktionen würde das gehen!
Beispiel:
Funktion showarticle($aid) { ... } macht das selbe wie showarticle.php.
Statt include benutzt man nun einfach showarticle($row->id); und in der neuen showarticle.php übergibt man den Wert $_GET[aid] einfach der Funktion.
 
Eigentlich braucht man dafür auch keine Funktion. Es reicht ja, vor dem include() einfach die Variablen, die man sonst mit

?a=b&c=d

übergeben würde mit

$a = 'b';
$c = 'd'

zu definieren. Die sind auch im includeten Teil zugänglich. Man sollte nur darauf achten, dass sie eben auch nach dem eingebundenen Abschnitt noch gültig sind, also keine Bezeichner nehmen, die später in anderem Sinne nochmal gebraucht werden.
 
Danke für eure Lösungsvorschläge, aber anscheinend hat nicht wirklich eine geholfen.
Den Link ganz anzugeben, habe ich auch probiert. Genauso die Werte nochmal in der index.php zu deklarieren.
Selbst mit der Funktion geht es anscheinend nicht so gut, obwohl ich hier jedoch keine Fehlermeldung bekommen habe und nur eine leere Seite.
Aber es kann sein, ich habe da irgendetwas nicht verstanden bzw. falsch gemacht.
Den geänderten Script + der showarticle.php, poste ich gleich.
Vielleicht findet ihr eine Lösung, wenn ihr mehr seht:

index.php
Code:
		<?
		    function showarticle ($aid) {
 include('news/admin/config.php');
$verbindung = mysql_connect ($dbhost, $dbuser, $dbpass) // Username und Passwort angeben
or die ("Leider kann das script keine Verbindung zu der Mysql Datenbank aufbauen ");
mysql_select_db($dbname) //hier name der Datenbank eingeben
or die ("Leider kann das script keine Verbindung zu der Datenbank aufbauen");
	
$aid = $_GET["aid"];

$abfrage = "SELECT * FROM free_news WHERE id='$aid' "; //abfrage
       $ergebnis = mysql_query($abfrage);
       while($row = mysql_fetch_object($ergebnis)) //while schleife solange bis alles ausgegeben ist
       {
	   
	   
	   //=====[Hier kann evtl. etwas am Erscheinungsbild des Artikels geändert werden]=====//
             echo " 
             <table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" align=\"center\" class=\"table\">
  			<tr>
    		<td height=\"30\" colspan=\"2\" class=\"head\">$row->name</td>
  			</tr>
  			<tr>
    		<td colspan=\"2\" class=\"text\">$row->stext<br><br>$row->ltext</td>
  			</tr>
  			<tr>
    		<td class=\"bottom\">$row->datum</td>
    		<td width=\"200\" align=\"right\" class=\"bottom\"><a href=\"comments.php?nid=$row->id\">";
			$abfrage =  mysql_query("SELECT id FROM free_comments WHERE nid='$row->id'");
			$mengec = mysql_num_rows($abfrage);
			echo "($mengec) comments";
			echo'</a></td>
  			</tr>
			</table><br>';}
}
  //Speichern wir den Wert $_GET Variable in einer normalen Variable
  $getpage = $_GET['getpage'];
  // nun vergleichen wir den Inhalt der Variable mit hilfe einer "switch" anweisung
  switch($getpage)
  {
     case 'news':
                 //Falls $seite == 'news' ist einbinden von news.php
                 include 'news/artikel.php';
                 // break anweisung damit der rest der case blöcke nicht auch noch dursucht wird
                 break;
      case 'artikel':
                 include 'news/showarticle.php';
                 break;
      //hier kann man noch was definieren was standard mässig ausgeführt wird, falls sonst nichts zutrifft
       case 'newsmore':
                 showarticle($row->id);
                 break;	  
	   default:
                 include 'news/artikel.php';
                 break;
   }
		
		?>

artikel.php
Code:
<html>
<head>
<title>Artikel - Übersicht</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link href="style.css" rel="stylesheet" type="text/css">
</head>

<body bgcolor="#1F2D32">
  <?
include('admin/config.php');
$verbindung = mysql_connect ($dbhost, $dbuser, $dbpass) // Username und Passwort angeben
or die ("Leider kann das script keine Verbindung zu der Mysql Datenbank aufbauen ");
mysql_select_db($dbname) //hier name der Datenbank eingeben
or die ("Leider kann das script keine Verbindung zu der Datenbank aufbauen");

$seite = $_GET["seite"];  //Abfrage auf welcher Seite man ist
//Wenn man keine Seite angegeben hat, ist man automatisch auf Seite 1
if(!isset($seite))
   {
   $seite = 1;
   }   
//Einträge pro Seite: Hier 5 pro Seite
$eintraege_pro_seite = 5;
//Ausrechen welche Spalte man zuerst ausgeben muss:
$start = $seite * $eintraege_pro_seite - $eintraege_pro_seite;

       $abfrage = "SELECT * FROM free_news ORDER BY `id` DESC LIMIT $start, $eintraege_pro_seite "; //abfrage
       $ergebnis = mysql_query($abfrage);
       while($row = mysql_fetch_object($ergebnis)) //while schleife solange bis alles ausgegeben ist
       {
	   
	   
	   //=====[Hier kann evtl. etwas am Erscheinungsbild des Artikels geändert werden]=====//
             echo " 
             <table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" align=\"center\" class=\"table\">
  			<tr>
    		<td height=\"30\" colspan=\"2\" class=\"head\">$row->name</td>
  			</tr>
  			<tr>
    		<td colspan=\"2\" class=\"text\">$row->stext<br><a href=\"index.php?getpage=newsmore\"> mehr...</a></td>
  			</tr>
  			<tr>
    		<td class=\"bottom\">$row->datum</td>
    		<td width=\"200\" align=\"right\" class=\"bottom\"><a href=\"comments.php?nid=$row->id\">";			
			$abfrage =  mysql_query("SELECT id FROM free_comments WHERE nid='$row->id'");
			$mengec = mysql_num_rows($abfrage);
			echo "($mengec) comments";
			echo'</a></td>
  			</tr>
			</table><br><br>';}
			
		  //=====[Hier nichts mehr editieren]=====//	 
     
       
//Jetzt kommt das "Inhaltsverzeichnis",
//sprich dort steht jetzt: Seite: 1 2 3 4 5

$result = mysql_query("SELECT id FROM free_news ORDER BY `id` DESC");
$menge = mysql_num_rows($result);

//Errechnen wieviele Seiten es geben wird
$wieviel_seiten = $menge / $eintraege_pro_seite;

//Ausgabe der Seitenlinks:
echo "<div align=\"center\"><br>";
echo "<b>Seite:</b> ";


//Ausgabe der Links zu den Seiten
for($a=0; $a < $wieviel_seiten; $a++)
   {
   $b = $a + 1;

   //Wenn der User sich auf dieser Seite befindet, keinen Link ausgeben
   if($seite == $b)
      {
      echo "  <b>$b</b> ";
      }

   //Aus dieser Seite ist der User nicht, also einen Link ausgeben
   else
      {
      echo "  <a href=\"index.php?site=book/gb&seite=$b\">$b</a> ";
      }


   }
 echo "</div>";

 
  ?>
 </body>
</html>

showarticle.php
Code:
<html>
<head>
<title>Show article</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link href="style.css" rel="stylesheet" type="text/css">
</head>

<body>
<?
include('admin/config.php');
$verbindung = mysql_connect ($dbhost, $dbuser, $dbpass) // Username und Passwort angeben
or die ("Leider kann das script keine Verbindung zu der Mysql Datenbank aufbauen ");
mysql_select_db($dbname) //hier name der Datenbank eingeben
or die ("Leider kann das script keine Verbindung zu der Datenbank aufbauen");
	
$aid = $_GET["aid"];

$abfrage = "SELECT * FROM free_news WHERE id='$aid' "; //abfrage
       $ergebnis = mysql_query($abfrage);
       while($row = mysql_fetch_object($ergebnis)) //while schleife solange bis alles ausgegeben ist
       {
	   
	   
	   //=====[Hier kann evtl. etwas am Erscheinungsbild des Artikels geändert werden]=====//
             echo " 
             <table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" align=\"center\" class=\"table\">
  			<tr>
    		<td height=\"30\" colspan=\"2\" class=\"head\">$row->name</td>
  			</tr>
  			<tr>
    		<td colspan=\"2\" class=\"text\">$row->stext<br><br>$row->ltext</td>
  			</tr>
  			<tr>
    		<td class=\"bottom\">$row->datum</td>
    		<td width=\"200\" align=\"right\" class=\"bottom\"><a href=\"comments.php?nid=$row->id\">";
			$abfrage =  mysql_query("SELECT id FROM free_comments WHERE nid='$row->id'");
			$mengec = mysql_num_rows($abfrage);
			echo "($mengec) comments";
			echo'</a></td>
  			</tr>
			</table><br>';}
?>
<p align="center"><a href="artikel.php">zur Artikel-Übersicht </a></p>
</body>
</html>
 
Hallo,

Also ich mach das immer so:

Ich erstelle index.php dort ist das ganze Layout drinn, irgendwo in dem Layout möchte ich dann den ganzen inhalt includen, je nach übergebenen GET parameter include ich dann eine Seite, aber ich kann dann auch noch weitere GET Parameter übergeben:

?seite=newsdetails&id=10

In der index.php wird dann die Seite newsdetails.php includet und dort mache ich dann eine SQL Abfrage mit der übergebenen id, um eine einzelne News auszugeben.

Wie du siehst kann man per GET (fast) unendlich Parameter übergeben.

Includes sind nur dazu da deinen Code übersichtlicher und Strukturierter zu machen. teoretisch könntest du auch alles in eine einzige Datei speichern.

Eine gute Beschreibung dazu findest du auch hier:
http://tut.php-q.net/include.html
http://tut.php-q.net/get.html
http://tut.php-q.net/frames.html


mfg
 
Original von LX
Eigentlich braucht man dafür auch keine Funktion. Es reicht ja, vor dem include() einfach die Variablen, die man sonst mit

?a=b&c=d

übergeben würde mit

$a = 'b';
$c = 'd'

zu definieren. Die sind auch im includeten Teil zugänglich. Man sollte nur darauf achten, dass sie eben auch nach dem eingebundenen Abschnitt noch gültig sind, also keine Bezeichner nehmen, die später in anderem Sinne nochmal gebraucht werden.

Unsauber, und wenn register_globals deaktiviert ist, geht das auch nicht.

Ich sehe
Code:
function showarticle ($aid) {
$aid = $_GET["aid"];
und weiss, das du etwas nicht verstanden hast.
Tasmas, gute einfache Lösung, die das Problem von Prometheus gut löst. Ich dachte, das Problem wäre, dass er mehrere Aufrufe desselben Scriptes macht, weil man leicht auf die einfache Lösung kommt (dachte ich bisher).
 
Danke für die Informationsreichen Links.
Jedoch geht es in diesen Links nicht um mein eigentliches Problem, sondern schon um Dinge die ich mit den PHP-Script erfolgreich lösen konnte.

Aber mein Problem ist noch der Link news/showarticle.php?aid=$row->id.
Auch wenn ich die Werte in andere Dokumente übergeben möchte, bekomme ich immer eine Fehlermeldung.
Es wäre mir wirklich eine Hilfe wenn du mir deine Lösung in meinen Beispiel zeigst, wie du es meinst, denn aus deinen Vorschlag werde ich nicht richtig schlau.
 
Ich hoffe ich habe dein Problem richtig verstanden:
Du möchtest mit include GET-Parameter übergeben!?

Die Stelle:
Code:
include('news/showarticle.php?aid=$row->id');
Ersetzt du durch:
Code:
include('news/showarticle.php');
Und diese Stelle (showarticle.php):
Code:
$aid = $_GET["aid"];
Ersetzt du durch:
Code:
$aid = $row->id;

Und dann sollte es gehen. Man kann mit include keine GET Parameter übergeben. Ist auch nicht nötig, denn der Code welcher inkludert wird, ist direkt in der Datei drin (aus 2 mach 1). Somit stehen alle Variablen aus der 1. Datei auch in der inkludierten Datei zur Verfügung.

mfg
coderinblack
 
@coderinblack
Funktioniert leider nicht so.
Die Seite showarticle.php benötigt noch den Parameter für aid, den kann sie nur durch Get bekommen, sonst weiß sie nciht was sie anzeigen muss, denn die AUsgabe hängt ganz von den Werten in der showarticle ab.

Hat noch Jemand gute Vorschläge?
 
bei solchen "Problemen" ist es hilfreich,
PHP:
	error_reporting(E_ALL);
an den Anfang eines nicht funktionierenden Scriptes zu setzen. So bekommst du auch notices von z.B. nicht initialisierten Variablen angezeigt.
 
Zurück
Oben