Mysql Link übergeben

kosovafan

Erfahrenes Mitglied
Hallo,

ich versuche gerade meine Website vom CMS zu entfernen und wieder die manuelle Pflege zu nutzen. Ich bin blutiger Anfänger in der PHP Programmierung, das meiste was ich bis jetzt umgesetzt habe, konnte ich mit dem Internt lösen. Jetzt stecke ich irgendwie fest.

Ich möchte meinen Blog umsetzen, die Übersicht hat ohne Probleme geklappt. Nur wenn ich jetzt auf den entsprechenden Beitrag linken möchte, klappt irgendwie nichts mehr.

Ich habe für das Blog zwei Dateien, einmal bloggen.php, welches die Übersicht enthält, von dort würde ich gerne auf blogdetail.php über die blogid den entsprechenden Beitrag linken. Ich dachte mir, man macht das mit <a href="blogdetail.php?id=1"></a>, aber irgendwie erhalte ich dann in der blogdetail.php nur Fehler.

Der Code in der Blogdetail:

PHP:
<?php
require_once "inc/common.php";
$id = (isset($_POST['id'])) ? $_POST['id'] : "";
$sql = "SELECT blogid, content FROM `bloggen` id WHERE = blogid";
//$sql = "SELECT * FROM `bloggen` WHERE id = blogid";
$result = $DB->query($sql);

foreach ($id as $result)
		{
echo $result['content'];
		}
$DB = null;
?>

In der Log steht:
Code:
[13-Apr-2011 02:36:28] PHP Warning:  Invalid argument supplied for foreach() in 
C:\nginx\html\silvio\blogdetail.php on line 57

Ich habe verschiedene Lösungen ausprobiert, es endete immer mit einem foreach Fehler, oder mit Undefined Variable id.


Ich würde mich freuen, wenn jemand helfen kann.


Vielen Dank und einen angenehmen Tag.


Silvio
 
Hi,

anscheinend liegt ein Problem mit deiner SQL-Abfrage vor (das WHERE und id gehört vertauscht).
Ich schätze mal, du willst das in etwa so haben (mit ein paar Verbesserungen / Vorschlägen):
PHP:
$id = (isset($_POST['id'])) ? intval($_POST['id']) : "";   // intval() gegen SQL-Injection Angriffe!

/* query bauen */
$sql = 'SELECT blogid, content FROM `bloggen` WHERE id = ' . $id; 

/* query abfeuern */
$result = $DB->query($sql);

/* ergebnis vorhanden? */
if($result) {
  foreach ($id as $result)  {
    echo $result['content'];
  }
} else {
  /* kein ergebnis bekommen, fehler von der datenbank ausgeben */
  die("Fehler mit der Abfrage: " . mysql_errno() . " | " . mysql_error());
}

Gruß
BK
 
Zuletzt bearbeitet:
Richtig ist was Bratkartoffel geschrieben hat, aber ein Problem gibt es trotzdem noch:
Die Variable "$id" kommt aus dem Post und ist ein Integer, diesen willst du aber als Array behandeln und in der Schleife daraus das DB-Result machen.
So sollte es funktionieren:
PHP:
<?php
require_once "inc/common.php";
$id = (isset($_POST['id'])) ? $_POST['id'] : "";

$sql = "SELECT * FROM `bloggen` WHERE id =".$id;
$result = $DB->query($sql);

foreach ($result as $key => $var)
        {
echo $var['content'];
        }
$DB = null;
?>
 
Hallo,


vielen, vielen Dank für die Mithilfe. Es ist wirklich schwer als Anfänger noch durch zu schauen. Ich habe bis heute morgen um 4 versucht die Foreach Abfrage zu finden die passt. Aber irgendwie habe ich das Gefühl das die ID von der Übersicht nicht im Script auf blogdetail endet, so das PHP inkl. Mysql nicht weiß was verarbeitet werden soll.

Ich habe den Code von Maniac_81 probiert, dort endet es auch in der foreach Fehler. Der Code von Bratkartoffel endet mit der Error Message, allerdings ohne Weitergabe des Mysql Fehlers.

Ich nutze die Schnittstelle PDO für Mysql, wurde mir empfohlen. Ich habe einmal den ganzen Sourcecode hochgeladen, vielleicht ist es so einfacher den Fehler in Griff zu bekommen.

