Sections mit Mysql?

So weit, so gut. Wenn du eine leere Seite hast, deutet das darauf hin, das entweder nix in der Datenbank drin ist, bei dem ein Datensatz in der Spalte sectionname 'test' drin steht, oder schlicht und einfach, das dein Query nicht funktioniert.

Damit du dir gleich einen guten Programmierstil angewöhnst, solltest du mit try...catch arbeiten:

PHP:
try {
    $stmt = $dbc->prepare("SELECT sectioncontent FROM sections WHERE sectionname = :sectionname");
    $stmt->bindValue(':sectionname', $_GET['section']);
    if($data = $stmt->fetch(PDO::FETCH_OBJ)) {
        echo $data->sectioncontent;
    }
}
catch(Exception $e)
{
    echo $e->getMessage();
}


Was mir auch gerade auffällt ist, das du fetch() ohne FETCH_MODE-Flag aufrufst. In der Doku steht, welche Art von Datentyp dann von fetch() an den left-Operanden ($data) zurück gegeben wird: http://de.php.net/manual/de/function.PDOStatement-fetch.php

Es handelt sich FETCH_BOTH, was eine Kombination aus indizierten und assoziativen Array ist. Folglich kannst du auf die Daten nur so zu greifen:
PHP:
echo $data['sectioncontent'];

oder 

echo $data[0];

Soll heißen, wenn du komplett OOP arbeiten willst, musst du an fetch() als ersten Parameter den Fetchmode für Objekte (PDO::FETCH_OBJ) übergeben, wie im obigen Beispiel zu sehen.

Wenn du noch fragen hast, steh ich gern weiterhin beratend zur Seite. Im übrigen find ich gut, das du diesen Weg gehen willst, es ist eine sicherere Art, PHP zu entwickeln, viele Sachen gehen wesentlich einfacher, wenn man OOP verwendet.

Viele Leute haben das Gerücht in die Welt gesetzt, das mit PHP kein ordentlichen OOP möglich ist. Wenn man es richtig anwendet, geht das auch ^^
 
Wenn ich das richtig sehe, wird try und catch erst ab php 5 unterstützt, bei mir kennt kommt ne Fehlermeldung das die { unerwartet ist.

Parse error: syntax error, unexpected '{' in /home/admincn/public_html/test.php on line 4

ich poste ma mein script.
PHP:
<?php
include("libs/dbase.sql.lib.php");
include("class/PDO.class.php");
try {
    $stmt = $dbc->prepare("SELECT sectioncontent FROM sections WHERE sectionname = :section");
    $stmt->bindValue(':section', $_GET['section']);
    if($data = $stmt->fetch(PDO_FETCH_BOTH)) {
        echo $data['sectioncontent'];

    }
}
catch(Exception $e)
{
    echo $e->getMessage();
}  
?>

Ich vermute ma das der code den du gepostet hast, entweder für php 5 ist, ODER was ich mehr glaube, ich noch nicht soweit für diese Stufe bin.

mfg
 
Nein, du hast vollkommen recht, try..catch bzw. die konsequente Verwendung von Exception ist erst ab PHP5 realisiert worden. Ich hatte ganz vergessen, das du ja auch kein PDO hast. ^^

try..catch ist aber wesentlich besser und übersichtlicher, von daher rate ich ohnehin, besser zu PHP5 zu greifen.
 
Prepared Statements ist neu in PHP5 mitdabei, da MySQLi neu erweiterung ist, ist es noch nicht so weit verbreitet wie das normale mysql, naja wobei ich sagen muss das Prepared Statements mit OOP viel leichter und sauberer aussehend sind wie du es machst ;) Aufjedenfall solltest du besser keinen der neu am php lernen ist direkt mit prepared statements konfrontieren :)

Dies wäre eine alternative im gegensatz zu Preprated Statements:

PHP:
<?php

$get = intval($_GET['section']);

