PHP och Mysqli-problem med att föra in inputs i databasen

Permalänk
Medlem

PHP och Mysqli-problem med att föra in inputs i databasen

Hej! Jag har ett litet knepigt problem här som jag skulle behöva lite hjälp med.

Jag är fullt medveten om att hemsidan ser ut som en tunna skit. Jag använder enbart detta som en plattform för att testa funktioner, för att slippa sitta och göra det på den faktiska sidan.

Jag håller på att ta fram en hemsida där jag en användare ska kunna gå in och göra/ta ett Quiz genom att svara på ett antal frågor. I mitt fall är det 100 frågor med 4 alternativ var, men för att hålla felsökande och kod enkelt så håller jag det till 5 frågor här.

I alla fall. Det börjar med att användaren får svara på ett antal frågor, det kan se ut som följande:

Vad jag sedan gör är att jag viktar detta för att kunna ge användaren hjälp med något. Detta görs på följande sätt:

So far so good. Allt detta fungerar precis som det. Vad jag gör efter detta är att jag skriver ut mina värden på hemsidan, (bara för att se att allt fungerar), och mina värden skrivs ut precis som de ska.

Och detta ser ut som följande på min hemsida:

Som ni ser så skriv mina värden ut. Nu kommer vi till kruxet. Jag vill föra in dessa värden i den databasen jag har.

För att göra detta har jag gjort en knapp. När man klickar på denna knappen startar en IF-sats som för in värden i databasen. Det är knappen ni ser på min bild som så fint är döpt till submit. Detta ser ut som följande i min kod:

Och själva knappen:

Problemet är att när jag klickar på denna knappen, då sätts mina $totalA, $totalB, $totalC och $totalD till 0, (det startvärdet som jag deklarerar dem), och skickar in det i databasen. Då ser det ut som följande:

Och detta stoppas in i min databas:

En jäkla massa nollor helt enkelt. Jag vet inte riktigt varför den gör såhär. Jag tror det har med FORM att göra i PHP och hur den fungerar när den hämtar variabler - men jag är helt ny på PHP så kan vara ute och cykla.

Jag ber om ursäkt för att allt ser ut som skit när det kommer till kod. Jag har suttit hela dagen och testat saker fram och tillbaka.

Här kommer all kod i sin helhet:

