SQL/PHP placera anställda på avdelningar

PHPportalen Forum Index » PHP
Lägg ett bokmärke på hela tråden
Skapa nytt inlägg   Svara på inlägget Gå till sida Föregående  1, 2, 3  Nästa
Visa föregående ämne :: Visa nästa ämne  
Startad av: Meddelande
harald_b
Moderator



Medlem i: 5000 dagar
Från: Tavesta
Status: Offline



#742640
Inlägg Skrivet: 2019-09-04 11:41      Ämne: Citera

Vad får du för felmeddelanden?
Bara "rad 60" säger mig inte så mycket, för där händer ju ingenting i din kod.


Loopen är för övrigt inte uppbyggd helt på det sättet jag föreslog. Jag hade föreslagit att $loopstatus = false; skulle vara helt i början av loopen. Nu har du det i en villkorssats i en nästlad loop, så det är inte helt enkelt att se exakt vad det ger för konsekvenser.

Problemet med att villkoret på rad 81 (Menar du det som visas som rad 82?) beror på flera orsaker. Dels är raden för närvarande bortkommenterad. Dels kan villkoret uppfyllas om returvärdet från checkSectionNotFull() skulle vara NULL, vilket jag påpekat tidigare.


Du har en lite osnygg lösning på rad 26 och 33.
Om du skall ha en tom array för varje nytt varv i loopen borde du ha $array = []; i början av loopen, istället för unset($array);
$array = []; på rad 26 är helt överflödig.
Så som koden ser ut nu inleds loopen med att du inte har någon $array över huvud taget, och då är det lite osnyggt att sedan lägga till data i en array som inte finns. Kanske är det detta som orsakar felmeddelandet på rad 60?
 

_________________
R.r - Ett fritt affärssystem
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Retyle



Medlem i: 5852 dagar

Status: Offline



#742641
Inlägg Skrivet: 2019-09-04 12:18      Ämne: Citera

$array innehåller data om vilka personer som är kompatibla med minst antal avdelningar, som scriptet börjar att placera.

Jag behöver hantera den när alla är utplacerade och den inte har något värde..
 

_________________
"There is no place like 127.0.0.1"
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
harald_b
Moderator



Medlem i: 5000 dagar
Från: Tavesta
Status: Offline



#742642
Inlägg Skrivet: 2019-09-04 12:49      Ämne: Citera

Ja, jag har förstått ungefär vad du använder $array till, men det ändrar inget av det jag påpekade.
PHP:
1:
 $array = []; //$array blir en tom array som du kan fylla med data
2:
unset($array); //$array tas bort helt och hållet, och kan inte användas. 
 

_________________
R.r - Ett fritt affärssystem
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Retyle



Medlem i: 5852 dagar

Status: Offline



#742643
Inlägg Skrivet: 2019-09-04 14:09      Ämne: Citera

Så jag borde lägga $array = []; innan rad 52? Så den är tom innan man loopar igenom tilldelningen?

Jag verkar inte få den att kunna läsa detta villkoret...

KOD:
1:
 
2:
if(checkSectionNotFull($mysqli, $query['section_id']) != NULL) {
3:
 
4:
     $connstring2 = "SELECT * FROM avdelningar WHERE id = {$query['section_id']}";
5:
     $data2=mysqli_fetch_assoc(mysqli_query($mysqli, $connstring2));
6:
 
7:
     //Om avdelningen inte erhållit max antal anställda (1=avdelning full eller 0=finns plats)
8:
     if($data2['max'] == 0) {
9:
      echo "Det fanns plats på avdelning".$query['section_id']." Uppdaterar DB!<br><br>";
10:
 
11:
       //Uppdatera databasen
12:
       writeToDatabase($mysqli, $query['section_id'], $employeeLowestSectionCount[$random]);
13:
     
14:
     }else {
15:
      echo "Fanns ej plats, uppdaterar ej DB!<br><br>";
16:
     }
17:
 
18:
}
19:
 


funktionen
KOD:
1:
 
2:
function checkSectionNotFull($mysqli, $section) {
3:
 
4:
//Hämta från avdelningar
5:
$test1 = mysqli_query($mysqli, "SELECT * FROM avdelningar");
6:
  while($rad = mysqli_fetch_array($test1)) {
7:
 
8:
   if($section == $rad['id']) {
9:
    echo "Avd id: ".$rad['id']." <br>Antal platser avdelning ".$rad['platser']." <br>";
10:
 
11:
    //Räkna hur många som är bokade till varje avdelning
12:
    $result = mysqli_query($mysqli,"SELECT *, COUNT(*) as antal FROM personer WHERE booked = {$rad['id']} GROUP BY booked LIMIT 1;");
13:
 
14:
     while($rad2 = mysqli_fetch_array($result)) {
15:
      if($rad['platser'] - $rad2['antal'] == '0') {
16:
            return NULL;
17:
      }
18:
     }
19:
   }
20:
  }
21:
}
22:
 
 