if(isset($_get)) && $get !== "" && is_numeric($get) ) {

$db = mysqli_connect('localhost', 'root', '', 'database');

if($db) {

$sqlcmd = sprintf("SELECT * FROM sections WHERE id = '%s'", mysqli_real_escape_string(intval($get)));

$query = mysqli_query($db, $sqlcmd);


if($query) {

$rows = mysqli_num_rows($query);

if($rows > 0 ) {

$data = mysqli_fetch_assoc($query);

echo htmlspecialchars($data['sectioncontent']);


} else { die('Diese Section gibt es nicht'); }

}

} else { die('Keine Verbindung möglich!'); }

}

?>
 
Ok danke aber KD3 ist das nicht auch für php 5?

Ich arbeite mit php 4 und habe keine möglichkeit(ausser local) auf php 5 umzusteigen.

Gibt es deine version auf für php4?

mfg
 
Prepared Statements ist neu in PHP5 mitdabei, da MySQLi neu erweiterung ist, ist es noch nicht so weit verbreitet wie das normale mysql, naja wobei ich sagen muss das Prepared Statements mit OOP viel leichter und sauberer aussehend sind wie du es machst ;) Aufjedenfall solltest du besser keinen der neu am php lernen ist direkt mit prepared statements konfrontieren :)

Ich bin hier komplett anderer Meinung. Gerade Neulinge sollten nicht die "schlechten Programmiermanieren" lernen, sondern es gleich richtig machen. Was ist verkehrt daran, sich mit der Materie auseinander zu setzen, anstatt den offensichtlich weniger sinnigen Weg zu gehen und in Kürze veraltetes Werkzeug einzusetzen, nur weil es "leichter" erscheint? Für einen Anfänger, von was auch immer, ist beides genauso schwer zu lernen bzw. zu verstehen. OOP kann beim verstehen enorm helfen, da wir Menschen es uns so nun einmal besser vorstellen können.

Desweiteren hat ccnt bereits eine Möglichkeit, PS in PHP4 zu verwenden, das ist im Threadverlauf zu lesen. Ich denke auch, das er das Grundprinzip verstanden hat.

@ccnt, lass den try..catch einfach weg, dann läuft es auch unter PHP4. Mal davon abgesehen ist try..catch auch nicht schwer zu verstehen, wenn man sich das einfach mal ins Deutsche übersetzt:

Versuche {
// eine menge Anweisungen
}
FangeEinenFehlerauf(Fehler)
{
gebe_Fehler_aus(Fehler)
}

Du kannst das momentan ignorieren, solange du PHP5 nicht einsetzen kannst oder willst. Irgendwann wirds aber interessant werden, dann hast du das Prinzip bereits im Kopf.
 
Ich stimme dir vollkommen zu: Anfänger sollten von Anfang an gleich den richtigen weg gehen.

Allerdings funktioniert das script auch ohne try und catch nicht.

es kommt nach wie vor eine weisse seite.

hier das abgeänderte script
PHP:
<?php
include("libs/dbase.sql.lib.php");
include("class/PDO.class.php");

    $stmt = $dbc->prepare("SELECT sectioncontent FROM sections WHERE sectionname = :section");
    $stmt->bindValue(':section', $_GET['section']);
    if($data = $stmt->fetch(PDO_FETCH_BOTH)) {
        echo $data['sectioncontent'];

    }

?>
Seite ist weiss

Daten sind drinnen. Ich habs auch schon auf die alte art und weise (ohne oop) auslesen lassen und da werden sie angezeigt.

Es ist nicht so schlimm wenn ich es nicht zum laufen bringe. Dann werd ich wohl oda übel auf die etwas unsichere art und weise arbeiten müssen, indem ich den Array im ACP erweitern muss und nicht einfach in die MySql db schreiben und auslesen.

Wäre schon super wenn es ginge auf die MySql art, wäre was was nich so viele NON CMS pages haben.

mfg
 
