Starkoch: Variable an case übergeben?

Hallo,
wer kann mir helfen?
Über ein login vergleiche ich $k und $p mit dem inhalt der DB. Bei Übereinstimmung werden die abgerufenen Variablen aus der DB in angebot.inc ausgegeben. Möchte ich jetzt case "kontakt" per Link aufrufen, komme ich zu login zurück.
Wo liegt der Fehler?

<?
session_start();
$k = $_POST['kdr'];
$p = $_POST['pw'];
$_SESSION['pa'] = $p;
$_SESSION["ku"] = $k;
//------------------------Verbindung mit Datenbank-------------------//
$verbindung = mysql_connect ("xx","xx", "xx")
or die ("keine Verbindung möglich. Benutzername oder Passwort sind falsch");
mysql_select_db("xx")
or die ("Die Datenbank existiert nicht.");
//--------------------Abfrage der Kundendaten aus Datenbank----------//
$abfrage = "SELECT * FROM xx WHERE k LIKE '$k' LIMIT 1";
$ergebnis = mysql_query($abfrage);
$row = mysql_fetch_object($ergebnis);

if ($kundennummer = "$row->k" AND $passwort == "$row->p")
{
if (isset($_GET['go']))
        {
        switch($_GET['go'])
{
case 'angebot': include('https://www.xx.de/xx/angebot.inc'); break;
case 'kontakt': include('https://www.xx.de/xx/kontakt.inc'); break;

default:        include('https://www.xx.de/xx/fehler.inc');
        }
        }
        else
        {
include('start.inc');
}
?>
<a href="index.php?go=kontakt">Kontaktdaten</a>
<?
}

else
{
?>
{:.language-html} <div class="div_1">
<table class="table_2">
<tr>
<td>Benutzername und/oder PIN waren falsch.</td>
</tr>
<tr>
<td><a href="login.php">[zurück zum Login]</a></td>
</tr>
</table>
</div>
<?

  1. Hi,

    Wenn du hier PHP-Code postest, mach das künftig bitte mit dem [code lang=php]-Tag, dann wird er besser lesbar.

    wer kann mir helfen?

    Ein gutes Buch oder Tutorial, damit du erst mal die Grundlagen lernst.
    Derzeit scheint dein Wissen noch ziemlich spärlich zu sein.

    Über ein login vergleiche ich $k und $p mit dem inhalt der DB. Bei Übereinstimmung werden die abgerufenen Variablen aus der DB in angebot.inc ausgegeben. Möchte ich jetzt case "kontakt" per Link aufrufen, komme ich zu login zurück.

    Vermutlich deshalb, weil dort die POST-Daten, die du am Scriptanfang abfragst, gar nicht mehr vorhanden sind.

    switch($_GET['go'])
    {
    case 'angebot': include('https://www.xx.de/xx/angebot.inc'); break;
    case 'kontakt': include('https://www.xx.de/xx/kontakt.inc'); break;

    default:        include('https://www.xx.de/xx/fehler.inc');

    Warum machst du die includes eigentlich über HTTPS?

    Vermutlich hast du deshalb die Endung .inc gewählt, damit der PHP-Code nicht durch den Request schon ausgewertet wird, und wirklich noch als Code in deinem Script ankommt? Das ist aber ungünstig - nicht nur wegen der Performance, sondern auch weil dann jeder den Code im Klartext lesen kann, der diese Adressen kennt und direkt abruft.

    Mach dir bitte klar, wo der Unterschied liegt, ob du ein include über HTTP oder über das Dateisystem machst.
    Letzteres ist i.a.R. die deutlich sinnvollere Variante.

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
  2. Mahlzeit Starkoch,

    Möchte ich jetzt case "kontakt" per Link aufrufen, komme ich zu login zurück.

    Was meinst Du damit? Dass Du auf diesen Link ...

    <a href="index.php?go=kontakt">Kontaktdaten</a>

    ... klickst? Dann solltest Du Dir vielleicht klarmachen, was genau dann passiert, wenn die Ressource "index.php" zwar mit einem GET-Parameter "go=kontakt", jedoch *OHNE* jegliche POST-Parameter aufgerufen wird.

    Debugge vernünftig!

    Wo liegt der Fehler?

    Der sitzt - wie so oft - vor dem Bildschirm. :-)

    <?

    "Short open tags" sind selten eine gute Idee.

    $k = $_POST['kdr'];
    $p = $_POST['pw'];

    Dieses Umkopieren von Variablen ist sinnlos. Stattdessen solltest Du die Inhalt lieber auf gültige Werte(bereiche) überprüfen.

    $verbindung = mysql_connect ("xx","xx", "xx")
    or die ("keine Verbindung möglich. Benutzername oder Passwort sind falsch");
    mysql_select_db("xx")
    or die ("Die Datenbank existiert nicht.");

    Zitat 1282

    $abfrage = "SELECT * FROM xx WHERE k LIKE '$k' LIMIT 1";

    Informiere Dich zum Thema "SQL Injection" und lies und verstehe den Artikel zum Thema "Kontextwechsel".

    if ($kundennummer = "$row->k" AND $passwort == "$row->p")

    Das kannst Du viel besser und sinnvoller erreichen, indem Du direkt die Datenbank fragst, ob diese Kombination von Kundennummer und Passwort vorhanden ist.

    case 'angebot': include('https://www.xx.de/xx/angebot.inc'); break;
    case 'kontakt': include('https://www.xx.de/xx/kontakt.inc'); break;

    Erstens bezweifle ich, dass Dir tatsächlich die Domain "xx.de" gehört (bitte benutze die für Beispiele vorgesehenen Domains, wenn Du Deine eigene nicht nennen möchtest) und zweitens solltest Du vielleicht eher auf das Einbinden per http(s) verzichten.

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|