<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>asd asd asd testsida och ingenting annat.</title> <link rel="stylesheet" type="text/css" href="css/style.css" /> </head> <body> <div id="page-wrap"> <h1 class="transparent index-headline" >Jonte verkar lite arg idag</h1> <?php // Before using $_POST['value'] //if (isset($_POST['value'])) //{ // Instructions if $_POST['value'] exist //} $answer1 = $_POST['question-1-answers']; $answer2 = $_POST['question-2-answers']; $answer3 = $_POST['question-3-answers']; $answer4 = $_POST['question-4-answers']; $answer5 = $_POST['question-5-answers']; $totalA = "0"; //Hur bra du är på att attrahera kvinnor. $totalB = "0"; $totalC = "0"; //Hur bra du är på att attrahera unga. $totalD = "0"; //Hur bra du är på att attrahera unga killar. //Här kan vi egentligen att vika frågorna lite som man vill. //På fråga 1 kan ni exempel på när jag vara ger "totalA" värdet av sig självt //och sedan lägger jag bara på vikten "2" //På fråga 2 lägger jag till 5 på vår totalA vilket resulterar i att den nu blir //7, men jag väljer också att lägga till lite på kategorin B, för det passar. if ($answer1 == "A") { $totalA = $totalA + 2; $totalC = $totalC -1;} if ($answer1 == "B") { $totalA = $totalA + 1; $totalD = $totalD + 1;} if ($answer1 == "C") { $totalD = $totalD + 2; } if ($answer1 == "D") { $totalA = $totalA + 1; $totalD = $totalD + 1; $totalD = $totalD + 1;} if ($answer2 == "A") { $totalA = $totalA + 5; } if ($answer2 == "B") { $totalB = $totalB + 1.15; } if ($answer2 == "C") { $totalC = $totalC + 1.13; } if ($answer2 == "D") { $totalD = $totalD + 1.16; } if ($answer3 == "A") { $totalA = $totalA + 5; } if ($answer3 == "B") { $totalB = $totalB + 1.15; $totalC = $totalC + 0.1; } if ($answer3 == "C") { $totalC = $totalC + 1.13; $totalB = $totalB + .07; } if ($answer3 == "D") { $totalD = $totalD + 1.16; } if ($answer4 == "A") { $totalA = $totalA + 5; } if ($answer4 == "B") { $totalB = $totalB + 1.15; } if ($answer4 == "C") { $totalC = $totalC + 1.13; $totalA = $totalA + .05; $totalB = $totalB + .06; $totalD = $totalD + .07; } if ($answer4 == "D") { $totalD = $totalD + 1.16; $totalB = $totalB + .04; $totalA = $totalA + .045; $totalC = $totalC + .034; } if ($answer5 == "A") { $totalA = $totalA + 5; } if ($answer5 == "B") { $totalB = $totalB + 1.15; } if ($answer5 == "C") { $totalC = $totalC + 1.14; $totalA = $totalA + .06; $totalD = $totalD + .08; } if ($answer5 == "D") { $totalD = $totalD + 1.16; $totalC = $totalC + .04; } ?> <div class="Dra_åt_helvete_vilken_DIV_det_kommer_ligga_här"> <?php if ($totalA > 5) { echo '<div class="xxx"></div><div class="xxx"><p class="you-chose">You Scored:</p><div class="xx"><p class="score">Om A är större än 1 ska detta skrivas ut.</p><p class="score-details"> Helvete vad gråhårig</p><a id="replay" class="take-quiz-btn" href="/test.php">Ta quizet igen?</a></div>'; } elseif ($totalB > $totalA && $totalB > $totalC && $totalB > $totalD) { echo '<div class="xxxDiv"></div><div class="xxxDiv"><p class="xxxDiv">You Scored:</p><div class="xxxDiv"><p class="score">Du har fått följande viktning:</p><p>Beroende på vad du klickat på får du olika altnerativ.</p><a id="replay" class="take-quiz-btn" href="/test.php">Play Again?</a></div>'; } elseif ($totalC > $totalA && $totalC > $totalB && $totalC > $totalD) { echo '<div class="results test-results2"><p class="score">Du har fått följande viktning:</p><p class="score-details">Hehe, hehe.... he.<p></p><a id="replay" class="take-quiz-btn" href="/test.php">Play Again</a></div>'; } elseif ($totalD > $totalA && $totalD > $totalB && $totalD > $totalC) { echo '<div class="Här_kan_Man_Diva"><p class="score">Du har fått följande viktning:</p><p class="score-details"><a id="replay" class="take-quiz-btn" href="test.php">Play Again</a></div>'; } ?> <p> Här kommer summan av alla svaren A: <?php echo $totalA; ?> <p> Här kommer summan av alla svaren B: <?php echo $totalB; ?> <p> Här kommer summan av alla svaren C: <?php echo $totalC; ?> <p> Här kommer summan av alla svaren D: <?php echo $totalD; ?> <p> Denna summan ska vara samma som "Här kommer summa av alla svaren A:" </p> <?php //require 'dbh.inc.php'; //session_start(); //$servername = "localhost"; //$dBUsername = "root"; //$dBPassword = ""; //$dBName = "loginsystem"; //$conn = mysqli_connect($servername, $dBUsername, $dBPassword, $dBName); //if (!$conn) { //die("Connection failed: ".mysqli_connect_error()); //else{ //} //} //$sql = "INSERT INTO questions (questionA, questionB, questionC, questionD) //VALUES ('$totalA', '$totalB', '$totalC', '$totalD')"; // use exec() because no results are returned // $conn->exec($sql); // echo "Hoppas fan att detta fungerar."; session_start(); $servername = "localhost"; $dBUsername = "root"; $dBPassword = ""; $dBName = "loginsystem"; $conn = mysqli_connect($servername, $dBUsername, $dBPassword, $dBName); if($conn){ echo "Dra åt helvete va igång databasjäveln är just nu. Ser ni inte detta så är det garanterat back-end som gjort något fel."; } if(isset($_POST['Submit'])){ echo"hej"; echo"$totalA"; $sql = "INSERT INTO questions(questionA, questionB, questionC, questionD) VALUES ($totalA, $totalB, $totalC, $totalD)"; if(mysqli_query($conn, $sql)){ echo "Dra åt pipsvängen, skit börjar fugnera."; } else { echo "Nu får backend ta mig fan se till att databasjäveln fungerar". mysqli_error($sql); } } ?> <form method ="post" > <input type= "submit" name= "Submit" value="Submit"> </form> </div> </div>

Som alltid är jag riktigt tacksam för all typ av hjälp jag kan få.

Med vänlig hälsning,
Pontus Andersson.

Visa signatur

Gaming: RTX 2070 & 3770k
Studier: MacBook pro retina 13
Ljud: QH-1339 & ett par rackans smidiga AirPods
Telefon: iPhone 6s plus
Skärm: ASUS 27" ROG Swift PG279Q med sån där g-sync

Permalänk
Medlem

Du får undefined index när du försöker plocka ut svaren ur din _POST-variabel.
Detta gör att svaren blir undefined/null och kommer aldrig kunna vara "A", "B", "C", eller "D". Dina total-variabler är därmed alltid 0 eftersom du aldrig tilldelar dessa något annat.

Släng in dina inputs i <form>-taggarna så du faktiskt postar dina inputs 😁

Skrivet på mobilen så kan eventuellt ha missat något.

Se https://www.w3schools.com/php/php_forms.asp för mer info

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB

Permalänk
Medlem

@Pamudas: När du menar mina inputs, menar du där jag väger/ger mina variabler värden? Alltså det jag kallar "viktningen" på en av bilderna?

Visa signatur

Gaming: RTX 2070 & 3770k
Studier: MacBook pro retina 13
Ljud: QH-1339 & ett par rackans smidiga AirPods
Telefon: iPhone 6s plus
Skärm: ASUS 27" ROG Swift PG279Q med sån där g-sync

Permalänk
Medlem

Det här är mer ett HTML problem än PHP, men inputs från första sidan följer inte automatiskt över till nästa sida. Du har gjort en ny <form> och när du trycker på din submit-knapp så skickas ingenting tillbaka till servern eftersom du har inga <input>'s i din <form>.

Du måste lägga till hidden inputs, exempel:

<form method="post"> <input type="hidden" name="question-1-answers" value="<?=$answer1;?>"> <input type="hidden" name="question-2-answers" value="<?=$answer2;?>"> <input type="hidden" name="question-3-answers" value="<?=$answer3;?>"> <input type="hidden" name="question-4-answers" value="<?=$answer4;?>"> <input type="hidden" name="question-5-answers" value="<?=$answer5;?>"> <input type= "submit" name="Submit" value="Submit"> </form>

Permalänk
Medlem

Jag hade undvikit att skicka tillbaks resultaten för att sedan skicka in och lägga in i databasen eftersom det ger chansen att redigera poängen för svaren innan dem skickas tillbaks av användaren. Speciellt eftersom du inte använder prepared statements vilket öppnar upp dig för sql injection.

Istället när du summerar upp svaren så lagra dem i en array och spara den till $_SESSION variabeln och sedan när användaren klickar på submit så plockar du bara fram poängen ur $_SESSION och lägger in i databasen.

Permalänk
Medlem
Skrivet av Nogh:

Det här är mer ett HTML problem än PHP, men inputs från första sidan följer inte automatiskt över till nästa sida. Du har gjort en ny <form> och när du trycker på din submit-knapp så skickas ingenting tillbaka till servern eftersom du har inga <input>'s i din <form>.

Du måste lägga till hidden inputs, exempel:

<form method="post"> <input type="hidden" name="question-1-answers" value="<?=$answer1;?>"> <input type="hidden" name="question-2-answers" value="<?=$answer2;?>"> <input type="hidden" name="question-3-answers" value="<?=$answer3;?>"> <input type="hidden" name="question-4-answers" value="<?=$answer4;?>"> <input type="hidden" name="question-5-answers" value="<?=$answer5;?>">§ <input type= "submit" name="Submit" value="Submit"> </form>

Detta var exakt det som var problemet med att allt nollades och inte fattade mina variabler, tack!

Skrivet av Tekoppar:

Jag hade undvikit att skicka tillbaks resultaten för att sedan skicka in och lägga in i databasen eftersom det ger chansen att redigera poängen för svaren innan dem skickas tillbaks av användaren. Speciellt eftersom du inte använder prepared statements vilket öppnar upp dig för sql injection.

Istället när du summerar upp svaren så lagra dem i en array och spara den till $_SESSION variabeln och sedan när användaren klickar på submit så plockar du bara fram poängen ur $_SESSION och lägger in i databasen.

Hmm, jag har lite svårt att förstå vad du menar. När du skriver summerar, menar du då direkt efter det att användaren har klickat i till exempel "1a på fråga 1", eller menar du precis efter det att jag har viktat allting och lagt in det i $answer?

Visa signatur

Gaming: RTX 2070 & 3770k
Studier: MacBook pro retina 13
Ljud: QH-1339 & ett par rackans smidiga AirPods
Telefon: iPhone 6s plus
Skärm: ASUS 27" ROG Swift PG279Q med sån där g-sync

Permalänk
Medlem

Efter att du viktat allting.

Skickades från m.sweclockers.com

Permalänk
Medlem
Skrivet av Pamudas:

Du får undefined index när du försöker plocka ut svaren ur din _POST-variabel.
Detta gör att svaren blir undefined/null och kommer aldrig kunna vara "A", "B", "C", eller "D". Dina total-variabler är därmed alltid 0 eftersom du aldrig tilldelar dessa något annat.

Släng in dina inputs i <form>-taggarna så du faktiskt postar dina inputs 😁

Skrivet på mobilen så kan eventuellt ha missat något.

Se https://www.w3schools.com/php/php_forms.asp för mer info

Skrivet av Nogh:

Det här är mer ett HTML problem än PHP, men inputs från första sidan följer inte automatiskt över till nästa sida. Du har gjort en ny <form> och när du trycker på din submit-knapp så skickas ingenting tillbaka till servern eftersom du har inga <input>'s i din <form>.

Du måste lägga till hidden inputs, exempel:

<form method="post"> <input type="hidden" name="question-1-answers" value="<?=$answer1;?>"> <input type="hidden" name="question-2-answers" value="<?=$answer2;?>"> <input type="hidden" name="question-3-answers" value="<?=$answer3;?>"> <input type="hidden" name="question-4-answers" value="<?=$answer4;?>"> <input type="hidden" name="question-5-answers" value="<?=$answer5;?>"> <input type= "submit" name="Submit" value="Submit"> </form>

Skrivet av Tekoppar:

Jag hade undvikit att skicka tillbaks resultaten för att sedan skicka in och lägga in i databasen eftersom det ger chansen att redigera poängen för svaren innan dem skickas tillbaks av användaren. Speciellt eftersom du inte använder prepared statements vilket öppnar upp dig för sql injection.

Istället när du summerar upp svaren så lagra dem i en array och spara den till $_SESSION variabeln och sedan när användaren klickar på submit så plockar du bara fram poängen ur $_SESSION och lägger in i databasen.

Hej på er igen!

Jag har stött på ett nytt bekymmer.

Hemsidan är nu färdigutvecklad och jag har lagt upp den på ett webbhotell, (one.com).

Mycket av hemsidan bases på $_SESSION, te.x att få fram vilken användare det är som är online. Detta har fungerat hur bra som helst när jag har haft allt på min localhost, men nu när jag har flyttat detta till phpmyadmin på one.com så fungerar det inte längre.

Exempel:
Såhär ska det se ut när jag loggar in.

Problemet är att när jag har laddat upp hemsidan på one.com så fungerar inte detta, utan det ser bara ut såhär:

Koden för detta:

Databasen fungerar ju, eftersom att jag kan skapa ett konto som går att logga in på. Men av någon anledning fungerar inte längre $_SESSION på samma sätt.

Är det något uppenbart jag missar? Har ni någon idé?

Visa signatur

Gaming: RTX 2070 & 3770k
Studier: MacBook pro retina 13
Ljud: QH-1339 & ett par rackans smidiga AirPods
Telefon: iPhone 6s plus
Skärm: ASUS 27" ROG Swift PG279Q med sån där g-sync

Permalänk
Medlem