_________________
"There is no place like 127.0.0.1"
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Retyle



Medlem i: 5852 dagar

Status: Offline



#742644
Inlägg Skrivet: 2019-09-04 20:23      Ämne: Citera

Nu har jag lyckats få ihop allt, förutom EN ENKEL LITEN FUNKTION som strular istället.

Jag kan nu slumpa ut användare, och den verkar ta hänsyn till max_antal på avdelningarna också, så den "stora" biten tror jag är löst nu. Det som återstår är att

-Få loopen att stanna när alla (tabell) avdelningar har (kolumn) max = 1
-Se till att dom inte hamnar där dom var igår (tabell) personer (kolumn) lastsection.

Jag har aldrig använt SUM så jag antar att jag gör något fel i databasanropet gällande första problemet att få loopen att stanna när alla avdelningar är fyllda.

Jag vill med hjälp av min "SUM" summera alla rader i dom fält som heter 'platser' i tabellen 'avdelningar', för att kunna matcha antal placerade människor mot antal totala platser på alla avdelningar.

KOD:
1:
 
2:
<?php
3:
 
4:
include "conn.php";
5:
include "functions.php";
6:
 
7:
if(isset($_POST['reset'])) {
8:
$panic = "UPDATE personer SET booked=0";
9:
mysqli_query($mysqli, $panic);
10:
$panic2 = "UPDATE avdelningar SET max=0";
11:
mysqli_query($mysqli, $panic2);
12:
}elseif(isset($_POST['save'])) {
13:
//Kopiera föregående utfall till "lastsection" så detta kan användas till att förhindra att man hamnar på samma avdelning igen
14:
backupToLastSection($mysqli);
15:
}
16:
 
17:
?>
18:
<html>
19:
<form action="generate.php" method="post">
20:
<input type=submit name="reset" value="bokade=0">
21:
</form>
22:
</html>
23:
<?php
24:
 
25:
$sql = "UPDATE avdelningar SET max = 0}";
26:
     mysqli_query($mysqli, $sql);
27:
$array = [];
28:
 
29:
//Kör programmet tills alla avdelningar är fulla
30:
$loopstatus = true;
31:
 
32:
while($loopstatus)
33:
{
34:
$array = [];
35:
 
36:
//Kolla om alla avdelningar är tillsatta
37:
$test = "SELECT * FROM avdelningar";
38:
$test2 = (mysqli_query($mysqli, $test));
39:
  while($rowe = mysqli_fetch_array($test2))
40:
  {
41:
 
42:
   //Om alla avdelningar INTE är tillsatta
43:
   if($rowe['max'] == '0')
44:
   {
45:
   $loopstatus = true;
46:
   }
47:
     
48:
   //Grupperar antal unika person_id i crosstable
49:
   $result = mysqli_query($mysqli,"SELECT *, COUNT(*) as antal FROM crosstable GROUP BY person_id;");
50:
 
51:
    //Loopar antal unika person_id i crosstable, dvs hur många personer som har några tillgängliga avdelningar alls
52:
    //Skapa array
53:
    while($row = mysqli_fetch_array($result))
54:
    {
55:
 
56:
     //Hämta egenskaper från personen där aktuell 'crosstable' person_id grupp gäller
57:
     $result2 = "SELECT * FROM personer WHERE id = {$row['person_id']}";
58:
     $resultat = mysqli_fetch_assoc(mysqli_query($mysqli, $result2));
59:
 
60:
      if($resultat['booked'] == 0)
61:
     {
62:
       $array[$row['person_id']] = $row['antal'];
63:
      //echo "Person ID ".$row['person_id']." Antal ".$row['antal']."<br>";
64:
      }
65:
   }
66:
   
67:
   //Om inte alla är tilldelade en plats, dvs arrayen är tom
68:
    if(count($array) > 0)
69:
   {
70:
     //Räkna ut vilka personer som har lägst antal avdelningar i crosstable
71:
     $employeeLowestSectionCount = array_keys($array, min($array));
72:
     echo "employeeLowestSectionCount ";
73:
     print_r($employeeLowestSectionCount);
74:
     $adaptedcount = count($employeeLowestSectionCount);
75:
     echo "<br>adaptedcount ".$adaptedcount."<br>";
76:
 
77:
     if($adaptedcount != 0)
78:
    {
79:
      //Random anställd
80:
      $random = rand(0, ($adaptedcount - 1));
81:
      echo "Random >> ".$random."<br>";
82:
      //Random section id
83:
      $result3 = "SELECT section_id FROM crosstable WHERE person_id={$employeeLowestSectionCount[$random]} ORDER BY RAND() LIMIT 1";
84:
      $query = mysqli_fetch_assoc(mysqli_query($mysqli, $result3));
85:
 
86:
      if(checkSectionNotFull($mysqli, $query['section_id']) == false)
87:
     {
88:
 
89:
       $connstring2 = "SELECT * FROM avdelningar WHERE id = {$query['section_id']}";
90:
       $data2=mysqli_fetch_assoc(mysqli_query($mysqli, $connstring2));
91:
 
92:
        //Om avdelningen inte erhållit max antal anställda (1=avdelning full eller 0=finns plats)
93:
        if($data2['max'] == 0) {
94:
         echo "Det fanns plats på avdelning".$query['section_id']." Uppdaterar DB!<br><br>";
95:
 
96:
         //Uppdatera databasen
97:
         writeToDatabase($mysqli, $query['section_id'], $employeeLowestSectionCount[$random]);
98:
     
99:
        }else {
100:
         echo "Fanns ej plats, uppdaterar ej DB!<br><br>";
101:
        }
102:
 
103:
      }else {
104:
      $sql = "UPDATE avdelningar SET max = 1 WHERE id = {$query['section_id']}";
105:
      mysqli_query($mysqli, $sql);
106:
       echo checkAllAssigned($mysqli);
107:
     }
108:
 
109:
     }
110:
 
111:
    }else {
112:
     $loopstatus = false;
113:
     echo "Det verkar vara slut!";
114:
   }
115:
   
116:
 
117:
  }
118:
 
119:
}
120:
 
