Avatar billede showsource Seniormester
06. november 2005 - 10:43 Der er 23 kommentarer og
1 løsning

Stort bogstav for værdi i et array

Hej
Er ved at lave et galleri, hvor jeg først henter de forskellige gallerier i DB'en, og putter dem ind i et array, $galleries

print_r($galleries)

giver

Array ( [0] => Julefrokost 2003 [1] => julefrokost 2004 [2] => jups [3] => ups [4] => æblegrød )

På siden som skal vise gallerier, (en includefil), spørger jeg så:

if(!isset($_GET["galleri"]) || !in_array(urldecode($_GET["galleri"]), $galleries)) {
echo"fejl";
return;
}

Det virker næsten, kun næsten fordi hvis et galleri starter med stort bogstav, ja, så "er det ikke i array'et"

Hvorfor nu det?

PHP ver. 5.0.4
Avatar billede nielle Nybegynder
06. november 2005 - 10:47 #1
Brug funktionen ucfirst() på dine strenge før at du lægger dem i dit array:

http://dk2.php.net/manual/en/function.ucfirst.php
Avatar billede showsource Seniormester
06. november 2005 - 10:51 #2
Det skulle vel li'som ikke rigtigt være nødvendigt?
Og det gør blot at den aldrig finder GET["galleri"] i array'et $galleries

Jeg kan godt finde ud af at løse det, men det som undrer mig, er at det ikke virker hvis første bogstav er stort?
Avatar billede nielle Nybegynder
06. november 2005 - 11:03 #3
Søgningen via in_array() er case-semsitiv, så den er der ikke så meget at gøre ved. Værdien fra $_GET skal m.a.o. være eksakt det som der er i dit array.

Vi snakker om at du skal indsætte en enkelt linje kode der hvor du opbygger arrayet - jeg har svært ved at se at det skulle være besværligt?
Avatar billede nielle Nybegynder
06. november 2005 - 11:10 #4
Alternative løsninger kunne være at:

1) Bruge ucfirst() på dine data før at de lægges i databasen.

2) Bruge den eksakte case i dine urls. Altså sådan at $_GET["gallery"], når der søges på julefrokosten 2004, returnere "julefrokost 2004" og altså ikke "Julefrokost 2004".

Personligt tror jeg faktisk nok at jeg ville foretrække 1).
Avatar billede showsource Seniormester
06. november 2005 - 11:16 #5
Nåh, nu er det sgu belastende!
Prøvede lige med noget test, og her er sgu ingen forskel på om det er med stort eller lille bogstav.

<?php
$test = array();
$test[] = "værdi";
$test[] = "Værdi";
$test[] = "noget mere";
$test[] = "Noget mere";

foreach($test as $link) {
echo"<a href=\"". $_SERVER["PHP_SELF"] ."?var=". urlencode($link) ."\">". htmlentities($link) ."</a><br />\r\n";
}

if(!isset($_GET["var"]) || !in_array(urldecode($_GET["var"]), $test)) {
    echo"Nix, ikke sat, eller ikke fundet";
    }else{
    echo"jow, den er go nok";
}

?>

Men hvorfor fa'n det ikke virker med $galleries kan jeg ikke lige blive klog på.
Avatar billede nielle Nybegynder
06. november 2005 - 11:20 #6
Her har du jo både den store og den lille version af hver streng ... det har du jo ikke i din $galleries.
Avatar billede showsource Seniormester
06. november 2005 - 11:24 #7
hmm, bruger noget javascript til at vise en menu med forskellige gallerier,
http://www.dynamicdrive.com/dynamicindex1/dropmenuindex.htm

I en includefil,  som includes på hver side, finder jeg gallerier så'n:

// FIND GALLERIES

$get_galleri = mysql_query("SELECT DISTINCT(kategori) FROM `galleri` ORDER BY `kategori`") or die (mysql_error());
if(mysql_num_rows($get_galleri) !=0) {
$galleries = array();
    while($g = mysql_fetch_object($get_galleri)) {
    $galleries[] = strip_slash($g->kategori);
    }
$weblinks["galleri"] = "<a href=\"/\" onClick=\"return clickreturnvalue()\" onMouseover=\"dropdownmenu(this, event, galleri, '150px')\" onMouseout=\"delayhidemenu()\">Galleri</a>";
}
mysql_free_result($get_galleri);
// END FIND GALLERIES


Og indexfilen, som includer filen med ovenstående, bruger jeg så:


if(isset($weblinks["galleri"])) {
echo"\r\nvar galleri=new Array()\r\n";

    for($g = 0; $g < count($galleries); $g++) {
    echo"galleri[". $g ."]='<a href=\"/galleri/". urlencode($galleries[$g]) ."/\">". htmlentities($galleries[$g]) ."</a>'\r\n";
    }
}


I min testfil, er det ligemeget om jeg bruger stort eller lille bogstav først.
"Hvad for noget" eller "hvad for noget"
Den bliver fundet, hvis den er der.
Avatar billede showsource Seniormester
06. november 2005 - 11:30 #8
Nåh, det sgu selvf. min .htaccess som får den til at fejle!
Avatar billede showsource Seniormester
06. november 2005 - 11:31 #9
Men præcis hvorfor skal jeg ik' lige kunne sige:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-F
RewriteRule ^([^/]+)/([^/]+)/([^/]+)$ /index.php?vis=$1&var_et=$2&var_to=$3 [qsappend]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/$ /index.php?vis=$1&var_et=$2&var_to=$3 [qsappend]
RewriteRule ^([^/]+)/([^/]+)/$ /index.php?vis=$1&var_et=$2 [qsappend]
RewriteRule ^([^/]+)/$ /index.php?vis=$1 [qsappend]
Avatar billede nielle Nybegynder
06. november 2005 - 11:33 #10
Aha, så det vil alstå sige at din casing er den samme i databasen som i de urls du laver... Ja, så er det da godt nok mærkeligt. Jeg gik ud fra at det var nogle urls som du havde hardkodet ind i din tekst - silly me ;^)