Das nackte Script in bloggen.php findet Ihr auf http://silviosiefke.de/tmp/bloggen.txt, dort wird die Übersicht aus der Datenbank geladen, den Sourcecode vom geladenen Script findet Ihr unter http://silviosiefke.de/tmp/bloggenend.txt. Die Seite auf der weitergeleitet wird findet Ihr auf http://silviosiefke.de/tmp/blogdetail.txt.

Ich denke ich muss die Weiterleitung über die ?blogid=1 machen, weil die reine ID aus der Datenbank nicht unbedingt die Daten für den Blogbeitrag sind. Die ID wird automatisch vergeben, die Blogeinträge inkl. Comments werden über die Blogid auseinander gehalten.

Zum Code von Bratkartoffel, in der Log wird nichts mehr geschrieben. Es scheint also wirklich an der Weitergabe der blogid an das Script in blogdetail zu liegen.

Vielen Dank für eure Hilfe, finde ich sehr schön.

Silvio
 
Hallo,

ich habe mich gerade noch einmal drangesetzt, mit den Code von Bratkartoffel kommt es zu der Mysql Fehlermeldung, die im Code steht. In der Query Log erscheint folgendes:

Code:
110413 20:43:33	  569 Connect	root@localhost on silviosiefke
		  569 Query	SELECT * FROM sessions WHERE id = 'aeon1g5odp5hi0ka31uqmk16l4'
		  569 Query	SELECT blogid, content FROM `bloggen` WHERE id =
		  569 Query	DELETE FROM sessions  WHERE lastUpdated < 1302719313
		  569 Quit

Den Link den ich nutze, http://localhost/silvio/blogdetail.php?blogid=1, wie kommt es da zu einer Session Abfrage?

Hat jemand Rat. Vielen Dank.

Silvio
 
Hallo,


wenn ich ehrlich bin, ich bin mir nicht ganz sicher. Wenn ich das richtig verstanden habe wird Post für Übertragungen genutzt, was Get wirklich macht, kann ich nicht sagen.

Was möchtest du damit sagen? Ist Get die Lösung die ich benötige?

Mein Script ruft mittlerweile die Daten von der Mysql Datenbank ab, nur komischerweise wird Sie nicht dargestellt.

PHP:
<?php
require_once "inc/common.php";
$blogid = ((!empty($_POST['blogid'])) ? $_POST['blogid'] : $_GET['blogid'] );

try {
$sql = "SELECT blogid, content FROM `bloggen` WHERE id=".$_GET['blogid']."";
$result = $DB->query($sql);
foreach ($_POST as $result => $var)  {
echo $var['content'];
}
//$DB = null;
}
catch (PDOException $e) {
echo "Fehler: " . $e->getMessage();
exit ();
}
?>

Die Query Einträge in der Log von Mysql sind gleich, der direkte Aufruf arbeitet, der über das Script nicht.

Code:
// direkter Aufruf
110414  2:51:41   676 Connect root@localhost on silviosiefke
676 Query SELECT blogid, content FROM `bloggen` WHERE id=1
676 Quit  
----------------------------------------------------------------------
//Aufruf über Script
110414  2:52:09   677 Connect root@localhost on silviosiefke
677 Query SELECT blogid, content FROM `bloggen` WHERE id=1
677 Quit

Gruß
Silvio
 
POST & GET sind Übertragunsmethoden, wie sie zb. bei Formularen genutzt werden.
Hast du ein Formular, kannst du die Methode angeben wie die Daten übertragen werden sollen
Code:
<form method="post" ....>
So werden die Daten im Hintergrund an den Webserver gesendet.
Mit GET werden die Daten in der URL (Adresszeile des Browsers) übertragen, diese sehen dann so aus:
http://localhost/silvio/blogdetail.php?blogid=1
Wobei hier die Variablen hinter den Dateinamen angefangen von einem "?" gefolgt von einer Variable und der Zuweisung der Variablen.
In deinem Fall
PHP:
echo $_GET['blogid'];
 
So sollte es funktionieren:
Kleiner Sicherheitstipp: Nie in der MySQL-Anweisung mit POST oder GET- Variablen direkt arbeiten. Vorher immer überprüfen.
PHP:
<?php
require_once "inc/common.php";
$blogid = ((!empty($_GET['blogid'])) ? $_GET['blogid'] : '' );

try {
$sql = "SELECT blogid, content FROM `bloggen` WHERE id=".$blogid;
$result = $DB->query($sql);
foreach ($result as $var)  {
echo $var['content'];
}
//$DB = null;
}
catch (PDOException $e) {
echo "Fehler: " . $e->getMessage();
exit ();
}
?>
 
Zurück