121:
?>
122:
 


funktion
KOD:
1:
 
2:
function checkAllAssigned($mysqli) {
3:
   $sql = "SELECT SUM (platser) as sum FROM avdelningar";
4:
    $query = mysqli_query($mysqli, $sql);
5:
   $abc=mysqli_fetch_assoc($query);
6:
   return $abc['sum'];
7:
}
8:
 


Felmeddelande:
Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in C:\wamp64\www\functions.php on line 7

Tack för all hjälp!
 

_________________
"There is no place like 127.0.0.1"
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
harald_b
Moderator



Medlem i: 5000 dagar
Från: Tavesta
Status: Offline



#742645
Inlägg Skrivet: 2019-09-04 22:45      Ämne: Citera

I ditt föregående inlägg har funktionen checkSectionNotFull ett galet returvärde. NULL är helt hopplöst omöjligt att skilja från när inget returvärde alls ges. Jag tycker nog du borde använda true och false som returvärden, eller något i den stilen, och ha ett angivet returvärde i en return som ligger absolut sist i funktionen. Då får man bättre koll på vilka som är de möjliga returvärdena från funktionen.

Retyle skrev:
Så jag borde lägga $array = []; innan rad 52? Så den är tom innan man loopar igenom tilldelningen?

Vid en första anblick ser det i alla fall ut att kunna vara rätt plats. Logiken i din kod är inte helt lätt att genomskåda, och du kunde nog var mer noga med att få till bra indrag i koden, så man lättare ser var loopar och if-block börjar och slutar.


Retyle skrev:
Jag har aldrig använt SUM så jag antar att jag gör något fel i databasanropet gällande första problemet att få loopen att stanna när alla avdelningar är fyllda.

Jag vill med hjälp av min "SUM" summera alla rader i dom fält som heter 'platser' i tabellen 'avdelningar', för att kunna matcha antal placerade människor mot antal totala platser på alla avdelningar.

Felmeddelande:
Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in C:\wamp64\www\functions.php on line 7


Både SUM och sum är nyckelord i SQL. Om du vill använda det som ett namn på ett fält i resultatet måste du sätta det mellan apostrofer:
KOD:
1:
SELECT någonting AS 'sum' ....
 

_________________
R.r - Ett fritt affärssystem
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Retyle



Medlem i: 5852 dagar

Status: Offline



#742646
Inlägg Skrivet: 2019-09-05 09:00      Ämne: Citera

Ja, jag glömde ta bort == false, jag testade att skriva ut returvärdet bara, därför det ser lite osammanhängande ut kanske!

Vad gäller return, kan jag returnera flera olika saker beroende på vad jag vill ha ut? Tex return NULL, return $var och return true från olika if-satser i en funktion? Vad skiljer om jag returnerar NULL från "hej"? Där jag tar emot return gör jag ju ändå bara en jämförelse, if(return = NULL eller "hej") tex. Har inte greppat return riktigt, även om jag läst en del på nätet nu på vägen med detta projektet.
 

_________________
"There is no place like 127.0.0.1"
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
harald_b
Moderator



Medlem i: 5000 dagar
Från: Tavesta
Status: Offline



#742647
Inlägg Skrivet: 2019-09-05 09:35      Ämne: Citera

Du kan använda vad du vill för returvärde i funktioner. Men just NULL är kanske inte det mest meningsfulla att använda. Om du bara anger return; utan något värde, eller inte har någon return alls, kommer returvärdet från funktionen räknas som NULL.

Om du har returvärden av olika typ kan du behöva testa returvärdet med trippla likhetstecken, i stil med if(minFunktion() === false). I annat fall finns det risk för att värden som inte är av samma typ först översätts till samma typ, och sedan jämförs, med ett lite svårförutsägbart resultat.
Om du bara har ett värde som räknas som sant (true, heltal skilt från noll, eller liknande) och ett som räknas som falskt (false, 0, NULL, tom sträng, sträng med '0', eller liknande) så räcker det med att du testar returvärdet som sådant i en if-sats, i stil med if(minFunktion()).

Om du inte har någon return-sats helt i slutet av funktionen som returnerar något annat än NULL bör du alltid ta höjd för att NULL är ett möjligt returvärde från funktionen.



En riktig luring man kan råka ut för är att if('text' == 0) innebär att if-satsen faktiskt kommer utföras, eftersom strängen först typkastas till heltal, vilket blir 0, och sedan jämförs med noll.
 

_________________
R.r - Ett fritt affärssystem
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Retyle



Medlem i: 5852 dagar

Status: Offline



#742649
Inlägg Skrivet: 2019-09-05 19:18      Ämne: Citera

Jag har kommit en bra bit på vägen nu, och jag har försökt enligt dina önskemål att få lite bättre ordning på min kod. Jag har inte döpt om några variabler än, men det kanske jag gör sen beroende på hur mycket jag kommer att arbeta med den.

Problemet nu är att den inte stannar programmet, eller rättare sagt att när den bara har ett par kombinationer kvar som inte går att lösa och programmet behöver köras från början så händer ingenting. Däremot verkar det som att placeringen blir bra nån gång ibland när jag refreshar sidan eller kanske i kombination trycker på Reset-knappen (funktion rad 7).

Har det något att göra med att den inte återställer variabler/kör koden på gammal data när jag uppdaterar med window.location.replace('generate.php'); ? (rad 138)

Och förresten, nu har jag gjort en extremt ful lösning som inte följer antalet personer / avdelningar i databasen, utan jag har bara uppskattat ungefär hur många gånger koden kan behöva köras baserat på mina antal och satt en limit efter det tills den ska börja om på nytt. Har du en idé till detta får du gärna bidra! (rad 136)

KOD:
1:
 
2:
<?php
3:
 
4:
include "conn.php";
5:
include "functions.php";
6:
 
7:
if(isset($_POST['reset'])) {
8:
   
9:
   $panic = "UPDATE personer SET booked=0";
10:
   mysqli_query($mysqli, $panic);
11:
   $panic2 = "UPDATE avdelningar SET max=0";
12:
   mysqli_query($mysqli, $panic2);
13:
   
14:
}elseif(isset($_POST['save'])) {
15:
   
16:
   //Kopiera föregående utfall till "lastsection" så detta kan användas till att förhindra att man hamnar på samma avdelning igen
17:
   backupToLastSection($mysqli);
18:
}
19:
 
20:
?>
21:
<html>
22:
<form action="generate.php" method="post">
23:
<input type=submit name="reset" value="Reset">
24:
</form>
25:
</html>
26:
<?php
27:
 
28:
 
29:
$sql = "UPDATE avdelningar SET max = 0}";
30:
     mysqli_query($mysqli, $sql);
31:
 
32:
$array = [];
33:
 
34:
//Kör programmet tills alla avdelningar är fulla
35:
$loopstatus = true;
36:
$v = 0;
37:
 
