PHP + MySQL Problem

  • Hallo erstmal,

    ich versuche als eine bewertung zu programmieren doch hab ich mir das leider leichter als gedacht vorgestelt.

    und zwar gibs die möglichkeit dateien mittels eines plus oder minus buttons zu bewerten. doch wird nichts in die DB geschrieben!

    hier der code:

    ist aber im mom nur die plus/top funktion!

    komme nicht weiter ... bitte um hilfe ... mfg

  • So also erstmal ist gesagt les die werte aus, dann speicherst du sie in variabeln, Weil so funktioniert der Update nicht.

    PHP
    mysql_query ("UPDATE musik SET vote = vote + '1', vote_ges = Vote_ges + '1', prozent=(vote*100/vote_ges) WHERE id = '$top'");

    Dann habe ich noch einen Fehler gefunden, und zwar "vote_ges = Vote_ges + '1'" du musst genau darauf achten, dass die Groß und Kleinschreibung richtig gesetzt ist.

  • Hast du schonmal mit einer Testausgabe probiert ob das Script überhaupt in die if-Bedingung springt?
    Nach dem was du hier postest beruht dein Script auf der veralteten Einstellung register_globals. Das ist ganz ganz schlecht, da es eine ziemlich Sicherheitslücke darstellt. Aus diesem Grund ist das mittlerweile bei den meisten Hostern auch standardmäßig deaktiviert.

    Register_globals auf on bedeutet, dass du auf alle Variablen aus den globalen Arrays $_GET, $_POST, $_SESSION auch nur über den Key zugreifen kannst.
    In deinem Beispiel übergibst du die zu bewertende ID mit ?top=".$row['id']

    Diese Variable kann mit register_globals aktiviert dann auch auf der aufgerufenen Seite mit $top angesprochen werden.
    Wenn bei dir aber register_globals deaktiviert ist, was ich mal hoffe, dann kannst du die Variable nur noch über $_GET['top'] ansprechen. $top ist dann nicht gesetzt, es wird nie in die if-Bedingung gesprungen und es kann auch nicht upgedated werden.

    Dann noch:
    vote = vote + '1'
    Wenn du da rechnest ist vote wohl ein INT-Feld. Also die ' ' weglassen, bin grad nicht sicher ob das auch noch eine Fehlerursache ist, aber es ist definitiv unsauber.
    Schreib:
    vote = vote + 1
    und
    vote_ges = Vote_ges + 1

    Zitat


    So also erstmal ist gesagt les die werte aus, dann speicherst du sie in variabeln, Weil so funktioniert der Update nicht.

    Was soll da nicht funktionieren? Wenn er int-Werte einfach erhöhen will macht er es genau richtig (abgesehen von den ' '). Die Werte vorher auszulesen, mit php zu erhöhen und dann wieder einzutragen wäre völlig umständlich, unnötig und viel langsamer. Sollte er auf gar keinen Fall machen!

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Also erstmal danke!

    Was mir aufgefallen ist das die query falsch war!
    hab es geänder und jetzt tut sich auch was in der DB aber immer noch nicht ganz richtig!

    die IF anweisung hab ich in ... if (isset($_GET['top'])) ...bzw in... if (isset($_GET['flop'])) ... umgeschrieben.

    so ... das vote ist auch ein INT feld und es funktionier beides vote = vote + '1' und auch ohne ' '!

    nun hab ich das problem das in der db immer zb. bei vote um +2 hochgerechnet wird und nich +1.

    so siehts im mom aus der code:

    PHP
    echo    "&nbsp;<a style='color:#000000' href='uebersicht.php?top=".$row[1]."'><img src='img/top.gif' border='0' height='15' /></a>";
            echo    "&nbsp;<a style='color:#000000' href='uebersicht.php?flop=".$row[1]."'><img src='img/flop.gif' border='0' height='15' /></a>";

    und der teil noch:

    edit // danke bandit600 prima sache!!!!

  • Bist du sicher, dass vote um 2 erhöht wird? Nach deinem Code hier kann das eigentlich nicht sein. Es sei denn du hast die if-Anweisung dafür zweimal in deinem Code stehen, oder sie steht in einer Schleife die zweimal durchlaufen wird.
    Oder hast du vielleicht die Seite refresht? Dann wird das natürlich auch zweimal ausgeführt.

    Check das bitte mal oder poste den kompletten Code.
    Mit den beiden if-Anweisungen die du gepostet hast wird das nur 1x um 1 erhöht.

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Hat was mit der schleife zu tun!

    hat was mit der schleife zu tun und zwar mit $rs ...
    ... sobald ich 3 datensätze in der DB hab zählt er plus 3
    weil der sicherlich die schleife dann dreimal durchläuft

  • Ja die if-Anweisung muss vor der Schleife stehen.
    Beachte bitte die von mir ergänzten Kommentare.

    "Warum soll ich nicht SELECT * schreiben?"
    http://www.php-faq.de/q-sql-select.html

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Ich bin noch ein anfänger hab die abfragen gesetzt weil ich es so für richtig gehalten hab!


    "Warum soll ich nicht SELECT * schreiben?"



    meist du damit das alle spalten nutzlos geldan werden wenn ja ...
    ... soll das dann so umgesetzt werde?

    PHP
    SELECT id FROM musik WHERE id=$top

    die do-schleife verwende ich weil ich gelesen hab das es zu erst die if-anweisung prüft und das hat sich für mich als richtig angehört

    edit //

    wenn ich die if-anweisungen vor die schleife setze wie in dem code den du bearbeitet hast
    bekomme ich das problem das nach einem vote der erste datensatz sein name ändert und
    nur die id des bewerteten datensatzes als namen ausgibt.


    <param name="FlashVars" sprichst du $row an. Welcher Wert soll da rein?


    mit <? echo $row[0]; ?> wird mir der datensatz name was gleichzeitig auch der dateiname ist ausgegeben!
    was zu folge hat das ich jeden song mittels eines flashbuttons hören bzw. stoppen kann z.b. vor dem download (nein keine urheberrechtsverletzung! schon aufs maul geflogen ... nie wieder!)

  • Bin grad erst nachhause gekommen von der Arbeit, noch Termine gehabt und grad saumüde, ich gehe morgen mal genauer auf die Punkte ein.

    Falls du das heut noch liest könntest du mal die Tabellenstruktur von `musik` posten, und die SELECT-Abfrage für die die while-Schleife durchlaufen wird (die Abfrage deren Ergebnis du in $rs speicherst, wo du die Datensätze in der while-Bedingung abholst). Und falls die Abfrage auf eine andere Tabelle geht noch die entsprechende Tabellenstruktur.

    Dann kann ich dir vielleicht noch paar nützliche Tipps geben.

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • db:

    PHP
    `id` tinyint(4) NOT NULL auto_increment,
      `kommentar` varchar(250) default NULL,
      `dateiname` varchar(100) default NULL,
      `vote` int(11) default '0',
      `vote_ges` int(11) default '0',
      `prozent` float default '0',
      `datum` datetime default NULL,

    kommpletter code:

  • Sehr zu empfehlen:

    Richtig debuggen
    1. Man bemerkt, dass ein Skript nicht das tut, was es soll.
    2. Man schreibt an den Anfang des Scriptes die Zeile: error_reporting(E_ALL); und ini_set("display_errors", true);
    3. Man versucht, die Stelle die daran Schuld sein kann, schonmal einzugrenzen. Falls dies nicht geht, wird zunächst das komplette Skript als fehlerhaft angesehen.
    4. An markanten Stellen im Skript lässt man sich wichtige Variableninhalte ausgeben und ggf. auch in bedingten Anweisungen eine kurze Ausgabe machen, um zu überprüfen, welche Bedingung ausgeführt wurde (oder auch nicht).
    5. Schritt 3 wird so lange wiederholt, bis Unstimmigkeiten im Skript auffallen
    6. Damit hat man das Problem (Unstimmigkeit) gefunden und kann versuchen diese zu beheben. Hierzu dienen dann die PHP-Dokumentation und andere Quellen als Ratgeber.
    7. Lässt sich das konkrete Problem trotzdem nicht beheben, kann man in Foren um Rat fragen.
    8. Das Programm läuft und man kann die Debug-Ausgaben wieder entfernen.


  • meist du damit das alle spalten nutzlos geldan werden wenn ja ...
    ... soll das dann so umgesetzt werde?

    PHP
    SELECT id FROM musik WHERE id=$top


    Naja, die Abfrage macht keinen Sinn, sie kann dir ja nur ein bereits bekanntes Ergebnis liefern, nämlich $top.

    Hast du dir den von mir geposteten Link durchgelesen?
    Du sollst halt statt * immer nur genau die Felder angeben, die du auch benötigst, die also im weiteren Verlauf des Scripts verarbeitet werden.
    Auch wenn du wirklich alle Felder brauchst. Es kann ja immer mal passieren, dass eine Tabelle erweitert wird und du das Feld dann nicht benötigst.
    Und grade wenn man, wie du hier, mit numerischem Index im Ergebnis-Array arbeitet, statt mit den Spaltennamen, sollte man auf keinen Fall SELECT * schreiben, da die Reihenfolge in der die Spalten zurückgegeben werden nicht sicher ist.


    wenn ich die if-anweisungen vor die schleife setze wie in dem code den du bearbeitet hast
    bekomme ich das problem das nach einem vote der erste datensatz sein name ändert und
    nur die id des bewerteten datensatzes als namen ausgibt.


    Das liegt daran, dass du in deinen if-Bedingungen $row überschreibst. Wozu die SELECT-Abfrage in den if-Bedingungen überhaupt dient habe ich aus deinem Script nicht erkennen würden, so wie du es hier gepostet hast können die SELECT-Abfragen aus den if-/elseif-Bedingungen gelöscht werden, da die Ergebnisse nie verwendet werden.

    Hier mal dein Script noch etwas überarbeitet und kommentiert.

    Edit: Die Debug-Anleitung von Bandit solltest du auf jedenfall beherzigen und dir angewöhnen, damit kann wenn sie vernünftig und korrekt angewendet wird 95% aller Probleme selbst lösen. Und dabei lernt man dann auch am meisten. :)

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

    Einmal editiert, zuletzt von SinnlosS (22. September 2009 um 11:07)

  • eine berechtigung kontrolle ist noch nicht
    drin da die seite noch nicht online ist ...
    ... und ich erstmal die funktion der bewertung machen wollte!
    Aber es kommt!

    die SELECT-Abfragen sind dafür da um für die if-Anweisungen der Spalten zu laden ... obwohl $row wird ja garnicht verwendet!
    Hab die auch rausgenommen!

  • Edit: Die Debug-Anleitung von Bandit solltest du auf jedenfall beherzigen und dir angewöhnen, damit kann wenn sie vernünftig und korrekt angewendet wird 95% aller Probleme selbst lösen.


    Genau, besonders Punkt 2 ist hier sehr interessant. PHP wird dann nämlich Warnings bzgl. $top und $flop raushauen. ;)

  • Kann ich mir nicht vorstellen. In dem Script wird $top und $flop ohne vorherige Zuweisung benutzt.

  • hab es im xampp laufen lassen und es werden
    tatsächlich jetzt fehler ausgegeben:

    Code
    [B]
    Notice[/B]:  Undefined variable: top in [B]...
    [/B]
    PHP
    mysql_query ("UPDATE musik SET vote = vote + 1, vote_ges = vote_ges + 1, prozent=(vote*100/vote_ges) WHERE id = '$top'");

    bzw.

    Code
    [B]Notice[/B]:  Undefined variable: flop in [B]...[/B]
    PHP
    mysql_query ("UPDATE musik SET vote = vote - 1, vote_ges = vote_ges + 1, prozent=(vote*100/vote_ges) WHERE id = '$flop'");
  • also ich weiß dass man variablen innerhalb von gänsefüßli oder so benutzen kann.. aber grad bei solch datenbank-sachen mach ih des immer den "kompletten weg"

    PHP
    mysql_query ("UPDATE musik SET vote = vote + 1, vote_ges = vote_ges + 1, prozent=(vote*100/vote_ges) WHERE id = '".$top."'");