Smått offtopic men ha för vana att ALDRIG ha svärord eller "grova" ord i din kod eller data.
Rätt vad det är så demar du en produkt för viktigt folk och så kommer det upp på storbild.
Hände min första chef.

Permalänk
Medlem

@iXam: Helt rätt! Det är sena kväller och mycket irritation. Allt det där åtgärdades innan jag la upp det skarpt.

Visa signatur

Gaming: RTX 2070 & 3770k
Studier: MacBook pro retina 13
Ljud: QH-1339 & ett par rackans smidiga AirPods
Telefon: iPhone 6s plus
Skärm: ASUS 27" ROG Swift PG279Q med sån där g-sync

Permalänk
Medlem
Skrivet av MuLLvaD3n:

@iXam: Helt rätt! Det är sena kväller och mycket irritation. Allt det där åtgärdades innan jag la upp det skarpt.

Tills att man glömmer att ta bort dem eller inte får bort allt. Vilket är varför de aldrig, ens under utveckling, skall finnas i koden.

Permalänk
Medlem

Använd koden session_status() och se vilket värde du får tillbaks. Kan vara så att one.com inte har session enabled som default.

Skickades från m.sweclockers.com

Permalänk
Medlem

Liten uppdatering.

Idag fungerade det. SESSIONEN visades som den skulle. Sen uppdaterade jag någonting annat och då gick det tillbaka till precis samma problem igen. Det började inte fungera igen efter det att jag tog bort det jag uppdaterade och laddade upp identiska filer till de jag hade.

Kan det ha något att göra med att jag måste vänta efter att jag har laddat upp mina filer på one.com? Det låter långsökt, men jag har inga andra idéer.

Visa signatur

Gaming: RTX 2070 & 3770k
Studier: MacBook pro retina 13
Ljud: QH-1339 & ett par rackans smidiga AirPods
Telefon: iPhone 6s plus
Skärm: ASUS 27" ROG Swift PG279Q med sån där g-sync

Permalänk
Medlem

@Tekoppar: Behöver jag köra någon echo eller något eller ska jag få ett värde från att bara skriva session_status() rätt upp och ned?

Visa signatur

Gaming: RTX 2070 & 3770k
Studier: MacBook pro retina 13
Ljud: QH-1339 & ett par rackans smidiga AirPods
Telefon: iPhone 6s plus
Skärm: ASUS 27" ROG Swift PG279Q med sån där g-sync

Permalänk
Medlem

@MuLLvaD3n: Använd var_dump, echo printar inte null, false eller tomma strängar.

Permalänk
Medlem
Permalänk
Medlem

@Meto: Jag har aldrig gjort det som den där sidan beskriver innan. Jag vet inte om jag är lite trög här, men ska jag skapa en till fil som heter något.htaccess och skriva den kodraden där och sedan lägga den filen i min root-folder på webbhotellet?

Eller är det så att jag kan lägga in "Header add "Cache-Control" "no-cache"" i min header?

Tack för hjälpen, alla! Det uppskattas.

Visa signatur

Gaming: RTX 2070 & 3770k
Studier: MacBook pro retina 13
Ljud: QH-1339 & ett par rackans smidiga AirPods
Telefon: iPhone 6s plus
Skärm: ASUS 27" ROG Swift PG279Q med sån där g-sync

Permalänk
Medlem

Precis skapa .htaccess filen i root-foldern

Permalänk
Medlem

@Meto: Yes, ska testa det under dagen. Gjorde en sådan fil igår ändå för att få till https. Uppdaterar när jag testat!

Visa signatur

Gaming: RTX 2070 & 3770k
Studier: MacBook pro retina 13
Ljud: QH-1339 & ett par rackans smidiga AirPods
Telefon: iPhone 6s plus
Skärm: ASUS 27" ROG Swift PG279Q med sån där g-sync

Permalänk
Medlem

@Meto: Jag kunde inte hålla mig och testade på en gång från jobbet. Det verkar faktiskt ha löst problemet.

Men det är lite dumt för jag antar att man vill ha Varnish cache på?

Visa signatur

Gaming: RTX 2070 & 3770k
Studier: MacBook pro retina 13
Ljud: QH-1339 & ett par rackans smidiga AirPods
Telefon: iPhone 6s plus
Skärm: ASUS 27" ROG Swift PG279Q med sån där g-sync