Meliah_Rage: auf bereits existierenden eintrag prüfen?

Hallo nochmal,

ich bräuchte nochmal Hilfe wie kann ich prüfen ob es den Eintrag bereits gibt? Ich müsste Schiff_id und Starttermin prüfen/vergleichen, das schiff kann zur vordefinierten Zeit(eingabe Formular) nur einmal eingetragen werden???

Könntet Ihr mir da nochmal Helfen - vielen Dank

Mein Ansatz Code:

function pruefeAufDoppeltenEintrag($verbindung, $schiffe_id, $starttermin) {
    $query = "SELECT * FROM reisen WHERE schiffe_id='$schiffe_id', starttermin='$starttermin'";
    $ergebnis = mysql_query($query, $verbindung);

$doppelt = false;
    if (mysql_num_rows($ergebnis) > 0) {
        $doppelt = true;
    }
    return $doppelt;
}

leider fehlt mir ab hier jede Idee!?!

  1. Hallo,
    falls du das Meinst:

    $query = "SELECT * FROM reisen WHERE schiffe_id='$schiffe_id', starttermin='$starttermin' AND DATE_SUB(NOW(), INTERVAL 1 MINUTE) < Datum";

    (Voraussetzung ist, dass du eine Spalte hast, die die Zeit des Abschickens speichert)

    Jetzt werden alle Einträge selektiert, die die schiffe_id soundso, den starttermin soundso haben UND in der letzten Minute angelegt wurden.

    Du kannst das ausweiten auf 1 DAY ob es  bei WEEK klappt, weiß ich nicht

    Hoffe ich konnte dir helfen

    MfG

    1. Hallo,
      falls du das Meinst:

      $query = "SELECT * FROM reisen WHERE schiffe_id='$schiffe_id', starttermin='$starttermin' AND DATE_SUB(NOW(), INTERVAL 1 MINUTE) < Datum";

      (Voraussetzung ist, dass du eine Spalte hast, die die Zeit des Abschickens speichert)

      Jetzt werden alle Einträge selektiert, die die schiffe_id soundso, den starttermin soundso haben UND in der letzten Minute angelegt wurden.

      Du kannst das ausweiten auf 1 DAY ob es  bei WEEK klappt, weiß ich nicht

      Hoffe ich konnte dir helfen

      MfG

      leider hab ich keine Spalte die die Zeit des abschickens speichert,
      ich müsste eben nur anhand der beiden (oben) eine prüfung schreiben, leider fehlt mir jede Idee...?

      function pruefeAufDoppeltenEintrag($verbindung, $schiffe_id, $starttermin) {
          $query = "SELECT * FROM reisen WHERE schiffe_id='$schiffe_id', starttermin='$starttermin'";
          $ergebnis = mysql_query($query, $verbindung);

      $doppelt = false;
          if (mysql_num_rows($ergebnis) > 0) {
              $doppelt = true;
          }
          return $doppelt;
      }

      und Datenbank einträge:

      $id, $reederei_veranstalter_id, $fahrtgebiete_id, $schiffe_id, $starttermin, $reisedauer, $beschreibung, $preis_pro_person

      grüße

  2. Hallo,

    function pruefeAufDoppeltenEintrag($verbindung, $schiffe_id, $starttermin) {
        $query = "SELECT * FROM reisen WHERE schiffe_id='$schiffe_id', starttermin='$starttermin'";
        $ergebnis = mysql_query($query, $verbindung);

    $doppelt = false;
        if (mysql_num_rows($ergebnis) > 0) {
            $doppelt = true;
        }

    $doppelt = (mysql_num_rows($ergebnis) > 0); // kuerzer

    return $doppelt;
    }

    leider fehlt mir ab hier jede Idee!?!

    Du hast geprüft. Welche Idee fehlt dir? Bei TRUE einen Hinweis ausgeben?

    1. Hallo,

      function pruefeAufDoppeltenEintrag($verbindung, $schiffe_id, $starttermin) {
          $query = "SELECT * FROM reisen WHERE schiffe_id='$schiffe_id', starttermin='$starttermin'";
          $ergebnis = mysql_query($query, $verbindung);

      $doppelt = false;
          if (mysql_num_rows($ergebnis) > 0) {
              $doppelt = true;
          }
             $doppelt = (mysql_num_rows($ergebnis) > 0); // kuerzer
          return $doppelt;
      }

      leider fehlt mir ab hier jede Idee!?!

      Du hast geprüft. Welche Idee fehlt dir? Bei TRUE einen Hinweis ausgeben?

      Danke für die schnelle Antwort:

      Ja aber würde das den so schon funktionieren? Der Hinweis müßte dann so aussehen oder? $doppelt = true; print "Dieser Eintrag existiert bereits"; oder so ähnlich!!!

      Ich müsste prüfen ob das Schiff(Schiff_id) zu einer bestimmten Zeit bereits eingetraqen wurde, dann soll es nicht nochmal möglich sein das Schiff zu dieser Zeit in die DB zu übernehmen. Oder gebe es einen besseren Prüfvorgang?

  3. Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in C:\Programme\xampp\reisbuero_projekt\funktionen.lib.php on line 184

    bekomme diese meldung wen ich die function so übernehme?

    function pruefeAufDoppeltenEintrag($verbindung, $schiffe_id, $starttermin) {
        $query = "SELECT * FROM reisen WHERE schiffe_id='$schiffe_id', starttermin='$starttermin'";
        $ergebnis = mysql_query($query, $verbindung);

    $doppelt = false;
        if (mysql_num_rows($ergebnis) > 0) { //dieser Teil scheint den Fehler zu verursachen - aber warum???
            $doppelt = true;
        }
        return $doppelt;
    }

    aufgerufen wird es so:

    $doppelt = pruefeAufDoppeltenEintrag($verbindung, $schiffe_id, $starttermin);

    1. echo $begrüßung;

      Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in C:\Programme\xampp\reisbuero_projekt\funktionen.lib.php on line 184
      bekomme diese meldung wen ich die function so übernehme?

      Das ist eine der häufigsten Fehlermeldungen von PHP, wenn MySQL im Spiel ist. Du solltest dazu tonnenweise Informationen im Internet finden. Sie tritt immer dann auf, wenn man kein Fehlerbehandlungskonzept für MySQL-Fehler hat und Fehlerzustände ignoriert, die vorhergehende mysql_*()-Funktionen durch ihren Rückgabewert signalisert haben. Übrigens, ein "or die(...)" ist keine benutzerfreundliche Fehlerbehandlung.

      $query = "SELECT * FROM reisen WHERE schiffe_id='$schiffe_id', starttermin='$starttermin'";

      Was hier außer dem Syntax-Fehler (dessen Wortlaut du nicht mittels mysql_error() abgefragt hast) auch noch fehlt, ist ein Absichern gegen SQL-Injection.

      echo "$verabschiedung $name";

      1. Danke für den Hinweis, könntet ihr mir sagen wie genau die Prüfung geschrieben werden muss um zu funktionieren? Das wär echt klasse!!!

        Die function wie ich sie haben funktioniert nicht!

        function pruefeAufDoppeltenEintrag($verbindung, $schiffe_id, $starttermin) {
            $query = "SELECT * FROM reisen WHERE schiffe_id='$schiffe_id', starttermin='$starttermin'";
            $ergebnis = mysql_query($query, $verbindung);

        $doppelt = false;
            if (mysql_num_rows($ergebnis) > 0) {
                $doppelt = true;
            }
            return $doppelt;
        }

        irgendwo ist ein fehler vorhanden, oder der Cosde stimmt so erst gar nicht? Ich bräuchte da wirklich hilfe da mich das schon einige Tage beschäftigt! Vielen Dank in voraus...

        MR

        1. echo $begrüßung;

          Danke für den Hinweis, könntet ihr mir sagen wie genau die Prüfung geschrieben werden muss um zu funktionieren? Das wär echt klasse!!!

          Echt klasse wäre, wenn du dir die Grundlagen aneignetest.

          irgendwo ist ein fehler vorhanden, oder der Cosde stimmt so erst gar nicht? Ich bräuchte da wirklich hilfe da mich das schon einige Tage beschäftigt! Vielen Dank in voraus...

          Wie ich andeutete, und wie du auf eine Recherche nach der dir bereits vorliegenden Fehlermeldung hättest draufkommen müssen, geben mysql_*()-Funktionen im Fehlerfall nicht das eigentlich erwartete Ergebnis zurück sondern ein false. Dies musst du auswerten und angemessen reagieren. Den genauen Wortlaut der Fehlermeldung erhältst du mit der Funktion mysql_error().

          Baue zunächst diese Prüfungen für alle mysql_*()-Funktionen ein. Informiere dich zu den Rückgabewerten im Gut- und Fehlerfall im PHP-Handbuch. Wenn du das gemacht hast, wirst du auch wissen, wo dein Syntax-Fehler im SQL-Statement steckt. Es nützt nichts, nur diesen Syntax-Fehler zu beseitigen. Du benötigst das Fehlerbehandlungskonzept immer wieder.

          echo "$verabschiedung $name";

          1. ok werd ich mich mal dran machen vielen Dank!!!

            MR

  4. Moin Moin!

    Von der SQL-Injection-Katastrophe und Syntax-Fehlern mal abgesehen ist dieses Verfahren alles andere als effizient:

    function pruefeAufDoppeltenEintrag($verbindung, $schiffe_id, $starttermin) {
        $query = "SELECT * FROM reisen WHERE schiffe_id='$schiffe_id', starttermin='$starttermin'";
        $ergebnis = mysql_query($query, $verbindung);

    $doppelt = false;
        if (mysql_num_rows($ergebnis) > 0) {
            $doppelt = true;
        }
        return $doppelt;
    }

    Die Datenbank (oder MySQL in diesem Fall ;-)) muß ALLE betroffenen Datensätze zusammensuchen, zwischenspeichern und im Worst Case auch übertragen, nur damit PHP sie anschließend wegwirft bzw. wegwerfen läßt.

    SELECT COUNT(*) FROM ... WHERE ... liefert eine Zeile mit einer Spalte, die entweder 0 ist (WHERE-Bedingung nicht erfüllt) oder größer als 0 ist (WHERE-Bedingung erfüllt). Das kann oft komplett über Indexe laufen, spart jede Menge Datensammelei und benötigt nur Platz für einen Integer. Die Datenbank wird ihrer Freude darüber mit schnellerern Reaktionen bekunden.

    Eine Variable dafür zu verbraten, ein Boolean abhängig von einem Boolschen Ausdruck zurückzugeben, macht auch unnütz Arbeit, nicht nur dem Schreiber, sondern auch dem Computer: return $count>0;

    Arbeitet mehr als ein User mit dieser Oberfläche, kann zwischen der Abfrage auf "doppelt" (die negativ ausfällt) und dem Insert der neuen Daten ein zweiter User ebenfalls ein Insert ausführen. Beide Inserts werden erfolgreich sein, und die Datenbank ist inkonsistent. Um so etwas zu vermeiden, frickelt man üblicherweise nicht in der Applikation herum, sondern sorgt mittels eines UNIQUE CONSTRAINTs dafür, dass die Datenbank das zweite Insert schlicht verweigert. Wenn man die Bedingung für die Eindeutigkeit einer Tabellenzeile nicht in SQL ausdrücken kann, ist das Datenbank-Schema noch nicht normalisiert.

    Wie man Schemata normalsiert, steht in jedem besseren Buch zur Datenbank-Programmierung, Google & Co dürften auch jede Menge Informationen dazu ausspucken.

    Alexander

    1. echo $begrüßung;

      $query = "SELECT * FROM reisen WHERE schiffe_id='$schiffe_id', starttermin='$starttermin'";
          if (mysql_num_rows($ergebnis) > 0) {
      Die Datenbank (oder MySQL in diesem Fall ;-)) muß ALLE betroffenen Datensätze zusammensuchen, zwischenspeichern und im Worst Case auch übertragen, nur damit PHP sie anschließend wegwirft bzw. wegwerfen läßt.

      Nicht nur im Worst Case. PHP holt bei gepufferten Abfragen, wie sie mysql_query() macht, generell alle Datensätze der Ergebnismenge im Hintergrund ab und lagert sie zwischen. Nur dadurch ist es möglich, dass die Funktion mysql_num_rows() ein richtiges Ergebnis liefern kann. Siehe mysql_unbuffered_query().

      Dem Rest der Ausführungen kann ich nur zustimmen.

      echo "$verabschiedung $name";