• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

PHP Smarty - Formular in Datenbank übergeben

mr.mordan

Neues Mitglied
Hallo zusammen,

hoffe mir kann jemand helfen. Ich wollte eine Edit Funktion für z.B eine ICQ Nummer einbauen und habe nun ein Formular erstellt.

edit.tpl

Code:
{include file="header.tpl" }
 <form action="{$siteurl}/edit.php" method="post">
        
        <div class="formulaleft">Neue ICQ:</div>
        <div class="formularight"><input type="text" maxlength="20" name="icq" value="{$icq}" /></div>
        <div class="clear"></div>
        <div class="formulaleft"></div>
        <div class="formularight"><input type="submit" name="submit" value="ICQ Ändern" /></div>
        <div class="clear"></div>
</form>
{include file="footer.tpl"}
die edit.php schaut aktuell so aus

Code:
<?php
require_once('header.php');

$template_name = 'edit_icq.tpl';

require_once('footer.php');
?>
also es wird nur zu dem formular verwiesen. ich möchte nun die geänderte icq in die datenbank übertragen welche dem user zugeweisen werden soll. wie genau stelle ich das an ? ich habe via login alle daten des users z.B {$login_username} usw. ich kann zwar ohne probleme daten aus der datenbank auslesen und mir den namen id etc anzeigen lassen, jedoch komme ich nicht dahinter wie genau ich eine einfache änderung in die db übergeben kann.

kann mir da vielleicht jemand die edit.php diesbezüglich vervollständigen ?

datenbank ist members
datenziel ist member_icq

vielen dank im vorraus bin neuanfänger in sachen smarty
 
Bin auch kein profi in Smarty, weswegen ich jetzt mal frage: Gibt es denn überhaupt vorgefertigte Datenbank-Funktonen in Smarty?
Denn ich dachte die Logik passiert hier noch von alleine. Somit müsstest du auch eine PHP-Seite bauen, welche die Datenbank updatet, ohne auf Smarty zuzugreifen. Denn du sagtest an den username kommst du ran (nehme an aus der Session). Und damit wären alle bedingungen erfüllt um die Datenbank upzudaten.
Sollte es spezielle Datenbankfunktionen geben, dann wäre es nett, wenn du mal einen Link dafür schickst ^^
Anderseits musst du die Actions selber programmieren. Den Smarty soll dir ja nur helfen dein Content von der logik zu trennen und nicht die logischen Aufgaben abnehmen :D
 
Gibt es denn überhaupt vorgefertigte Datenbank-Funktonen in Smarty?

In der Standarddistribution von Smarty 2 gibt es die ziemlich sicher nicht. Das würde, wie du richtig erklärst, auch dem Sinn von Smarty widersprechen. Smarty ist ein Template-System, kein "Scaffolding-Framework".

Anderseits musst du die Actions selber programmieren. Den Smarty soll dir ja nur helfen dein Content von der logik zu trennen und nicht die logischen Aufgaben abnehmen

Genau.

Günstige Stichworte hier: FrontController-Layout, EVA-Prinzip.

@mr.mordan: Im vorliegenden Fall könntest du zwar vermutlich die für das DB-Update nötigen SQL-Befehle (siehe etwa MySQLi-Funktionen) auch in die edit.php schreiben, aber das wäre höchstwahrscheinlich ein Verstoß gegen Eingabe-Verarbeitung-Ausgabe, da die Verarbeitung der Eingaben während der Ausgabe stattfindet. Das würde zwar funktionieren, ist aber aus diversen Gründen (Übersichtlichkeit, Wartbarkeit, ...) nicht empfehlenswert.

Ob Alternativen möglich sind, hängt ein wenig davon ab, wie deine Anwendung insgesamt aufgebaut ist. Dazu lässt sich hier kaum etwas sagen.

Das Standard-Design für PHP-Anwendungen ist das bereits erwähnte FrontController-Layout. Alle Requests (ob GET oder POST) werden an eine zentrale Index-Seite geschickt (per URL-Rewriting z. B. via mod_rewrite), diese führt anhand der nachgefragten URL und der mitgeschickten Parameter Logikoperationen durch, ermittelt dann Daten für die Ausgabe und reicht diese an ein passendes Template weiter, wo sie für die Darstellung aufbereitet und schließlich ausgegeben werden. Smarty käme nur in diesem letzten Schritt zum Einsatz.
 
@mermshaus: genau so schaut es aus... ich habe eine hauptdatei welche nach dem login alles verwaltet... dort kann ich bisher aber nur auslesen. so komme ich über die session und pw abgleich an den richtigen user.