38:
while($loopstatus)
39:
{
40:
   
41:
   $array = [];
42:
   $v = $v + 1;
43:
 
44:
   //Kolla om alla avdelningar är tillsatta
45:
   $test = "SELECT * FROM avdelningar";
46:
   $test2 = (mysqli_query($mysqli, $test));
47:
      while($rowe = mysqli_fetch_array($test2))
48:
      {
49:
 
50:
         //Om alla avdelningar INTE är tillsatta
51:
         if($rowe['max'] == '0')
52:
         {
53:
         $loopstatus = true;
54:
         }
55:
     
56:
         //Grupperar antal unika person_id i crosstable
57:
         $result = mysqli_query($mysqli,"SELECT *, COUNT(*) as antal FROM crosstable GROUP BY person_id;");
58:
 
59:
         //Loopar antal unika person_id i crosstable, dvs hur många personer som har några tillgängliga avdelningar alls
60:
         //Skapa array
61:
         while($row = mysqli_fetch_array($result))
62:
         {
63:
 
64:
            //Hämta egenskaper från personen där aktuell 'crosstable' person_id grupp gäller
65:
            $result2 = "SELECT * FROM personer WHERE id = {$row['person_id']}";
66:
            $resultat = mysqli_fetch_assoc(mysqli_query($mysqli, $result2));
67:
 
68:
            if($resultat['booked'] == 0)
69:
            {
70:
               $array[$row['person_id']] = $row['antal'];
71:
               //echo "Person ID ".$row['person_id']." Antal ".$row['antal']."<br>";
72:
            }
73:
         }
74:
   
75:
         //Om inte alla är tilldelade en plats, dvs arrayen inte är tom
76:
         if(count($array) > 0)
77:
         {
78:
            //Räkna ut vilka personer som har lägst antal avdelningar i crosstable
79:
            $employeeLowestSectionCount = array_keys($array, min($array));
80:
            echo "employeeLowestSectionCount ";
81:
            print_r($employeeLowestSectionCount);
82:
            $adaptedcount = count($employeeLowestSectionCount);
83:
            echo "<br>adaptedcount ".$adaptedcount."<br>";
84:
 
85:
            //Variabel som håller antal personer med lägst antal kompatibla avdelningar
86:
            if($adaptedcount != 0)
87:
            {
88:
            //Random anställd
89:
            $random = rand(0, ($adaptedcount - 1));
90:
            echo "Random >> ".$random."<br>";
91:
            //Random section id
92:
            $result3 = "SELECT section_id FROM crosstable WHERE person_id={$employeeLowestSectionCount[$random]} ORDER BY RAND() LIMIT 1";
93:
            $query = mysqli_fetch_assoc(mysqli_query($mysqli, $result3));
94:
 
95:
               if(checkSectionNotFull($mysqli, $query['section_id']) == false)
96:
               {
97:
                  $connstring2 = "SELECT * FROM avdelningar WHERE id = {$query['section_id']}";
98:
                  $data2=mysqli_fetch_assoc(mysqli_query($mysqli, $connstring2));
99:
 
100:
                  //Om avdelningen inte erhållit max antal anställda (1=avdelning full eller 0=finns plats)
101:
                  if($data2['max'] == 0) {
102:
 
103:
                     echo "Det fanns plats på avdelning".$query['section_id']." Uppdaterar DB!<br><br>";
104:
 
105:
                     //Uppdatera databasen
106:
                     writeToDatabase($mysqli, $query['section_id'], $employeeLowestSectionCount[$random]);
107:
     
108:
                  }else
109:
                  {
110:
                     echo "Fanns ej plats, uppdaterar ej DB!<br><br>";
111:
                  }
112:
 
113:
               }else
114:
               {
115:
                  //Uppdaterar avdelningen till status "fullsatt"
116:
                  $sql = "UPDATE avdelningar SET max = 1 WHERE id = {$query['section_id']}";
117:
                  mysqli_query($mysqli, $sql);
118:
 
119:
                  //Kollar om programmet är "nöjd", dvs om man är nöjd med placeringarna
120:
                  if(checkAllAssigned($mysqli) == 1)
121:
                  {
122:
                     $loopstatus = false;
123:
                     echo "Uppfyllda!!";
124:
                  }
125:
               }              
126:
            }
127:
            
128:
         }else
129:
         {
130:
            $loopstatus = false;
131:
            echo "Det verkar vara slut!";
132:
         }
133:
      }
134:
      
135:
   //Måste finnas en slags "LIMIT" som begränsar programmet om man inte kan uppnå en optimal kombination   
136:
   if($v > 70) {
137:
 
138:
      echo "<script>window.location.replace('generate.php');</script>";
139:
      echo "Antal gånger programmet har körts: ".$v;
140:
   }
141:
 
142:
}
143:
?>
144:
 


functions.php
KOD:
1:
 
2:
function checkAllAssigned($mysqli) {
3:
 
4:
   //Räkna antalet totala platser på alla avdelningar
5:
   $sql = "SELECT SUM(platser) as 'antal' FROM avdelningar";
6:
   $query = mysqli_query($mysqli, $sql);
7:
   $antalPlatser = mysqli_fetch_array($query);
8:
   
9:
   //Räkna antal bokade personer
10:
   $sql = "SELECT COUNT(*) as antal FROM personer WHERE booked != 0";
11:
   $query = mysqli_query($mysqli, $sql);
12:
   $antalBokade = mysqli_fetch_assoc($query);
13:
         
14:
   //Räkna antalet tillgängliga personer
15:
   $sql = "SELECT COUNT(*) as antal FROM personer WHERE booked = 0 AND away = 0";
16:
   $query = mysqli_query($mysqli, $sql);
17:
   $antalAvail = mysqli_fetch_assoc($query);
18:
   
19:
   //Om antalet bokade personer är lika med totala antalet platser
20:
   if($antalBokade['antal'] == $antalPlatser['antal']){
21:
      return 1;
22:
   //Om antalet tillgängliga personer är mindre än totala antalet platser OCH antal bokade är lika med antalet tillgängliga
23:
   }elseif($antalAvail['antal'] < $antalPlatser['antal'] && $antalBokade['antal'] == $antalAvail['antal']) {
24:
      return 1;
25:
   //Om antalet tillgängliga personer är fler än totala antalet platser
26:
   }elseif($antalAvail['antal'] > $antalPlatser['antal'] && $antalBokade['antal'] == $antalPlatser['antal']) {
27:
      return 1;
28:
   }else {
29:
      return 0;
30:
   }
31:
   
32:
}
33:
 
 

_________________
"There is no place like 127.0.0.1"
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
harald_b
Moderator



Medlem i: 5000 dagar
Från: Tavesta
Status: Offline



#742650
Inlägg Skrivet: 2019-09-06 12:25      Ämne: Citera

Loopen med $loopstatus är inte gjord på det sättet jag menade.
$loopstatus = false; skall vara på rad 40, och ingen annan stans.
 

_________________
R.r - Ett fritt affärssystem
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Retyle



Medlem i: 5852 dagar

Status: Offline



#742651
Inlägg Skrivet: 2019-09-06 13:35      Ämne: Citera

Problemet är inte direkt att loopen inte stannar, utan att den verkar inte ladda in ny information i variablerna när jag bryter loopen och laddar om sidan efter x antal gånger. När placeringarna går som dom ska så stannar även loopen som den ska.
 

_________________
"There is no place like 127.0.0.1"
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
harald_b
Moderator



Medlem i: 5000 dagar
Från: Tavesta
Status: Offline



#742652
Inlägg Skrivet: 2019-09-06 21:49      Ämne: Citera

Jag tycker mig åtminstone se fyra möjliga orsaker till att koden buggar:

Jag begriper inte det där med window.location.replace('generate.php');
Om loopen gått för många varv borde du väl stoppa loopen?
Din kod gör ju det rakt motsatta!

$array = []; borde väl köras precis innan loopen som fyller $array med data, som du själv föreslog tidigare?
I annat fall är det väl risk att den kan innehålla gammalt data?

Jag kan inte genomskåda om det finns en chans att loopen med $loopstatus fungerar som den skall, när du sätter $loopstatus = false; på den platsen i koden där du gör det.

Fungerar if(checkSectionNotFull($mysqli, $query['section_id']) == false) som den skall?
Senaste versionen av den funktionen jag sett gav galna returvärden.
 

_________________
R.r - Ett fritt affärssystem
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Retyle



Medlem i: 5852 dagar

Status: Offline



#742653
Inlägg Skrivet: 2019-09-09 20:15      Ämne: Citera

Så, jag har försökt klura lite till vad som är felet och eventuellt rättat till lite av det du nämnde. Jag testade att se till så att min checkAllAssigned-loop returnerade "true" i vilket fall, och bekräftade det med en utskrift.

Men den loopar inte koden ändå, "huvudloopen" körs bara en gång, så jag förstår inte riktigt vad det är som spökar.

Rad 145 säger att $v har körts 1 gång!

Edit: Nu hittade jag felet, jag gör ingen jämförelse i sista "if" satsen, jag ger $loopstatus värdet =false. Nu loopar den och verkar tillsätta platser varje gång. Det enda jag behöver implementera nu är ett sätt att hantera om den "tar stopp", dvs att den fastnar på en kombination som inte går att lösa och behöver "ladda om" sidan/loopen. Hur gör jag det smidigast möjligtvis?

Och så behöver jag även en funktion som innebär att den tar hänsyn till vart man har varit dagen innan, tabell personer, column last_section. Tack för hjälpen återigen!

KOD:
1:
 
2:
<?php
3:
 
4:
include "conn.php";
5:
include "functions.php";
6:
 
7:
if(isset($_POST['reset'])) {
8:
   
9:
   $panic = "UPDATE personer SET booked=0";
10:
   mysqli_query($mysqli, $panic);
11:
   $panic2 = "UPDATE avdelningar SET max=0";
12:
   mysqli_query($mysqli, $panic2);
13:
   
14:
}elseif(isset($_POST['save'])) {
15:
   
16:
   //Backup "generate" to table 'avdelningar' (=sections in swedish) "lastsection" to prevent employee to end up at the same section as yesterday
17:
   backupToLastSection($mysqli);
18:
}
19:
 
20:
?>
21:
<html>
22:
<form action="generate.php" method="post">
23:
<input type=submit name="reset" value="Reset">
24:
</form>
25:
</html>
26:
<?php
27:
 
28:
 
29:
$sql = "UPDATE avdelningar SET max = 0}";
30:
     mysqli_query($mysqli, $sql);
31:
 
32:
 
33:
 
34:
//Main loop, loop until all sections are filled with employees
35:
$loopstatus = true;
36:
 
37:
//Counter, how many times it should take to complete the task, i need to find another solution
38:
$v = 0;
39:
 
40:
while($loopstatus)
41:
{
42:
   //Check if the code/program is "satisfied" with all employee assignments
43:
   if(checkAllAssigned($mysqli) == 1)
44:
   {
45:
      $loopstatus = false;
46:
      echo "checkAllAssigned = 1, bryt loopen!";
47:
   }
48:
   
49:
   $v = $v + 1;
50:
 
51:
   //Check if all sections are filled with employees
52:
   $test = "SELECT * FROM avdelningar";
53:
   $test2 = (mysqli_query($mysqli, $test));
54:
 
55:
      while($rowe = mysqli_fetch_array($test2))
56:
      {
57:
 
58:
         //If all sections are NOT filled with employees
59:
         if($rowe['max'] == '0')
60:
         {
61:
            echo "Om alla avdelningar INTE är tillsatta<br>";
62:
         $loopstatus = true;
63:
         }
64:
     
65:
         //Group number of unique person_id in crosstable
66:
         $result = mysqli_query($mysqli,"SELECT *, COUNT(*) as antal FROM crosstable GROUP BY person_id;");
67:
 
68:
         $array = [];
69:
 
70:
         //Loop number of unique person_id in crosstable, number of people that are available for any sections
71:
         //Create array containing employee id[number of available sections]
72:
         while($row = mysqli_fetch_array($result))
73:
         {
74:
 
75:
            //Get number from 'crosstable' count by 'sum person_id as group'
76:
            $result2 = "SELECT * FROM personer WHERE id = {$row['person_id']}";
77:
            $resultat = mysqli_fetch_assoc(mysqli_query($mysqli, $result2));
78:
 
79:
            if($resultat['booked'] == 0 && $resultat['away'] == 0)
80:
            {
81:
               $array[$row['person_id']] = $row['antal'];
82:
               echo "Om resultat bokad = 0 och away = 0: Person ID ".$row['person_id']." och Antal ".$row['antal']."<br>";
83:
            }
84:
         }
85:
   
86:
         //If not all employees are assigned a section, in other words if the array is NOT empty
87:
         if(count($array) > 0)
88:
         {
89:
            //Count people with lowest number of sections in crosstable
90:
            $employeeLowestSectionCount = array_keys($array, min($array));
91:
            echo "employeeLowestSectionCount ";
92:
            print_r($employeeLowestSectionCount);
93:
            $adaptedcount = count($employeeLowestSectionCount);
94:
            echo "<br>adaptedcount: ".$adaptedcount."<br>";
95:
 
96:
            //Variabel that contains number of people with lowest number of compatible sections
97:
            if($adaptedcount != 0)
98:
            {
99:
               //Random employee
100:
               $random = rand(0, ($adaptedcount - 1));
101:
               echo "Random: ".$random."<br>";
102:
               //Random section id
103:
               $result3 = "SELECT section_id FROM crosstable WHERE person_id={$employeeLowestSectionCount[$random]} ORDER BY RAND() LIMIT 1";
104:
               $query = mysqli_fetch_assoc(mysqli_query($mysqli, $result3));
105:
 
106:
               if(checkSectionNotFull($mysqli, $query['section_id']) == false)
107:
               {
108:
                  $connstring2 = "SELECT * FROM avdelningar WHERE id = {$query['section_id']}";
109:
                  $data2=mysqli_fetch_assoc(mysqli_query($mysqli, $connstring2));
110:
 
111:
                  //If section has NOT been assigned max number of employees(1=section full or 0=not full)
112:
                  if($data2['max'] == 0) {
113:
 
114:
                     echo "Det fanns plats på avdelning".$query['section_id']." för ".$employeeLowestSectionCount[$random].", Uppdaterar DB!<br><br>";
115:
 
116:
                     //Update database
117:
                     writeToDatabase($mysqli, $query['section_id'], $employeeLowestSectionCount[$random]);
118:
     
119:
                  }else
120:
                  {
121:
                     echo "Fanns ej plats, uppdaterar ej DB!<br><br>";
122:
                  }
123:
 
124:
               }else
125:
               {
126:
                  //Update section to status "full"
127:
                  $sql = "UPDATE avdelningar SET max = 1 WHERE id = {$query['section_id']}";
128:
                  mysqli_query($mysqli, $sql);
129:
                  echo "Uppdatera avdelningar set max 1 där id = ".$query['section_id']."<br>";
130:
               }              
131:
            }
132:
            
133:
         }
134:
      }
135:
      
136:
 
137:
  if($loopstatus = false)
138:
  {
139:
     ?>
140:
    <script>
141:
window.location.replace("index.php");
142:
</script>
143:
     <?php
144:
  }
145:
  echo "V har körts: ".$v." gång!<br>";
146:
}
147:
?>
148:
 
 

