webForumDet fria alternativet

strcmp versus == ?

PHP

4 svar · 286 visningar · startad av aasah

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

PHP är kul... oftast. Just nu är det mindre kul... ;)

Jag har följande situation:

//utsnitt ur form
<input type="hidden" name="shyNewPost" value="newP" > <BR>
<input class="buttonG" type="submit" name="submitPost" value="Post it!" ><BR><BR>

//Hjälpfunktion - anv av de flesta av mina skript - ger bland 
//annat true korrekt för wasChosen("X", "I want to comment!")
function wasChosen($name, $val) {
   return (isSet($_POST["$name"]) && $_POST["$name"] == $val);
}

//Utdrag ur skriptet
echo ($_POST['shyPost'] == "1")." A<BR>";
echo ($_POST['Post'] == "Post News!")." B<BR>";
echo (strcmp($_POST['Post'], "Post News!"))." C<BR>";
if (!(wasChosen("shyPost", "1") && wasChosen("Post", "Post News!")))
     exit("New: Something's odd...");

Ger utskriften:

1 A
B
1 C
New: Something's odd...

Enligt https://www.php.net (om jag har förstått det rätt) är skillnaden den att strcmp alltid funkar då den jämför strängarna/bit, medan == är OK så länge man inte riskerar en typkonvertering före jämförelsen?

  1. Stämmer detta eller har jag fattat fel?

  2. Om det stämmer: borde inte det innebära att == ibland ger true när det inte borde, men där strcmp korrekt ser att det är false? Hur i självaste... kan resultatet bli det omvända: att strcomp ger true när == är falskt???! :l

Dessutom använder sig praktiskt taget vartenda skript jag har av wasChosen som funkat hur bra som helst ända till nu! Även på strängar med mellanslag och annat udda i.

  1. Så varför spårar den ur just nu? Vad är tokigt?

Tacksam för hjälp att begripa...

Medlem sedan aug. 20002 975 inlägg
#2

strcmp returnerar inte sant eller falskt, utan den returnerar 0 (noll) om värdena är lika, annars 1 eller -1 beroende på vilket värde som är störst.

Så vad jag kan se stämmer det hela för dig, '==' skriver inte ut något, vilket är lika med false (de stämmer inte), medan strcmp skriver ut 1 vilket betyder att de inte är lika med varandra.

Vill du även använda typkontroll vid din jämförelse samt få sant/falskt använder du istället '==='.

Medlem sedan mars 20034 471 inlägg
#3

Matte skrev:

... Så vad jag kan se stämmer det hela för dig, '==' skriver inte ut något, vilket är lika med false (de stämmer inte), medan strcmp skriver ut 1 vilket betyder att de inte är lika med varandra....

Åh! Men... de är ju lika!!!

echo ($_POST['shyPost'] == "1")." A<BR>";
echo $_POST['Post']." B ".strlen($_POST['Post'])."<BR>";
echo strlen("Post News!")." C<BR>";
echo ($_POST['Post'] == "Post News!")." D<BR>";
if (!(wasChosen("shyPost", "1") && wasChosen("Post", "Post News!")))
     exit("New: Something's odd...");

1 A
Post news! B 10
10 C
D
New: Something's odd...

De har ju samma värde och samma längd!!! Vad är då felet???

Medlem sedan aug. 20002 975 inlägg
#4

Du har gement 'n' i news som du jämför med versalt 'N' i News.

'n' och 'N' är inte samma tecken.

Medlem sedan mars 20034 471 inlägg
#5

Åh! :r Det har jag inte sett fast jag stirrat på detta både länge och väl... x(

TACK, matte!

260 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)