ChrisL: SQL Fehler Resource id #8

Hallo Forum

Ich habe erst seit kurzem mit PHP/SQL gestartet und hoffe, dass mir jemand mit folgendem Code helfen kann.

Ich habe ein Sign-Up Formular geschrieben, wo u.a. ein Verification Code erzeugt wird, der mittels Email dem neuen Mitglied zugestellt wird. Der User klickt auf den Link im Email... http://www.adresse/verify.php?email=muster@mail.com&vcode=XXXXXXX

In verify.php gleiche ich die Datenbank mit dem Code ab und lösche ggf. den Eintrag. U.a. benutze ich die Funktion 'getvcode($email)', die mir den Verification-Code aus der Datenbank ausliest.

So, funktioniert alles bestens d.h. keine Probleme mit Datenbankverbindung oder Query.

Nun habe ich eine IF-Abfrage erstellt, ob die Variable $_GET['email'] existiert und falls nicht, soll ein Formular erscheinen. D.h. wenn jemand verify.php ohne Variablen anwählt, soll er die Verification manuell vornehmen könnnen (Textfeld Email und V-Code).

Wenn ich hierfür (im Formular Teil) die gleiche Funktion 'getvcode($email)' ausführe, erscheint der Query-Fehler 8 im Titel.

Aus Recherchen im Archiv glaube ich zu verstehen, dass es sich um einen Konflikt mit mehreren Query handeln könnte. Etwas von 'unbuffered' habe ich auch gelesen, aber ich kann es nicht einsetzen. Ist mir auch ganz prinzipiell unklar, warum es einen Konflikt geben könnte, weil die Query wird ja nur einmal ausgeführt wird, entweder im Formular-Teil oder im automatischen Teil (Variablen via Link) aber nicht gleichzeitig.

Für Hinweise und Anregungen jeglicher Art bin ich sehr dankbar.

Freundliche Grüsse
Chris

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Unbenanntes Dokument</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link href="../layout/layout.css.php" rel="stylesheet" type="text/css">
<?php
include '../textmsg/errormsg.inc';
include '../functions/otherfunctions.inc';
include '../functions/formfieldcreate.inc';
include '../functions/formfieldcheck.inc';

function getvcode($email) {
$qry1 = mysql_query( "SELECT * FROM member1 WHERE fdemail='$email'");
$fetch = mysql_fetch_array($qry1) or die("Failed Query of " . $qry1);
return $fetch['fdpwverified'];
}
?>
</head>

<body class="standardtext">
<p>
  <?php
$email = $_GET['email'];
$vcode = $_GET['vcode'];

if (!isset($email)){
// Start Code via Form
//--------------------------------------------------------------------------------------------------------------------

include '../functions/dbconnection1.inc';
// ---------- THE NEXT LINE CAUSES THE PROBLEM -----------------
$fdpwverified = getvcode("TestmemberA@mail.comb");
echo $fdpwverified;
mysql_close($conn);

//--------------------------------------------------------------------------------------------------------------------
}
else
{
// Start Code via URL
//--------------------------------------------------------------------------------------------------------------------
include '../functions/dbconnection1.inc';
$fdpwverified = getvcode($email);
if ($fdpwverified == "") {
  echo  errortext(10);
  exit;
}
if ($fdpwverified != $vcode) {
  echo errortext(11);
  exit;
}
$qry2 = "UPDATE member1 SET fdpwverified='' WHERE fdemail='$email'";
mysql_query($qry2) or die("Failed Query of " . $qry2);
echo 'You have successfully signed up. Thank you for joining. You will be redirected
      to our login shortly (in work). For now you can use the following <a href="../login/login.php">link</a>.';
mysql_close($conn);
//--------------------------------------------------------------------------------------------------------------------
}
?>