_________________
"There is no place like 127.0.0.1"
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
harald_b
Moderator



Medlem i: 5000 dagar
Från: Tavesta
Status: Offline



#742654
Inlägg Skrivet: 2019-09-09 21:31      Ämne: Citera

Du använder fortfarande inte $loopstatus på det sätt jag föreslog.
Om du bara vill bryta loopen i något sammanhang kan du använda break; istället. Det är en både enklare och tydligare lösning.

Poängen med en $loopstatus-variabel är att du kan använda ett flertal olika metoder att komma vidare med att lösa problemet, och så länge någon av dessa ger resultat så fortsätter loopen. i annat fall bryts den. Därför skall du ha $loopstatus = false; allra först i loopen, och helt utan villkor. och sättas till true i de fall man kommit vidare med att lösa problemet. Om det här nu är rätt looptyp i ditt fall.

Retyle skrev:
Det enda jag behöver implementera nu är ett sätt att hantera om den "tar stopp", dvs att den fastnar på en kombination som inte går att lösa och behöver "ladda om" sidan/loopen. Hur gör jag det smidigast möjligtvis?


Beror detta problem, att det "tar stopp", på att du slumpat fel person på rad 100?
I så fall kan du göra på ett annat sätt där.
Istället för att slumpa en ur arrayen så blandar du arrayen med shuffle(), och loopar sedan igenom arrayen med foreach. Lyckas du inte lösa problemet med det första elementet i arrayen så fortsätter du helt enkelt med nästa. Så fort du lyckas så bryter du loopen med break;
 

_________________
R.r - Ett fritt affärssystem
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Retyle



Medlem i: 5852 dagar

Status: Offline



#742655
Inlägg Skrivet: 2019-09-11 08:52      Ämne: Citera

harald_b skrev:
Du använder fortfarande inte $loopstatus på det sätt jag föreslog.
Om du bara vill bryta loopen i något sammanhang kan du använda break; istället. Det är en både enklare och tydligare lösning.

Poängen med en $loopstatus-variabel är att du kan använda ett flertal olika metoder att komma vidare med att lösa problemet, och så länge någon av dessa ger resultat så fortsätter loopen. i annat fall bryts den. Därför skall du ha $loopstatus = false; allra först i loopen, och helt utan villkor. och sättas till true i de fall man kommit vidare med att lösa problemet. Om det här nu är rätt looptyp i ditt fall.

Retyle skrev:
Det enda jag behöver implementera nu är ett sätt att hantera om den "tar stopp", dvs att den fastnar på en kombination som inte går att lösa och behöver "ladda om" sidan/loopen. Hur gör jag det smidigast möjligtvis?


Beror detta problem, att det "tar stopp", på att du slumpat fel person på rad 100?
I så fall kan du göra på ett annat sätt där.
Istället för att slumpa en ur arrayen så blandar du arrayen med shuffle(), och loopar sedan igenom arrayen med foreach. Lyckas du inte lösa problemet med det första elementet i arrayen så fortsätter du helt enkelt med nästa. Så fort du lyckas så bryter du loopen med break;


Nej, anledningen till att det tar stopp är för att sista personen/personerna inte är kompatibel mot någon avdelning, tidigare placeringar måste tas bort och börja om igen från början, för att slutligen "hoppas" att allt gått ihop, annars gör samm sak igen, och igen.. Därför jag satte JavaScript som redirect, när sidan laddas om simuleras även en "omstart av loopen".
 

_________________
"There is no place like 127.0.0.1"
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Visa tidigare inlägg:   
Skapa nytt inlägg   Svara på inlägget Gå till sida Föregående  1, 2, 3  Nästa
PHPportalen Forum Index » PHP
Hoppa till:  
Du kan inte skapa nya inlägg i det här forumet
Du kan inte svara på inlägg i det här forumet
Du kan inte ändra dina inlägg i det här forumet
Du kan inte ta bort dina inlägg i det här forumet
Du kan inte rösta i det här forumet
Du kan inte bifoga filer i detta forum
Du kan inte ladda ner filer från detta forum
Kontakta oss på adressen: info@phpportalen.net
Webbplatsen bygger i grunden på phpBB © 2001, 2002 phpBB Group

Modifieringar har senare gjorts i systemet av PHPportalen
Sid och logotypdesign skapad av Daren Jularic