edx: datenbank

hallo forum,
ich möchte in einer mysql tabelle einträge per formular speichern.
um zu checken ob schon ein eintrag vorhanden ist, habe ich ein tabellenfeld 'integer' angelegt. so soll pro eintrag der int hochgezählt werden. dazu habe ich eine if else abfrage die nun wissen sollte (dachte ich)ob der wert >0 oder ==0 ist (INSERT or UPDATE). nur den angegebenen wert der querry ignoriert meine abfrage (kontrliere am bildschierm) geht
immer von null aus. wenn ich direckt in script einen wert zuordne funst die abfrage.
hier ein codeschnipsel:

$select="SELECT * FROM bewertung WHERE bez = '$bez'";

$res=mysql_query($select,$link);
$anzahl=mysql_fetch_assoc($res);

$counter=$anzahl[hits];

if(isset($_GET['bewert']) && !empty($_GET['bewert']) )
{

$today = date("d.m.y");
 if($counter==0)
 {
  $counter++;

$insert2="INSERT INTO bewertung (bez,name,mail,bewert,date_bewert,hits) VALUES ('$hidden','$name','$mail','$bewert','$today','$counter')";
   mysql_query($insert2,$link)or die ("bewertung insert: Ungültige Abfrage: " . mysql_error());

}
 else
 {
  $counter++;

$update="UPDATE bewertung SET name='$name',     mail='$mail', bewert='$bewert',date_bewert='$today',hits='$counter' WHERE bez like '$hidden'";
   mysql_query($update,$link)or die ("bewertung update: Ungültige Abfrage: " . mysql_error());

}
}

  1. Hallo!

    haste überprüft, dass du einen Wert von deiner SQL Query zurückbekommt?
     Ich hätte nämlich so geschrieben:
     $select="SELECT * FROM bewertung WHERE bez = '".$bez."'";

    Danach würde ich Zeile nach zeile debuggen und gucken wo der Fehler liegt

    1. Hallo!

      haste überprüft, dass du einen Wert von deiner SQL Query zurückbekommt?
      Ich hätte nämlich so geschrieben:
      $select="SELECT * FROM bewertung WHERE bez = '".$bez."'";

      ja,die werte bekomme ich zurück.

      Danach würde ich Zeile nach zeile debuggen und gucken wo der Fehler

      liegt
      das versuche ich, leider erfolglos.

  2. Hallo

    [... viel Code ohne jegliche Fehlerbehandlung gelöscht ...]

      
    
    >  if($counter==0)  
    >  {  
    >   $counter++;  
    
    // In diesem Fall hat $counter also den Wert 1,  
    // Nur in diesem Fall führst Du ein INSERT durch  
    // Daher mache es Dir einfach:  
    // Standardwert des Feldes "hits" ist 1  
    // Lasse das Feld "hits" in Deiner INSERT-Anweisung weg.  
    // Fall soweit erledigt.  
      
    
    >   $insert2="INSERT INTO bewertung (bez,name,mail,bewert,date_bewert,hits) VALUES ('$hidden','$name','$mail','$bewert','$today','$counter')";  
    
    // Hier ein Debug-Statement einfügen, so dass Du den Inhalt Deiner Variablen  
    // $insert2 angezeigt bekommst. Steht da das drin, was Du erwartest.  
      
    
    >    mysql_query($insert2,$link)or die ("bewertung insert: Ungültige Abfrage: " . mysql_error());  
    
    // und hier die "Ungültige Abfrage" gerade mit ausgeben :-)  
      
    
    >  }  
    >  else  
    >  {  
    
    // In diesem Fall wird der Feld des Wertes "hits" um 1 erhöht.  
    // Auch dies überlassen wir einfach der Datenbank  
      
    
    >   $update="UPDATE bewertung SET name='$name',     mail='$mail', bewert='$bewert',date_bewert='$today',hits='$counter' WHERE bez like '$hidden'";  
    
    // stattdessen:  
    ... ,hits = hits + 1 WHERE ...  
    // und auch hier Debug-Ausgabe des SQL-Statements  
      
    
    >    mysql_query($update,$link)or die ("bewertung update: Ungültige Abfrage: " . mysql_error());  
    
    

    und für den Datumsstempel in Deiner Tabelle könntest Du clevererweise die Eigenschaften des TIMESTAMP-Datentyps nutzen - und somit die Pflege dieses Feldes ebenfalls der Datenbank überlassen.

    Freundliche Grüße

    Vinzenz

    1. Moin!

      if($counter==0)
      {
        $insert2="INSERT INTO bewertung (bez,name,mail,bewert,date_bewert,hits) VALUES ('$hidden','$name','$mail','$bewert','$today','$counter')";
      }
      else
      {
        $update="UPDATE bewertung SET name='$name',     mail='$mail', bewert='$bewert',date_bewert='$today',hits='$counter' WHERE bez like '$hidden'";
      }

        
      Das geht mit der passenden MySQL-Version auch einfacher. Da gibts für INSERT-Statements diese Möglichkeit  
        
      INSERT INTO tabelle VALUES (bla, fasel) ON DUPLICATE KEY UPDATE ...  
        
      Erforderlich ist hierbei die Existenz eines Primärschlüsselts oder eines Unique-Index, dessen Wert durch INSERT gesetzt wird - nur dann kann es zu der Situation kommen, dass der Schlüssel schon existiert und stattdessen das UPDATE-Statement greift. Das UPDATE kann dann übrigens komplett andere Dinge tun, als das INSERT.  
        
      <http://dev.mysql.com/doc/refman/4.1/en/insert-on-duplicate.html>  
        
      
      > und für den Datumsstempel in Deiner Tabelle könntest Du clevererweise die Eigenschaften des [TIMESTAMP](http://dev.mysql.com/doc/refman/4.1/en/datetime.html)-Datentyps nutzen - und somit die Pflege dieses Feldes ebenfalls der Datenbank überlassen.  
        
      Würde ich nicht unbedingt empfehlen, die Timestamp-Funktionalität ist mit MySQL 4.1 etwas komplizierter zu handhaben geworden.  
        
       - Sven Rautenberg
      
      -- 
      "Love your nation - respect the others."
      
      1. ich bedanke mich für eure hilfe.
        war nicht der 'aha' efect, aber ist wohl schwierig jemandem zu helfen der einem laufendes programm umschreiben muss. jetzt weiß ich das der bug anders
        wo liegen muss, (durch eure bestätigung).
        schöne grüße
        edx