[PHP]Kan inte spara true/false korrekt till databas

Permalänk
Medlem

[PHP]Kan inte spara true/false korrekt till databas

Jag gör en webbsida och har ett par checkboxes. Så fort värdet ändras för en checkbox så sparas det nya värdet till databasen.
Men för att det ska sparas korrekt så måste jag först manuellt ändra värdet till 0 eller 1 för att det alltid ska fungera. Men då filter_var() tillåter mindre kod och gör det även säkrare så vill jag ju använda den funktionen.

Efter lite felsökning så märkte jag följande, dvs sätter $taskchecked manuellt;
"true" sparas som 1
"false" sparas som 0
true sparas som 1
false sparas som 1

Borde det inte vara så att true, "true" och "false" sparas som 1 medan medan false sparas som 0?

Får be om ursäkt om min lagom osäkra och n00biga kod. Men detta är vad jag har just nu i php filen som sparar till databasen.
Behövs mer kod så kan jag dumpa det med.

<?php session_start(); if(isset($_SESSION["userid"])){ include_once("../../../common/connect_to_database.php"); $ojbResponse = New stdClass; $data = file_get_contents("php://input"); $objDecoded = json_decode($data, false); $taskdbid = $objDecoded->dbid; $taskchecked = filter_var($objDecoded->checked, FILTER_VALIDATE_BOOLEAN); // if($objDecoded->checked == "true"){ // $taskchecked = 1; // } // else{ // $taskchecked = 0; // } $sql = "UPDATE tasks SET checked=$taskchecked WHERE id=$taskdbid"; mysqli_query($cxn, $sql); // $ojbResponse->status = "success"; $ojbResponse->status = $taskchecked; //TROUBLESHOOTING $jsonResponse = json_encode($ojbResponse); } //Not logged in else{ $ojbResponse->status = "error"; $ojbResponse->message = "You have to log in to use this!"; $jsonResponse = json_encode($ojbResponse); } //Answer with a json response echo($jsonResponse); exit(); ?>

Permalänk
Medlem

Din kod är inte lagom osäker, den är totalt osäker i och med att klienten kan skicka in vilken SQL som helst i databasen.

Eftersom du ändå måste göra om det så är det lika bra att du börjar där, med stor sannolikhet räcker det att du får koll på dina typkonverteringar för att koden ska börja fungera som förväntat. Det kommer du antagligen få om du till exempel använder prepared statements.

Jag kodar inte PHP till vardags, så jag har inte koll på om prepared statements är best practice, men det är garanterat bättre än vad du gör nu, och det möjliggör enligt manualen att från koden speca vilka datatyper du har i fälten i databasen.

Du har inte berättat vilken datatyp du har i det berörda databasfältet, men varken boolean- eller int-datatypkonvertering beter sig så som du beskriver, enligt manualen.

Permalänk
Medlem

Om jag minns rätt har varken MariaDB eller MySQL stöd för Boolean utan sparas som TINYINT(1) så du kan inte direkt spara ned värdet av checkboxen.

Du skulle kunna göra något liknande:

$checked = ( isset($_POST['checkbox']) ) ? 1 : 0;

Annars är det sättet du göra det på ett OK sätt också. Nu var det dock många är sedan jag satt med PHP!

Permalänk
Medlem

Jag skulle först vilja rekommendera att använda pdo istället för mysqli då det är ett trevligare sätt att ansluta till dbs och köra queries imo. Det ser ut som att din sql query kommer bli felaktig eftersom du interpolerar boolean värden till strängar, bäst är troligen att här göra något i stil med gonaco svar ovan att konvertera boolean värdet ($taskchecked) till vad du vet fungerar i en sträng innan du sätter in värdet i queryn. KAD har också en poäng med att du filtrerar $taskchecked men inte $taskdbid vilket kan vara vad som helst när den kommer in i querysträngen. En rekommendation är också att sätta "{" och "}" runtom variabler i en sträng där de förväntas interpoleras.
När man skickar tillbaka data (genom echo eller dylikt) är det också bra att inkludera headers för att beskriva bl.a. formatet och encodingen av datat.

Mindre tips för att felsöka är att börja i slutet, vad blir resultatet i dbn, hur ser query strängen egentligen ut för det resultatet, vad har variablerna som interpoleras för värden osv.

Permalänk
Medlem

Vet som sagt att koden är skräp just nu, men har inte kommit så långt än att jag kan allt i hela universum. Var därför jag nämnde att min kod är lagom osäker och n00big.
Men stämmer att jag använder TINYINT(1) i databasen för att spara checked värdet.
Kommer titta närmare på pdo längre fram, men måsvingarna runt variablerna kommer jag absolut ta till mig direkt.

Hittade dock var jag gjorde fel.
Lösning: Var för snabb när jag läste om filter_var(). Trodde funktionen konverterade till 1/0 vilket den inte gör. Den konverterar enbart till det booleska värdet. Jag behövde casta till int. Alltså (int)filter_var().