php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Lunch Roulette - Personen zufällig unter Bedingungen matchen


 
projektphp
14-08-2018, 11:48 
 
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 :beer:




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

 
bandit600
14-08-2018, 12:15 
 
Kann ich solche Matchings mit PHP/MySQL überhaupt durchführen?

Ja

Gibt es Jobs die PHP's ausführen?

Nein

Wie schedule ich das Ganze dann?


Mit einem Cronjob

Kennt ihr ähnliche Projekte oder Beiträge die hier im Forum schon besprochen wurden?

Nein

 
projektphp
14-08-2018, 12:31 
 
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

 
bandit600
14-08-2018, 13:41 
 
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

 
projektphp
17-08-2018, 15:08 
 
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

 
bandit600
20-08-2018, 09:18 
 
Ich habe jetzt eine Lösung gefunden
Die richtige Lösung nennt sich immer noch Cronjob. Schön, dass du das ignoriert hast

 
projektphp
23-08-2018, 10:57 
 
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.

 
projektphp
23-08-2018, 12:18 
 
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.

 
projektphp
19-09-2018, 12:37 
 
Meine jetziges Skript sieht so aus:

<?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?

 
projektphp
01-10-2018, 14:41 
 
Ich habe es versprochen dass ich hier die Lösung noch poste..

Class Teilnehmer {
public $teilnehmerID;
public $vorname;
public $nachname;
public $email;
public $geburtstag;
public $standort;
public $abteilung;
public $matched = 0;

}

Class Match {
public $teilnehmer1;
public $teilnehmer2;
public $dateOfMatch;
}


/* 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

- -

Alle Zeitangaben in WEZ +2. Es ist jetzt 12:43 Uhr.