Lunch Roulette - Personen zufällig unter Bedingungen matchen

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

  • Lunch Roulette - Personen zufällig unter Bedingungen matchen

    Hallo !

    Ich bin neu hier im Forum. Auch habe ich kaum PHP Erfahrung.

    Als Lernender muss ich innerhalb von 2 Monaten ein "Lunch-Roulette" entwickeln, welches intern per Webseite zugänglich ist.

    Dort kann man sich per Formular anmelden. Dabei wird der Standort, Abteilung und Generation (Alter) beachtet.

    Monatlich sollte dann ein Job ausgeführt werden der jeweils 2 Personen matched:
    -Die vom gleichen Standort sind
    -Die nicht von der gleichen Abteilung sind
    -Die nicht aus der gleichen Generation stammen

    Die Glücklichen sollten dann per Mail benachrichtigt werden




    Jetzt meine Frage an euch Profis:

    Kann ich solche Matchings mit PHP/MySQL überhaupt durchführen? Gibt es Jobs die PHP's ausführen? Wie schedule ich das Ganze dann? Kennt ihr ähnliche Projekte oder Beiträge die hier im Forum schon besprochen wurden?

    Im Netz fand ich leider kaum Infos dazu und entschied mich jetzt, im PHP Forum Hilfe zu suchen.


    Viele Grüsse, Roman
    Zuletzt geändert von projektphp; 01.10.2018, 13:42.

  • #2
    Zitat von projektphp Beitrag anzeigen
    Kann ich solche Matchings mit PHP/MySQL überhaupt durchführen?
    Ja
    Zitat von projektphp Beitrag anzeigen
    Gibt es Jobs die PHP's ausführen?
    Nein
    Zitat von projektphp Beitrag anzeigen
    Wie schedule ich das Ganze dann?
    Mit einem Cronjob
    Zitat von projektphp Beitrag anzeigen
    Kennt ihr ähnliche Projekte oder Beiträge die hier im Forum schon besprochen wurden?
    Nein

    Kommentar


    • #3
      Also muss ich mir eine andere Technologie suchen, um das Matching mit einem Job/Scheduler zu kombinieren?

      Bei einem Referenzprojekt wurde dafür eine "Console Application" verwendet. Dachte ich finde eine einfachere Lösung in direkt mit PHP :-(

      Danke für die Info
      Zuletzt geändert von projektphp; 14.08.2018, 11:40.

      Kommentar


      • #4
        Zitat von projektphp Beitrag anzeigen
        Also muss ich mir eine andere Technologie suchen, um das Matching mit einem Job/Scheduler zu kombinieren?
        Habe ich doch schon geschrieben, ein Cronjob, mit dem du das Script zu einem gewünschten Zeitpunkt aufrufst, ist dein Freund

        Kommentar


        • #5
          WGET / Server Task Scheduler ist die Lösung

          Ich habe jetzt eine Lösung gefunden:

          WGET für Windows herunterladen. WGET simuliert einen Aufruf des PHP und kann mit dem Server Task Scheduler ausgeführt werden.

          Hier das Video dazu:

          https://www.youtube.com/watch?v=sx4vh4KdFPw

          Vielleicht hilft es jemandem!

          Gruss

          Kommentar


          • #6
            Zitat von projektphp Beitrag anzeigen
            Ich habe jetzt eine Lösung gefunden
            Die richtige Lösung nennt sich immer noch Cronjob. Schön, dass du das ignoriert hast

            Kommentar


            • #7
              Zitat von projektphp Beitrag anzeigen
              Gibt es Jobs die PHP's ausführen?

              DU: Nein

              Also habe ich nach einer anderen Lösung gesucht. Das PHP welches ich schedulen möchte, soll ja nur die Daten aus der Teilnehmer-Tabelle verarbeiten bzw. immer 2 Personen unter gewissen Bedingungen zusammen matchen und dann in eine Match-Tabelle schreiben.

              Ich suche noch nach einer Lösung um die Teilnehmer unter bestimmten Bedingungen zu matchen. In ABAP konnte man das mit internen Tabellen lösen.

              Im Internet finde ich viele Beispiele wie man die Daten ausgibt..jedoch nicht wie man die Daten in einer Schleife verarbeitet und wieder in eine Tabelle schreibt.

              Zum auslesen habe ich dieses Konstrukt verwendet:
              if ($result->num_rows > 0) {
              // output data of each row
              while($row = $result->fetch_assoc()) {
              echo "<br />"."id: " . $row["teilnehmerID"]. " - Name: " . $row["vorname"]. ", Vorname: " . $row["nachname"]. "<br>";

              //anstatt "echo"
              // 1 Random Teilnehmer aussuchen
              // Einen 2. Teilnehmer finden der != teilnehmer1.abteilung, teilnehmer1.generation (Altersstufen) jedoch == teilnehmer1.standort

              }
              } else {
              echo "0 results";
              //Schauen ob Teilnehmer übriggeblieben sind und unter einfacheren Bedingungen versuchen zu matchen
              }

              Also ich erwarte keine Komplettlösung...nur ob mir jemand zeigen könnte, wie man Daten ausliest, diese verarbeitet und dann wieder in die Datenbank schreibt. Und am Besten nach Best-Practice - so wie man das halt als Profi in PHP machen würde.


              PS: Sobald ich wieder Licht sehe und eine grobe Lösung für meine Hauptprobleme gefunden habe, werde ich das mit dem Cronjob nochmals in die Hand nehmen und überprüfen, ob das nicht die bessere Lösung ist. Versprochen =D

              Edit: Da ich die Tabelle Teilnehmer mit einer teilnehmerID not null und auto increment versehen habe, könnte ich der 1. Teilnehmer im SQL mit rand() herausfischen.
              Wie ich jetzt den 2. Teilnehmer unter den Bedingungen wie oben beschrieben dazu hole, ist mir unklar.
              Zuletzt geändert von projektphp; 23.08.2018, 10:11.

              Kommentar


              • #8
                Also ich habe vielleicht ein Lösungsansatz...

                $sql_all = "SELECT * FROM Teilnehmer";
                $result_all = $link->query($sql);

                if ($result->num_rows > 0) {
                //Hier wird der 1. Teilnehmer random aus der tab gelesen und als Array/Zeile gespeichert
                $sql_random = "SELECT * FROM Teilnehmer ORDER BY RAND() LIMIT 0,1";
                $result_random = $link->query($sql_random);
                $row_random = $result_random->fetch_assoc();

                while($row_all = $result_all->fetch_assoc()) {
                // Hier gehe ich ja den gesamten Datensatz durch.
                // also mache ich dann ein IF-ElseIF Konstrukt um den
                // passenden 2. Teilnehmer zu finden
                }
                } else {
                echo "0 results";
                }


                Was meint ihr dazu? Voll für die Tonne?

                Edit 18.09: Ich werde hier noch die Lösung posten sobald ich eine habe. Aber zuerst muss ich noch mit meinem Session-Problem fertig werden.
                Zuletzt geändert von projektphp; 18.09.2018, 13:11.

                Kommentar


                • #9
                  Meine jetziges Skript sieht so aus:

                  Code:
                  <?php
                  //DB Connection
                  $serverAdresse = "127.0.0.1";
                  $user = "root";
                  $passwort = "";
                  $dbName = "lunchroulette";
                  $link = mysqli_connect($serverAdresse, $user, $passwort, $dbName);
                  
                  
                  //Query für "row[]"
                  $sql_select_teilnehmer = "SELECT * FROM teilnehmer;"; //bereits abfragen ob matched
                  
                  //Query für row_random[] 
                  $sql_random = "SELECT * FROM teilnehmer ORDER BY RAND() ;";
                  $counter = 1;
                  if($result_random = mysqli_query($link, $sql_random) ){
                  	while($row_random = $result_random->fetch_assoc()){ // Looped über die ganze Random-Liste
                  		//printf("<br />"."Vorname: " . $row_random["vorname"]. ",</br> Name: " . $row_random["nachname"]. ",</br> Mail: " . $row_random["mail"]. ",</br> Geburtsdatum: " . $row_random["geburtsdatum"]. ",</br> Abteilung: " . $row_random["abteilung"]. ",</br> Sprache: " . $row_random["sprache"]. ",</br> Joker: " . $row_random["joker"]. ",</br> Eingeloggt: " . $row_random["loginstatus"]. "<br>"); 
                  		
                  		if($result = mysqli_query($link, $sql_select_teilnehmer)){ // Alle Teilnehmer werden ins Array geschrieben
                  			while($row = $result->fetch_assoc()) { //Jeder Eintrag wird einzeln durchlaufen
                  				
                  				//Ausgabe aller Spalten
                  				//printf("<br />"."Vorname: " . $row["vorname"]. ",</br> Name: " . $row["nachname"]. ",</br> Mail: " . $row["mail"]. ",</br> Geburtsdatum: " . $row["geburtsdatum"]. ",</br> Abteilung: " . $row["abteilung"]. ",</br> Sprache: " . $row["sprache"]. ",</br> Joker: " . $row["joker"]. ",</br> Eingeloggt: " . $row["loginstatus"]. "<br>"); 
                  				
                  				//Teilnehmer darf nicht bereits gemachted sein
                  				if($row_random['matched'] != 1 && $row['matched'] != 1){
                  					
                  					//Bedingung nicht gleicher Standort
                  					if($row_random["standort"] == $row["standort"]){
                  						//echo "</br>Standort ist gleich";
                  						
                  						//Bedingung nicht gleiche Abteilung
                  						if($row_random["abteilung"] != $row["abteilung"]){
                  							//echo "</br>Abteilung ist gleich";
                  						
                  							//Bedingung: nicht gleiches Alter
                  							if($row_random["geburtsdatum"] != $row["geburtsdatum"]){
                  								//echo "</br>Alter ist gleich";
                  								$id_random = $row_random["teilnehmerID"];
                  								$id_match = $row["teilnehmerID"];
                  								
                  								
                  								/* printf("</br>Matching Nr." . $counter . ".) " . $row_random['vorname'] . " wurde mit: " . $row['nachname'] . " gematched");
                  								$counter = $counter + 1;
                  								break 1; */
                  								
                  								//Wenn bis hier alle Bedingungen erfüllt wurden, dann bei beiden Teilnehmern "matched" auf "1" setzen
                  								if(mysqli_query($link, "UPDATE teilnehmer SET matched=1 WHERE teilnehmerID=$id_random and teilnehmerID=$id_match;")){
                  									printf("</br>Matching Nr." . $counter . ".) " . $row_random['vorname'] . " wurde mit: " . $row['vorname'] . " gematched" . "mit der ID: " . $row['teilnehmerID']);
                  									$counter = $counter + 1;
                  									break 1;
                  								} else {
                  									mysqli_query($link, "UPDATE teilnehmer SET matched=0 WHERE teilnehmerID=$id_random;");
                  									echo "</br>nid klappt";
                  								}
                  							}
                  						}
                  					}
                  				} else {
                  					//echo "</br>im Else Verschachtelung</br>";
                  				}
                  			}   
                  		} else {
                  			echo "im else vom matching";
                  		}
                  	}
                  } else {
                  	echo "Im Else 1. IF";
                  }
                  ?>
                  Jedoch habe ich das Problem, dass mit diesem Query: "UPDATE teilnehmer SET matched=1 WHERE teilnehmerID=$id_random and teilnehmerID=$id_match;"
                  das hier nicht funktioniert: "and teilnehmerID=$id_match"

                  Deshalb werden teilweise die gleichen Teilnehmer gematched und das will ich nicht.

                  Das Query sollte eigentlich korrekt sein und wenn 2 gematched wurden, sollten beide in der Spalte "matched" eine 1 drin stehen haben was mit dem IF geprüft wird.


                  Einer eine Idee was ich falsch mache?

                  Kommentar


                  • #10
                    Ich habe es versprochen dass ich hier die Lösung noch poste..

                    Code:
                    Class Teilnehmer {
                    	public $teilnehmerID;
                    	public $vorname;
                    	public $nachname;
                    	public $email;
                    	public $geburtstag;
                    	public $standort;
                    	public $abteilung;
                    	public $matched = 0;
                    	
                    }
                    Code:
                    Class Match {
                    	public $teilnehmer1;
                    	public $teilnehmer2;
                    	public $dateOfMatch;
                    }

                    Code:
                    /* Holt alle Teilnehmer per Funktion, doppelter Foreach-Loop durchläuft gleiches (teilnehmer) Array, 
                    	überpüft alle Bedingungen, wenn alle erfüllt wird bei den betroffenen Teilnehmer 'matched' auf 1 gesetzt
                    	und speichert die Match-Objekte in einem Array welches retourniert wird */
                    	public function matchTeilnehmer(){
                    		//Alle Teilnehmer aus Tabelle holen und in lokales Array speichern
                    		$arr_teilnehmer = $this->getAllTeilnehmer();
                    		
                    		//Array vorbereiten
                    		$arr_match = array();
                    		
                    		foreach($arr_teilnehmer as $t1){
                    			foreach($arr_teilnehmer as $t2){
                    				
                    				if( $t1->teilnehmerID != $t2->teilnehmerID && 
                    					$t1->standort == $t2->standort && 
                    					$t1->abteilung != $t2->abteilung &&
                    					$t2->matched != 1 &&
                    					$t1->matched != 1){
                    										
                    						$match = new Match();
                    						$match->teilnehmer1 = $t1;
                    						$match->teilnehmer2 = $t2;
                    						$match->dateOfMatch = date('YYYY-MM-DDThh:mm:ss');
                    						$t2->matched = 1;
                    						$t1->matched = 1; 
                    						
                    						$arr_match[] = $match;
                    						
                    						break;
                    						
                    				}
                    			}
                    		}
                    		
                    		return $arr_match;
                    	}

                    ***getAllTelnehmer holt einfach alle Daten aus der Tabelle und speichert diese als eintelne Teilnehmer-Objekte in ein Array.


                    Das ganze habe ich in einem MVC Framework gemacht.

                    Gruss

                    Kommentar

                    Lädt...
                    X