Vänta nu... är det för att en TINYINT i SQL och en helt vanlig 1:a i PHP inte är samma typ? :q
I så fall, vilket är bästa lösningen? Att ändra i databasen till
aol INT
eller att använda == istället för === i jämförelsen?
5 svar · 448 visningar · startad av aasah
Jag har ett intressant problem. Bakgrunden är att jag vill ha en lägre grad av ip-koll på folk som ansluter via AOL. I det läget vill jag bara jämföra de tre första siffergrupperna, inte alla fyra. Jag skriver ihop ett litet testprogram. Så länge jag hårdkodar en 1:a för AOL-indikatorn funkar det, men inte när jag hämtar uppgiften ur databasen!!!??? :q
Min verkliga inloggning kollar fler saker och har inte dessa namn, det här är bara ett test!
//I filen tst.php fixas "testinloggning"
$db["aol"] = 1; //Hårdkodat värde
if ($db["aol"]) {
$ip = getenv("REMOTE_ADDR");
$lastPointPos = strrpos($ip, '.');
$_SESSION["ipTst"] = substr($ip, 0, $lastPointPos);
}
else $_SESSION["ipTst"] = getenv("REMOTE_ADDR");
$_SESSION["aol"] = $db["aol"];
echo "<BR><BR>".$_SESSION["aol"].": ".$_SESSION["ipTst"].
"<BR><BR> <a href=\"checkIP.php\">Go to check</a>";
//Kollas i checkIP.php
function inne() {
if (!isSet($_SESSION["ipTst"])) return FALSE;
elseif ($_SESSION["aol"] === 1) {
$ip = getenv("REMOTE_ADDR");
$lastPointPos = strrpos($ip, '.');
$comp = substr($ip, 0, $lastPointPos);
return $comp == $_SESSION["ipTst"];
}
else return $_SESSION["ipTst"] == getenv("REMOTE_ADDR");
}
function getOut() {
unset($_SESSION["ipTst"]);
unset($_SESSION["aol"]);
}
if (inne()) echo "Funkade för värde ".$_SESSION["aol"]."!<BR><BR>";
else echo "Funkade inte :-( för värde ".$_SESSION["aol"]."!<BR><BR>";
getOut();
if (inne()) echo "Utloggning funkade inte!<BR><BR>";
else echo "Utloggning funkade!<BR><BR>";
//Bara jag kan köra filen - kollar att inte fler sessionsgrejjor rök i getOut()
if (!isAdmin()) echo "Oooops!<BR><BR>";
echo "<BR><BR><a href=\"tst.php\">Test</a>";
Detta funkar galant! :) Ger följande utskrift:
I tst
1: xxx.xxx.xxx
Go to checkI check
Funkade för värde 1!
Utloggning funkade!
Test
OK, då byter jag ut tilldelningen av 1 i tst.php:
//I filen tst.php fixas "testinloggning" db-variant
//$db["aol"] = 1; Så stod det ovan
$query = "SELECT aol FROM Tabell WHERE User = 'Anna'";
$res = mysql_query($query) or die("tst ");
$db = mysql_fetch_array($res);
echo "???:".$db["aol"]."<BR><BR>";
if ($db["aol"]) {
//... se ovan, allt annat lika
Ger utskriften:
I tst
???:1
1: xxx.xxx.xxx
Go to checkI check
Funkade inte :-( för värde 1!
Utloggning funkade!
Test
??? :q Vad i självaste??? Vad är det jag inte ser?
Vänta nu... är det för att en TINYINT i SQL och en helt vanlig 1:a i PHP inte är samma typ? :q
I så fall, vilket är bästa lösningen? Att ändra i databasen till
aol INT
eller att använda == istället för === i jämförelsen?
Det blir antagligen en sträng med 1 istället för en integer med värde 1. Fast det borde ju funka kan man tycka.
Du kan prova med
if ($db["aol"])=="1" {
if ($db["aol"] == 1) {
Det går. Problemet är skillnaden mellan TINYINT och int. Suck! :x
Är det några nackdelar med att bara använda == eller bör jag ändra typ i databasen?
Nej det är inte någon nackdel. Det borde inte vara någon skillnad mellan att skriva så som du hade gjort och så som funkar...
Skillnaden är att === också kollar att typen stämmer... Jag trodde inte (förut) att den kände av olika typer av intar, men tydligen gör den det.
Tack! :)