ein direktes schreiben in der edit.php wie ich es gewohnt war führt leider zu keinen erfolg. habe schon daran gedacht eine edit.class.php zu schreiben, und dann in der edit.php via $template->assign wieder zu rufen, jedoch ist genau dort der knackpunkt wie ihr beide schon geschrieben habt.

als bsp wie ich die daten ermittel

Code:
$template->assign('login_username', $login->getUsername());
und in der class

Code:
<?php
class login
{
    var $memberid;
    var $membername;
    var $memberpassword;
    
    
    function checkLogin()
    {
        global $mysql;
        
        $sql = "SELECT Member_ID FROM " . MYSQL_PREFIX . "members WHERE Member_Name='" . addslashes($this->membername) . "' && Member_Password = '" . $this->memberpassword . "' && Member_Activation_Key = '0'";
                
        $row = $mysql->query($sql); 

        if($mysql->affected_rows != 0)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

function getUserName()
    {
        global $mysql; 
        
        $sql = "SELECT Member_Name FROM " . MYSQL_PREFIX . "members WHERE Member_ID = '" . addslashes($this->memberid) . "'";
        $rows = $mysql->query($sql);
        $record = $mysql->fetch_array($rows);
        
        return $record['Member_Name'];
    }
das funktioniert auch alles 1a und bin erfreut wie einfach man dann auf der seite alles eingeben kann in den templates wo man es braucht.... aber beim rest verzweifel ich weil ich noch nirgends ein passendes beispiel oder tut gefunden habe
 
Du kannst doch Dateien in dein template includen. Lade doch eine Seite rein, in der nur eine Action ausgeführt wird. zum Beispiel checkAction.php

In dieser Datei kannst da auch die Session und die Request variablen zugreifen. Dort kannst du dann eine Klasse oder einfach nur eine Funktion, welche die ICQ-Nummer updatet
 
Es fehlt wohl eine Ebene, die in etwa das hier erledigt:

PHP:
function editAction()
{
    // MyModel ist die Klasse, die die Funktionen bereitstellt, die Daten in der
    // DB verändern oder auslesen
    $m = new MyModel();

    // Die Werte aus $templateVars werden später dem Smarty-Template zugewiesen
    $templateVars['edit_try']     = false; // Editierversuch?
    $templateVars['edit_success'] = false; // Erfolgreich?

    // Wenn die Editier-Form abgeschickt wurde...
    if (isset($_POST['form_id']) == 'edit_icq') {
        $templateVars['edit_try'] = true;

        // Prüfe, ob alle notwendigen Felder gesetzt sind
        $err = (!isset($_POST['user_icq']));

        // Falls ja, versuche Daten in DB upzudaten
        if (!$err) {
            $success = $m->updateUserData($_GET['user_id'],
                                          array('icq' => $_POST['user_icq']));
            $templateVars['edit_success'] = $success;
        }
    }

    // Lade in jedem Fall die Nutzerdaten des aktuellen Users
    $templateVars['user_data'] = $m->loadUserData($_GET['user_id']);

    $tpl = new Smarty();
    $tpl->assign($templateVars);
    $tpl->render('edit.tpl');
}

Pseudo-Smartycode:

Code:
{if edit_try}
    {if edit_success}
        <p>Datensatz für {user_data.name} erfolgreich editiert.</p>
    {else}
        <p>Fehler! Datensatz für {user_data.name} konnte nicht editiert werden.</p>
    {endif}
{endif}

<!-- Normales Edit-Formular anzeigen -->

<form method="post" action="">
    <p><input type="text" name="user_icq" value="{user_data.icq}" /></p>
    <p>
        <input type="hidden" name="form_id" value="edit_icq" />
        <input type="submit" name="unused" value="Editieren" />
    </p>
</form>

index.php müsste nun anhand der URL (etwa: /edit/12) oder der Request-Daten (etwa: index.php?action=edit&uid=12) die Funktion editAction aufrufen.

So weit die Theorie. Ob das bei dir so machbar ist, weiß ich nicht. Aber vielleicht hilft es, mal die "Logik" hinter sowas zu sehen.

Edit: addslashes bietet übrigens keinen absoluten Schutz vor SQL-Injections. (Angriffe sind zwar unwahrscheinlich, aber möglich.) Die Alternative für MySQLi ist PHP: mysqli::real_escape_string - Manual.

Warum PHP4-Stil?
 
Zuletzt bearbeitet:
danke für die anregungen... werd es am we versuchen umzusetzen und hoffe ich bekomme das hin. sobald ich eine funktionierende lösung habe poste ich die natürlich hier rein. solltet ihr weitere tipps haben oder gar tuts zu dem bereich bitte weiter posten
 
Zurück
Oben