</body>
</html>

  1. Moin!

    Wenn ich hierfür (im Formular Teil) die gleiche Funktion 'getvcode($email)' ausführe, erscheint der Query-Fehler 8 im Titel.

    Das bedeutet: Du machst einen Query, benutzt aber dessen Ressource-Kennung als Ergebnis, anstelle die Ressource-Kennung einer Fetch-Funktion zu übergeben und _deren_ Ergebnis zu benutzen (erst dort stehen die DB-Daten dann drin).

    Grundsätzliches:

    1. Wenn man mit der Datenbank kommunizieren will, macht man zuerst:
     - mysql_connect() und
     - mysql_select_db()

    2. Um eine Datenbankabfrage durchzuführen, nutzt man:
     - mysql_real_escape_string() für enthaltene PHP-Variablen
     - mysql_query() für die eigentliche Abfrage

    3. Um das Ergebnis eines SELECT zu erfahren:
     - mysql_fetch_assoc() oder
     - mysql_fetch_object() oder (ab hier wirds ungebräuchlicher)
     - mysql_fetch_array() oder
     - mysql_fetch_row()

    Das Ausführen eines UPDATE, INSERT, DELETE etc. hat kein abfragbares Ergebnis.

    Eine DB-Abfrage mit SELECT besteht somit (nach dem Connect) immer aus mindestens zwei mysql-Befehlen: Query und Fetch.

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
    1. Hallo Sven

      Vielen Dank für die rasche Antwort.

      Sorry, falls ich mich blöd anstelle, aber ich kann die Lösung nicht ganz nachvollziehen. Beide male spreche ich die gleiche Funktion an:

      function getvcode($email) {
      $qry1 = mysql_query( "SELECT * FROM member1 WHERE fdemail='$email'");
      $fetch = mysql_fetch_array($qry1) or die("Failed Query of " . $qry1);
      return $fetch['fdpwverified'];
      }

      // ----- im Formular-Teil
      include '../functions/dbconnection1.inc';
      $fdpwverified = getvcode("TestmemberA@mail.comb");

      // ----- im Code-per-URL Teil
      include '../functions/dbconnection1.inc';
      $fdpwverified = getvcode($email);

      Im Formular-Teil (Resource id #8 Fehler) und im Code-per-URL Teil (alles OK) wird die gleiche Funktion angesprochen. In der Funktion wird das Resultat aus Fetch übermittelt, also nicht das Query-Resultat.

      Wäre sehr dankbar, wenn du mir nochmals einen Tip geben könntest.

      MfG
      Chris

      1. Moin!

        Wäre sehr dankbar, wenn du mir nochmals einen Tip geben könntest.

        Poste die Original-Fehlermeldung.

        - Sven Rautenberg

        --
        "Love your nation - respect the others."
        1. Hallo Sven

          Werde morgen mal gucken ob ich eine andere Fehlermeldung rauskriegen kann.

          Danke schonmal fuer deine Bemuehungen und bis morgen, ist schon abend hier am anderen Ende der Welt und ich mache fuer heute schluss.

          cu m8
          Chris

      2. echo $begrüßung;

        $qry1 = mysql_query( "SELECT * FROM member1 WHERE fdemail='$email'");
        $fetch = mysql_fetch_array($qry1) or die("Failed Query of " . $qry1);

        "or die()" ist eigentlich in den seltensten Fällen eine angemessene Reaktion auf einen Fehler.
        Bitte informiere dich außerdem im Handbuch, was die Funktionen im Gut- und im Fehlerfall für ein Ergebnis zurückliefern. Wenn die Query fehlschlägt, musst du an der Stelle mit der Datenbankabfrage (nur mit der Datenbankabfrage! Das Script komplett zu beenden besteht keine Notwendigkeit.) aufhören, nicht erst nach dem Fetch. Denn das Fetch liefert ein false wenn keine weiteren Daten mehr im Abfrageergebnis sind und das ist kein Grund zu flüchten.

        echo "$verabschiedung $name";

    2. Hi,

      1. Wenn man mit der Datenbank kommunizieren will, macht man zuerst:
      • mysql_connect() und
      • mysql_select_db()
      1. Um eine Datenbankabfrage durchzuführen, nutzt man:
      • mysql_real_escape_string() für enthaltene PHP-Variablen
      • mysql_query() für die eigentliche Abfrage
      1. Um das Ergebnis eines SELECT zu erfahren:
      • mysql_fetch_assoc() oder
      • mysql_fetch_object() oder (ab hier wirds ungebräuchlicher)
      • mysql_fetch_array() oder
      • mysql_fetch_row()

      4. um die Fehlermeldungen zu bekommenm, wenn was schiefgeht.

      • mysql_error()

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      O o ostern ...
      Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.