webForumDet fria alternativet

Skillnad på 1 och 1 ???

PHP

5 svar · 448 visningar · startad av aasah

Medlem sedan mars 20034 471 inlägg
Frågan#1

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 check

I 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 check

I check
Funkade inte :-( för värde 1!
Utloggning funkade!
Test

??? :q Vad i självaste??? Vad är det jag inte ser?

Medlem sedan mars 20034 471 inlägg
#2

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?

Medlem sedan nov. 2002302 inlägg
#3

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" {
Medlem sedan mars 20034 471 inlägg
#4
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?

Medlem sedan nov. 2002302 inlägg
#5

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

Medlem sedan mars 20034 471 inlägg
#6

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! :)

261 ms totalt · 4 externa anrop · v20260731065814-full.e96017d9
129 ms — deklarationer (db)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)