Hvorfor antager du at det har noget at gøre med store og små bogstaver? Det kan lige så godt tænkes at nogle af kategory-værdierne i din database har et lille mellemrum for meget i enden. Den slags fejl er notorisk svære at finde.
Avatar billede nielle Nybegynder
06. november 2005 - 11:35 #11
Jeg kan godt nok heller ikke se noget i dine rules som har noget at gøre med store eller små bogstaver...
Avatar billede showsource Seniormester
06. november 2005 - 11:35 #12
Lavede lige en test, med flg. .htaccess:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-F
RewriteRule ^([^/]+)/([^/]+)/([^/]+)$ /hh/nyar.php?vis=$1&var_et=$2&var_to=$3 [qsappend]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/$ /hh/nyar.php?vis=$1&var_et=$2&var_to=$3 [qsappend]
RewriteRule ^([^/]+)/([^/]+)/$ /hh/nyar.php?vis=$1&var_et=$2 [qsappend]
RewriteRule ^([^/]+)/$ /hh/nyar.php?vis=$1 [qsappend]

Og filen "nyar.php":

<?php
$test = array();
$test[] = "værdi";
$test[] = "Hvad for noget";
$test[] = "noget mere";
$test[] = "Noget mere";

foreach($test as $link) {
echo"<a href=\"/hh/". urlencode($link) ."/\">". htmlentities($link) ."</a><br />\r\n";
}

if(!isset($_GET["vis"]) || !in_array(urldecode($_GET["vis"]), $test)) {
    echo"Nix, ikke sat, eller ikke fundet";
    }else{
    echo"jow, den er go nok";
}

?>

Og den fejler på linket "Hvad for noget"
Avatar billede showsource Seniormester
06. november 2005 - 11:36 #13
Og altså, hvis jeg IKKE bruger den .htaccess, så virker det fint nok.
Avatar billede nielle Nybegynder
06. november 2005 - 11:41 #14
Hvis du laver en lille debug-kode hvor du blot skriver værdierne ud - hvad får du så?

echo "DEBUIG [" . urldecode($_GET["vis"]) . "]<br>";

Du skal nok ind og lave Vis Kode hvis du skal se det hele.
Avatar billede showsource Seniormester
06. november 2005 - 11:46 #15
hmm, ja, nu er hele strengen i lowercase?
Avatar billede nielle Nybegynder
06. november 2005 - 11:49 #16
Det stemmer da ikke med at du ikke havde problemer med dine uppercase tekster til at starte med?
Avatar billede showsource Seniormester
06. november 2005 - 11:50 #17
Så er det jo klart den ikke findes i arrayet.
Men i url står:

http://htaccess.localhost/hh/Hvad+for+noget/

og print_r() giver:
Array ( [0] => værdi [1] => Hvad for noget [2] => noget mere [3] => Noget endnu mere )


Og

if(isset($_GET["vis"])) {

$hmm = urldecode($_GET["vis"]);
echo"<p>". $hmm ."<p>";
}

giver $hmm i lowercase
Avatar billede nielle Nybegynder
06. november 2005 - 11:56 #18
Hmm, det kan jeg godt nok heller ikke gennemskue.

Men du startede jo spørgsmålet med at fortælle at du netop ikke havde problemer med uppercase-varianterne, og at det kun var lowercase som drillede? Har du lavet om på noget siden at dette nu ikke er rigtigt mere?
Avatar billede nielle Nybegynder
06. november 2005 - 11:57 #19
Nææe det var vist ikke det du skrev - undskyld. Man skal læse ordentligt!
Avatar billede showsource Seniormester
06. november 2005 - 12:00 #20
ehh, jeg har ikke lavet noget om :O)
Problemet var/er at en værdi i array'et, som starter med stort, ikke bliver fundet, selvom den rent faktisk er i array'et.

Men det er jo så også den .htaccess som laver bøvl.

Og læste iøvrigt lige på
http://dk2.php.net/manual/en/function.urldecode.php

man ikke bør bruge urldecode for getvariabler!
Avatar billede showsource Seniormester
06. november 2005 - 12:06 #21
Du må gerne smide et svar, så du kan få point for brug af tid!
Avatar billede showsource Seniormester
06. november 2005 - 12:08 #22
Lavede lige en test på det host som den skal ligge på, og her er der ingen problemer? :O)
Avatar billede nielle Nybegynder
06. november 2005 - 16:27 #23
Ja, du bør ikke lave urldecode() på værdier du får fra $_GET[], $_POST[] eller $_SESSION[] - det er nemligt allerede gjort på forhånd, og faktisk vil det at gøre det en gang til derfor introducere en svaghed i din kode.

Jeg har ingen som helst ide om hvorfor at .htaccess driller... Da in_array() er case-sensitiv, lader det til at du simpelthen bliver nødt til at kalde strtolower() før at du lægger i dit array. Det er ikke vildt fedt at det skulle være nødvendigt, men det er da mere irriterende at det ikke er klar hvorfor at .htaccess gør det den gør.

Nej tak, jeg afstår for point på denne her. Ellers tak for tilbudet. :^)
Avatar billede showsource Seniormester
06. november 2005 - 19:29 #24
ok.
Laver det så det gemmes med småt, og så linker med stort, og tjekker igen med småt........

Aner heller ikke hvorfor der går ged i den.
Men virker som noget apache noget.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester