Ankündigung

Einklappen
Keine Ankündigung bisher.

php script zum ändern Zufällig ausgewählter mysql rows

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • php script zum ändern Zufällig ausgewählter mysql rows

    Hallo liebe PHP.DE Community,

    ich schreibe aktuell eine Website für meinen Bruder und bin auf ein Problem gestoßen,
    ich möchte ein php Script schreiben welches aus einer Mysql Tabelle eine bestimmte Anzahl
    an Einträgen zufällig auswählt und bei allen ausgewählten Einträgen eine bestimmte spalte
    ändert, ich bekomm es leider nicht umgesätzt und meine vorhandenen Codeansätze sind müll

    Mit freundlichen Grüßen,
    Duelist (Christian)

  • #2
    PHP-Code:
    update <mytableset <mycolumn>=<newvaluewhere <keyclooumn>=FLOOR(random()*<mydesiredmaxid>) 
    oder
    PHP-Code:
    update <mytableset <mycolumn>=<newvaluewhere <keyclooumn>=FLOOR(rand()*<mydesiredmaxid>) 
    Hängt etwas von Deiner Datenbank ab. Mysql, Postgres, ...

    Da Du nichts über Typen und Inhalt Deiner Tabelle schreibst, wäre das erstmal ein Beispiel für einen Datensatz.

    Um es für mehere Datensätze zu machen bspw.

    PHP-Code:
    update <mytableset <mycolumn>=<newvaluewhere <keyclooumnin
    Select FLOOR
    (rand()*<mydesiredmaxid>) from irgendeineTabelle limit <sovielwieDumöchtest

    Kommentar


    • #3
      Danke für deine Antwort,

      bei deinem dritten code beispiel,
      kann ich bei
      PHP-Code:
      <soviel wie du möchtest
      einen aus einer form angegeben wert benutzen?
      Und
      PHP-Code:
      <mydisiredmaxid
      ist das um anzugeben wie hoch die id des row sein darf?

      Mit freundlichen Grüßen,
      Christian.

      Kommentar


      • #4
        kann ich.. ja

        wie hoch .. ja

        Nimm Dir einfach mal ein SQL tool und probier die Statements aus.
        Sie beißen nicht. (Ok, das Update vielleicht ein wenig).

        Spiel etwas damit. Probier die Parameter und schau was dabei rauskommt.

        P.S.:
        <irgendeineTabelle> ist nur ein Zeilenspender in diesem Statement, sie wird natürlich nicht mehr Datensätze ausgeben, als drin stehen. Also nicht wundern, wenn Dein Limit nur halb funktionieren sollte und oberhalb einer magischen Grenze immer gleich viel ausgibt.
        Das ist zugegeben etwas krückig, aber es funktioniert in jeder Datenbank.


        Kommentar


        • #5
          Zitat von Perry Staltic Beitrag anzeigen
          kann ich.. ja

          wie hoch .. ja

          Nimm Dir einfach mal ein SQL tool und probier die Statements aus.
          Sie beißen nicht. (Ok, das Update vielleicht ein wenig).

          Spiel etwas damit. Probier die Parameter und schau was dabei rauskommt.

          P.S.:
          <irgendeineTabelle> ist nur ein Zeilenspender in diesem Statement, sie wird natürlich nicht mehr Datensätze ausgeben, als drin stehen. Also nicht wundern, wenn Dein Limit nur halb funktionieren sollte und oberhalb einer magischen Grenze immer gleich viel ausgibt.
          Das ist zugegeben etwas krückig, aber es funktioniert in jeder Datenbank.

          Alles klar, danke dir, werd den ganzen Spaß gleich mal austesten.

          MFG,
          Christian

          Kommentar


          • #6
            Hi,

            ich habe das mal ausprobiert, mit angepasten daten und ich bekomme folgenden error:

            Code:
            Error updating record: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Select FLOOR(rand()*1000) from giveaway_entrys limit 1' at line 2
            Mein code schaut wie folgt aus:

            PHP-Code:
            if(isset($_GET['draw'])) {
                
            $numbers $_POST['number'];
                
            $sql "update giveaway_entrys set winner=1 where id in
                            Select FLOOR(rand()*1000) from giveaway_entrys limit 
            $numbers";

                if (
            $conn->query($sql) === TRUE) {
                    
            $display '
                    <div class="w3-row w3-margin w3-round">
                     <div class="w3-container w3-green w3-round">
                    <h5>Change was Succesfull</h5>
                    </div>
                     </div>
                    '
            ;
                } else {
                    echo 
            "Error updating record: " $conn->error;
                }

            Code:
            Server Version: 5.7.21 - MySQL Community Server (GPL)

            Kommentar


            • #7
              Tja, erstmal hab ich die Klammern ums Subselect vergessen.
              Dann kann mysql kein Limit im Subselect und mag als Source nicht die Update Table. Wusste ich nicht.

              Hier habe ich mal eine Krücke gepostet, die man als Ansatz betrachten könnte und die vielleicht halbwegs tut, was Du möchtest.
              http://rextester.com/LCAYK99789
              Diese Funktion macht so nur Sinn, wenn die ID fortlaufend vorhanden sind.

              Kommentar


              • #8
                Vorallem hast du Sicherheitslücken.

                PHP-Code:
                    $numbers $_POST['number'];
                    
                $sql "update giveaway_entrys set winner=1 where id in
                                Select FLOOR(rand()*1000) from giveaway_entrys limit 
                $numbers"

                Kommentar


                • #9
                  Zitat von strub Beitrag anzeigen
                  Vorallem hast du Sicherheitslücken.

                  PHP-Code:
                   $numbers $_POST['number'];
                  $sql "update giveaway_entrys set winner=1 where id in
                  Select FLOOR(rand()*1000) from giveaway_entrys limit 
                  $numbers"
                  Das ist an und für sich sehr freundlich von dir mich darauf hinzuweisen, magst du mir zusätzlich aber bitte erklären welche?

                  Kommentar


                  • #10
                    In $_POST['number'] kann alles Mögliche drin stehen. Du verwendest es für Limit, also erwartest du dort einen ganzzahligen Wert, dies solltest du vor Verwendung in der SQL-Abfrage prüfen, ob der Typ stimmt und der Zahlenbereich, den du zulassen willst.
                    Wenn es nicht zutrifft, solltest du entsprechend reagieren und auf keinen Fall die SQL-Abfrage ausführen.

                    Guter Artikel dazu auf deutsch zur Validierung von Parametern.

                    Kommentar


                    • #11
                      Zitat von protestix Beitrag anzeigen
                      In $_POST['number'] kann alles Mögliche drin stehen. Du verwendest es für Limit, also erwartest du dort einen ganzzahligen Wert, dies solltest du vor Verwendung in der SQL-Abfrage prüfen, ob der Typ stimmt und der Zahlenbereich, den du zulassen willst.
                      Wenn es nicht zutrifft, solltest du entsprechend reagieren und auf keinen Fall die SQL-Abfrage ausführen.

                      Guter Artikel dazu auf deutsch zur Validierung von Parametern.
                      Danke dir, habs mir durchgelesen und werde es berücksichtigen.

                      Mfg
                      Duelist

                      Kommentar


                      • #12
                        Hallo,
                        ich melde mich mal wieder, jetz bekomme ich folgenden fehler:

                        Mysql Server (Server-Version: 5.7.21 - MySQL Community Server (GPL):

                        Code:
                        Error updating record: This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
                        MariaDB Server (Server-Version: 10.1.26-MariaDB-0+deb9u1 - Debian 9.1):

                        Code:
                        Error updating record: This version of MariaDB doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
                        Mit freundlichen grüßen
                        Duelist.

                        Kommentar


                        • #13
                          Was ist daran jetzt unklar? Liest sich doch ziemlich eindeutig.

                          MySQL kann das nicht. Ich nehme mal nicht an, dass du das Datenbanksystem wechseln möchtest. In dem Fall rate ich zuerst das SELECT auszuführen und anschließend mit den erhaltenen Werten das UPDATE auszuführen, statt beides gleichzeitig in einer Abfrage.

                          Kommentar


                          • #14
                            ok danke,
                            mach ich

                            Kommentar

                            Lädt...
                            X