Mehrere Befehle in ein abruf bei Datenbank

  • SQL
    1. UPDATE `besucher` SET `zahler` = `zahler` + 1;
    2. -- bedeuted:
    3. -- update besucher setze {das was in zahler ist} = {das was in zahler ist} + 1

    Das sollte das tun, was Du vorhast. Eigentlich recht einfach. Man muss es aber kennen|mal gesehen haben.

    Das rechnen wird hier also dem SQL server überlassen.

    Das Ganze hat auch einen großen Vorteil: wenn 2 oder mehr Scripte darauf zugreifen, dann setzten die sich die Werte nicht "kaputt".


    Bsp:

    Wert in db ist 1.

    Script 1 lädt Wert.

    Script 2 lädt Wert.

    Beide haben den Wert 1.

    Script 1 zählt 2 dazu - Wert im Script 1 (PHP seitig) ist nun 3.

    Script 2 zählt 1 dazu - Wert im Script 2 (PHP seitig) ist nun 2.


    Script 1 updated db: update ... wert = 3

    Script 2 updated db: update ... wert = 2


    Und hier ham wir den Salat. Beide sollten|wollten hochzählen, haben sich aber gegenseitig überschrieben.


    Wird es dem SQL server überlassen:

    Script 1 updated db: update ... wert = wert + 2

    Wert in db jetzt 3

    Script 2 updated db: update ... wert = wert + 1

    Wert in db jetzt 4


    ---


    SQL injection ist viel im Netz zu finden.

    Du solltest Dich erstmal für eine Sache (mysqli oder PDO, wobei PDO mMn besser ist) entscheiden.

    Das dann genauer ansehen und Du wirst feststellen, dass Du immer ::prepare nutzen wirst und (so gut wie) nie eine PHP Variable in die SQl Query schreiben wirst.

  • SQL
    1. UPDATE `besucher` SET `zahler` = `zahler` + 1;
    2. -- bedeuted:
    3. -- update besucher setze {das was in zahler ist} = {das was in zahler ist} + 1

    Jetzt habe ich wieder was falsch gemacht.Jetzt hat der bei allen 800 Einträgen die Zahl geändert.Oh man ich dreh noch am Rad

  • Das mit mysqli und PDO liegt daran das ich mal nur eins von beiden im Netz finde was funktioniert.

    Dieser Satz sagt eindeutig aus, dass du bisher keinerlei Verständnis für den Umgang mit Datenbanken hast. MySQLi und PDO sind Werkzeuge, mit denen der Datenbankzugriff möglich ist. Welches Werkzeug man nimmt, ist dabei Geschmacksache. PDO hat den Vorteil, dass es relativ leicht möglich ist, den DB-Server zu wechseln, also z.B. von MySQL auf PostgreSQL. Wenn man, was meist der Fall ist, nur mit MySQL zu tun hat, kann mal also auch MySQLi einsetzen.


    Die Datenbankabfragen sind in vielen Fällen identisch, und genau da hast du zu große Wissenlücken. Ich habe dir ja schon einige Datenbankzugriffe geschrieben, die du aber mit hoher Wahrscheinlichkeit einfach nur kopiert hast, ohne wirklich zu verstehen, was da passiert.


    Du steckst in der Situation, dass du die Grundlagen von PHP nicht beherrscht und auch nicht die Grundlagen von Datenbankabfragen. Dann springst du noch von einem Projekt zum nächsten und kopierst wie wild Beispiele aus dem Netz. So wirst du das nie vernünftig lernen!

  • Zitat
    Jetzt habe ich wieder was falsch gemacht.Jetzt hat der bei allen 800 Einträgen die Zahl geändert.Oh man ich dreh noch am Rad

    Naja, ne WHERE -Bedingung musst Du schon dran hängen.

    Du kannst das wieder rückgängig machen.

    Wenn Du das Script zB 3 mal ausgeführt hast, dann kannst Du bei allen wieder 3 abziehen:

    SQL
    1. UPDATE `besucher` SET `zahler` = `zahler` - 3;

    Übrigens bestätigt der Vorfall das, was scatello gerade geschrieben hat :D

    Nicht nur kopieren, sondern auch verstehen.


  • Alles was funktioniert habe ich ja verstanden.Wie datenbank erstellen lesen und schreiben,nur das verf.... Update geht nicht.

    Was soll man machen als googeln und ausprobieren. Habe jetzt das

    $statement = $pdo->prepare("UPDATE besucher SET zahler = '0' WHERE seite = '%$suchwort%'");


    Aber dann geht nix. mache ich where weg gehts.Habe mit hochkomma und ohne = ohne % statt suchwort ein a genommen weil es an meisten vorkommt ,es geht nix.Die Codes stehen ja bei phpadmin sogar drinne die man brauch. die gehen auch alle nur Das Update will nicht ,warum auch immer.


    Bekomme nicht mal Fehlermeldungen,wonach man sich orientieren könnte.


    EDIT Glaube habe Fehler gefunden.Und wenn es wirklich daran lag ,dann verstehe ich das noch nicht warum das ein Fehler ist.Meld mich sobald ich alles getestet habe und sicher bin.


    EDIT. Alles klar ,das Besucher Script von Letzten Monat ,was als Text Datei erstellt wurde ,habe ich jetzt fertig als Datenbak Script.


    Mache jetzt weiter beim Such Script und habe eine Fehlermeldung die mir nicht ganz klar ist.

    Code
    1. Warning: file_get_contents() [function.file-get-contents]: Sorry, socket access was denied. The contingent for <b>this hour</b> has been exceeded, in /users/sebastian1012/www/homepagebasti1012/besucherzahler/besucherzahler_erstellung.php on line 15

    Wie soll man das verstehen? Darf man solche suchen nur ein paar mal benutzen ,oder wie läuft das?

    Habe den Server jetzt mal etwas genervt weil ich paar sachen getestet habe ,wegen schnelligkeit und so weiter.Aber so großartig viel wahr das eigentlich nicht.

    Oder haben die freeware webspace Anbieter bestimmte beschränkungen wegen Anfragen und so weiter. Ich bin bei placed.net,fals da einer was drüber weiß.


    Kann man solche Fehler mit einer if abfrage abfangen. Weil wenn die suche mal überlastet ist,so das der user dann weiß, suche erst wieder ineiner Stunde oder so.Weil mit den php Fehler Code kann ja keiner was anfangen

    Dieser Beitrag wurde bereits 3 Mal editiert, zuletzt von basti1012 ()

  • Ich habe es jetzt so und so läuft es .

    Code
    1. $statement = $pdo->prepare("UPDATE `besucher` SET `zahler`='$zahlneu' WHERE seite='$suchwort'");

    Aber selbst so ging es die ganze Zeit nicht .Erst wo ich das Leerzeichen zwischen zahler' und = rausgenommen habe,lief der Code.

    Wie weit sind den in sql die Leerzeichen zu beachten ?

    Bei Html und Js kann man bei den meisten Sachen Leerzeichen außer acht lassen ohne das ein Fehler kommt.

    Nur ich habe mich strubelig gesucht heute Nacht. Da half auch kein Google,das hatte ich auch nur aus Zufall gefunden.

    Deswegen muß ichda mal was zum lesen haben wie weit Semikolios und Leerzeichen in Sql verwendet werden kann/darf/muß/oder nicht darf

  • Kann nicht sein. Du kannst hundert oder kein Leerzeichen nutzen, Tabs und new line ...

    Evtl hast Du beim Kopieren irgendein Zeichen kopiert, das wie ein Leerzeichen aussah, aber keins war.

    Und beim entfernen des Leerzeichens hast Du das Zeichen entfernt.


    Ich hatte mal das Problem, als ich mal Code aus dem Teamspeak Chat kopiert hatte.


    BTW; immernoch offen für SQL injection,

  • keine ahnung was da los wahr.Das wahren die letzten zuckungen meines Laptops,der gestern ganz den geißt aufgegeben hat.Habe jetzt wennigstens eine Tastertur die funktioniert (auch die Leertaste juhu ).

    Aber wie gesagt das Script läuft ja jetzt .

    Die Tips die ihr mir gegeben habt habe ich bei mein Suchscript auch benutzen können.

    Das script funktioniert auch soweit ,wollte aber da noch was ändern,was ich aber erst versuche zu ergoggeln.

  • Ich versteh es nicht. Googel schreibt das überall so bzw so ähnlich aber nix klappt Richtig

    So bekomme ich den ersten Eintrag aus der Tabelle.Den ich aber nicht will ich brauche den letzten .

    Also habe ich es mit ASC gemacht.

    Dann zeigt er mir aber irgendein Eintrag aus der mitte der Tabelle.Warum??

    Ich will wissen ob der letzte Eintrag (IP) die gleiche ip hat die ich jetzt speichern will.


    Aber ich brauche erstmal den letzten Eintrag ,und ich bekomme nur den ersten oder irgendein mitten drinne.


    EDIT : Keine Fehlermeldungen

  • Eine IP ist nicht gerade der Bringer, wenn du den letzten Eintrag haben willst. Ich hoffe mal, du hast eine eindeutige ID in der Tabelle, dann sortiere danach, damit wird es gehen.


    $query = "SELECT `ip` FROM `fehlermelden` ORDER BY `id` DESC LIMIT 1";

  • ich habe einmal die normale id,und einmal die sessionid die das erneute senden verhindern soll.Das klappt auch.

    Die ip wollte ich eigentlich haben,damit ich eine Zeitsperre erstellen kann ,was du zuspammen verhindern soll.


    Dachte das die ip da am einfachsten ist,weil sessionid ist nach den reload der Seite ja wieder neu und würde ein erneutes senden ja nicht verhindern.

    Oder mache ich da was falsch mit der id.

    Code
    1. $_POST['checkID'] = md5(microtime());

    Im html

    Code
    1. <input name="checkID" type="hidden" value="<?PHP echo $_POST['checkID']; ?>">
  • Dafür kannst du aber doch nicht den letzten Eintrag in der Datenbank nehmen.


    Beispiel:

    Ein Depp haut dir irgendeinen Sch... in dein Gästebuch. Gleichzeitig will das auch ein vernünftiger User machen, der klickt aber eine Sekunde später auf Speichern als der Depp.


    So, welcher Eintrag ist nach deiner Logik der Letzte?


    Und was soll der Quatsch?

    Code
    1. $_POST['checkID'] = md5(microtime());

    Wieso nutzt du das $_POST?? Warum nicht gleich

    Code
    1. <input name="checkID" type="hidden" value="<?PHP echo md5(microtime()); ?>">

    Und wofür soll das überhaupt gut sein?

  • mit den letzten user hast du natürlich recht.wenn zwei gleichzeitig schreiben nutzt das nix.

    Und wofür soll das überhaupt gut sein?

    Ja da wahr google mein Freund. Zumindest verhindert das,das versehnliche doppel versenden.


    Dann muß ich mir was anderes einfallen lassen,wie ich das zuspammen erschweren kann.

  • Wenn du die IP-Adresse zu jedem Eintrag speicherst und dann dazu das Datum als date_time, ist das eine ganz einfache Nummer

    So ungefähr müsste das gehen, ist nicht getestet

  • Leider funktioniert das nicht. Der vergleicht das irgendwie nicht kein plan was da genau los ist ,der schreibt immer NA GUT.

    muß mal kucken ob ich das irgendwie hinbekomme.

    Zumindest weiß ich wie du es meinst.

    Nur eins verstehe ich noch nicht.Durchsucht dein Code die ganze Tabelle nach der Ip ? und vergleicht dann die Zeit? oder vergleicht er nur den letzten Beitrag ob die ip gleich ist.? und dann die Zeit.

    Nagut ich versuche mal weiter und meld mich dann.

    INFO : Fehlermeldungen gibt es aber keine bei dein Code

  • so habe jetzt eine lösung .

    Bin mir zwar nicht sicher ob die Syntax,oder wie man das auch saagt alles stimmt.

    Zumindest funktioniert es .Zumindest beim testen,bin mir aber noch nicht sicher ob es in der Praxis auch funktioniert,vor allem wenn eine ip öffters vorkommt ,ob er dann trotzdem die 300 Sekunden Zeitfenster erkennt und nicht nach den älteren Beitrag geht

    Code
    1. $suchwort=$ip;
    2. $block_in_seconds = 300;
    3. $datumjetzt = date('U')- $block_in_seconds;
    4. $query = "Select `ip`, `datum` ,`vorname`, `auswahlfehler`,`Fehlerlink`, `info`, `checkID`,`id` FROM `fehlermelden` WHERE ip LIKE '%$suchwort%' AND `datum` > '$datumjetzt' ";

    Kann man eigentlich speichern und abfragen gleichzeitig?

    Zb so wie oben plus das

    Code
    1. $query = "Insert into `fehlermelden`(`ip`, `datum` ,`vorname`, `auswahlfehler`,`Fehlerlink`, `info` `checkID`,`id`) values ('%s', '%s', '%s', '%s','%s', '%s', '%s', '%s')";

    und dann irgendwie weiter?

    Ich hofe du verstehst was ich meine