Naja, dem Problem werden wir schon noch auf die schliche kommen. Vielleicht hilft es schon mal, wenn du das error_reporting einschaltest und Fehler in der Seite anzeigen lässt. Bei der Entwicklung schalte ich sogar immer in E_STRICT-Modus, um wirklich die kleinsten Fehler wie z.B. uninitialisierte Variablen zu sehen. Leider hat PHP4 das noch nicht, aber E_NOTICE sollte es auch tun:

PHP:
ini_set('display_errors', 'On');
error_reporting(E_ALL | E_NOTICE);

Das schreibst du mal ganz an den Anfang des Scripts, ich bin mir sicher, da kommen wir drauf, wo der Fehler liegt.
 
Du sagst es so leicht, aber anfänger wissen am anfang garnicht was sache ist.

Und was ist deiner meinung nach schlechter programmierstil? Das man ohne OOP arbeitet und das script bei jedem zusammenhang ohne prepared statements nur um millisekunden langsamer läuft als das normale escaping Sorry, aber du solltest erst einmal gründlich neu alles überdenken was du geschrieben hast. Ich meine ja nur das Anfänger sich langsam und sicher Erfahrung sammeln sollten, mehr nicht.

@cctnt

Da ändern sich nur die funktionsnamen und einige funktionen brauchen nur weniger variablen zugeliefert, mehr ist da nicht, z.B anstatt mysqli_connect('localhost', 'root', '', 'database');

muss du es einfach so machen:
mysql_connect('localhost', 'root', '');
mysql_select_db("Login");

MfG
KD3
 
Nirgends habe ich was von schlechtem Stil geschrieben. Ich bin nur der Meingung, das es genauso "einfach" oder "leicht" für einen Anfänger ist, sich in Prepared Statements einzuarbeiten, als es mit den herkömmlichen Funktionen zu machen. Und wenn PS nun mal sicherer als der Gebrauch der Funktionen ist, und die es nur schwerer machen, den Überblick zu behalten, als es eh schon ist, ist es für Anfänger vermutlich besser, gleich den Ballast bei Seite zu lassen. Ein Anfänger versteht die Zusammenhänge beim Zugriff auf ein DBMS, nach welcher Methode auch immer, genauso gut oder schlecht wie mit der anderen. Wenn jemand die Dinge auf Anhieb versteht, wird er auch mit der anderen Art kein Problem bekommen.

Warum sollte man einem Anfänger zumuten, sich mit einer Technik auseinanderzusetzen, die für ihn nach einer Weile alles nur kompliziert. Erklär mal nem Anfänger, was eine SQL-Injection ist, und das diese Angriffe nur deshalb so populär sind, weil Anfänger beim Benutzen der mysql_*-Funktionen immer die gleichen Fehler machen, weil sie es gar nicht besser wissen können. Dann doch lieber gleich auf die sicherere Methode, von Anfang an, damit diese Probleme erst gar nicht auftreten.

Wie du schon richtig gesagt hast, wissen Anfänger am Anfang gar nicht was Sache ist. Versuch mal einem Anfänger klar zu machen, warum man das so machen muss:

PHP:
$r = mysql_query( "SELECT uid FROM users WHERE uname = ".mysql_real_escape_string($_POST['name'])." AND passwd = ".mysql_real_escape_string($_POST['passwd']).");

Das Wissen, das SQL-Injections nur deshalb Funktioneren, weil der PHP-Programmierer, das so nicht anwendet, lernt ein PHP-Programmierer erst dann, wenn das Kind schon ma in den Brunnen gefallen ist. Wenn wir mal ehrlich sind, machen diese Dinge das Netz nicht sicherer.

Außerdem finde ich obere Schreibweise grauenhaft, ich habs schon immer nicht für gut befunden, so zu programmieren. Das ist bei diesem Query auch gerade noch übersichtlich. Bei anderen Ungetümen mit Joins über 5-6 Tabellen und an den Query 20 übergebene Parameter wird das ganze recht wirr und schwer zu warten. Einen Anfänger behindern diese Dinge nur.

Bist du der Meinung, das ein Anfänger, der ohnehin noch keine Erfahrung mit der Materie hat, mit prepared Statements keine Erfahrung sammeln kann?
 
Zurück