05. juni 2016 - 18:55Der er
25 kommentarer og 1 løsning
Hvordan hentes cookie-værdier ind i søgesætning
Jeg har en side med køb og salg. På siden kan brugerne tilføje et emne til en huskeliste, hvorved der sættes cookies med navnet eks. koeb1012 eller salg3011 og opslagsnummeret som værdi, når der tilføjes til listen. Den første del af strengen refererer til den aktuelle tabel og den sidste til opslagsnumret.
Mit spørgsmål er : hvordan henter jeg cookie-værdierne og indlæser dem i et prepered statement, når brugeren klikker på sin huskeliste?
Hvis du skal vide mere præcist hvordan du hiver tingene ud, kan du så ikke lige lave en var_dump($_COOKIE); - og fortælle os hvad den spytter ud, så vi kan se præcis hvordan strukturen ser ud? Naturligvis efter der er tilføjet noget til cookies, så vi kan se det.
Tøhø. Det havde jeg faktisk gjort men fik intet, indtil jeg så at fonten var sat til hvid på hvid baggrund.... Her er hvad jeg får: array(4) { ["PHPSESSID"]=> string(26) "9c8t3vt8nmldg0n83rbb9t43k2" ["salg1137"]=> string(4) "1137" ["salg1140"]=> string(4) "1140" ["salg1097"]=> string(4) "1097" }
Men her kan vi se, at dine opslagsnumre faktisk bliver gemt dobbelt. Hvis du har mulighed for det, er det lettere at hive ud (og giver mere mening) kun at gemme dit tabelnavn i indekset, og så bruge værdien til opslagsnummeret, så det bare bliver 'salg' => '1097' i stedet for 'salg1097' => '1097'
Hvis du kan det, kan du hive parrene ud med en simpel foreach, sådan:
foreach ($_COOKIE as $tabelnavn => $opslagsnummer) { // Gør hvad du skal her med variablerne $tabelnavn og $opslagsnummer }
Du får dog et lille problem her, da $_COOKIE også indeholder andre ting, så der skal nok tilføjes et lille filter til at fjerne de ting, der ikke er opslag. Det kan gøres på mange måder, men kræver at opslag har et unikt kendetegn, som andre ting ikke har. Har du f.eks. en liste over tabelnavne, så kan det gøres sådan:
$godkendte_tabelnavne = ['koeb', 'salg'];
foreach ($_COOKIE as $tabelnavn => $opslagsnummer) { if ( in_array($tabelnavn, $godkendte_tabelnavne) ) { // Gør hvad du skal her med variablerne $tabelnavn og $opslagsnummer } }
- Men begge disse forudsætter, at du fjerner opslagsnummeret fra indekset, når cookies gemmes. Har du ikke den mulighed, skal de først splittes op. Lad mig lige vide.
Det ser meget forståeligt ud. Opslagsnummeret i cookiens navn var for at gøre hver cookie unik. Det er ikke noget problem at fjerne det men så overskrives cookien (eks "koeb) bare, når der vælges en ny til huskelisten.
Jeg bruger i øvrigt dette script til at sætte cookies: <script type="text/javascript"> function setCookie(parm,value){ exp = new Date().getTime()+1000*60*60*24*365; exp = new Date(exp).toGMTString(); document.cookie = parm+"="+value+";expires="+exp+";path=/" } </script>
Selvfølgelig. Jeg glemte naturligvis at nævne, at salgskoderne så skal tilføjes som et array.
Men det kan også sagtens bruges på din måde. Det er måske endda lettere, når det sættes fra Javascript. I så fald skal vi bare dele strengen op. Det er lettest hvis du tilføjer et separatortegn af en eller anden art. Eftersom det er et cookie-navn, må det ikke indeholde specielle tegn, men f.eks. bare en bindestreg "-" - så det hed "salg-1097". Så kan du sige
Kan du ikke tilføje en separator, så skal vi lige vide hvordan formatet er. Er det altid bogstaver i første del og tal i anden? Kan der indgå danske bogstaver? Er tallet altid 4 cifre langt?
Det ser ud som om, det er til at gå til. Kan du sige mig, hvordan jeg tilføjer salgskoderne som et array i det script, jeg bruger? Cookienavnet er enten ?koeb? eller ?salg?, værdien vil altid være et tal på 2-4 cifre.
#11: Jeg kan faktisk ikke huske, om du kan gemme som et direkte parsesable array-format fra Javascript, men du kan f.eks. bruge JSON som Arne nævner. Det kræver dog manuel parsing på begge sider, så umiddelbart er din egen løsning nemmere.
Hvis du ved at tabelnavnet altid er 'koeb' eller 'salg', så er det også meget let at dele det op, selv uden separator. F.eks. med $tabelnavn = substr($tabelnavn, 0, 4); - Det er ikke den bedste kodepraksis, fordi det hardcoder ind, at tabelnavnet skal være 4 tegn langt, men det virker. Mere modulært kunne du bruge et regex til at finde den del af strengen der ikke er tal. Det kunne gøres sådan: preg_match('/^[^\d]*/', $tabelnavn, $matches); $tabelnavn = $matches[0];
Hvis vi sætter det hele sammen, så bliver det sådan noget:
Jeg har lavet forskellige cookies af typen (salg1033, 1033) og (salg, 1033) for at prøve dine forslag. Når jeg alene bruger: foreach ($_COOKIE as $tabelnavn => $opslagsnummer) { echo "$opslagsnummer<br />\n"; } kommer alle værdier fint frem (både de ønskede og uønskede). Godt udgangspunkt! Men når jeg bruger: $godkendte_tabelnavne = ['koeb', 'salg'];
foreach ($_COOKIE as $tabelnavn => $opslagsnummer) { if ( in_array($tabelnavn, $godkendte_tabelnavne) ) { // Gør hvad du skal her med variablerne $tabelnavn og $opslagsnummer } } eller den "udvidede" i #12, kan siden ikke indlæses, og jeg får HTTP ERROR 500. Hvad gør jeg galt?
Det ved jeg ikke lige. Jeg har lige testet her, og det virker fint. Prøv at kopiere følgende kode ind i en fil, direkte, og kør den, uden noget andet i filen:
Hvis det ikke virker, så må det næsten være en serverindstilling eller lignende.
Men det kunne jo også være rart, hvis du fik en fejlbesked, så man havde noget at gå efter. Hvis de er slået fra, kan du slå dem midlertidigt til for denne ene fil, ved at skrive følgende i toppen af filen (lige efter <?php):
echo $tabelnavn . " ". $opslagsnummer. "<br>"; if (in_array($tabelnavn, $godkendte_tabelnavne)) { echo $tabelnavn . " indeholder : ";
$ar = explode(",", $opslagsnummer); for ($i = 0, $lng = count($ar); $i < $lng; $i++) { echo $ar[$i] . " "; } echo "<br>"; // Gør hvad du skal her med variablerne $tabelnavn og $opslagsnummer } } ?>
output
salg 1234,987,35987 salg indeholder : 1234 987 35987 kob 753,618 kob indeholder : 753 618 test 666,112,911
da php coden ligger på sammen side ser man først cookien slå igennem næste gang siden læses, men det kan klares med noget post og isset
Men det kunne jo også være rart, hvis du fik en fejlbesked, så man havde noget at gå efter. Hvis de er slået fra, kan du slå dem midlertidigt til for denne ene fil, ved at skrive følgende i toppen af filen (lige efter <?php):
man har da altid slået error_reporting og display error til under udvikling ikk ??. fejl beskeder er en stor del af udvikling, uden disse udvikles der i blinde. fejl og advarsler skal rettes, (advarsler skal man være opmærksomme på, og rette, hvis det er relevant)
#16: Hvis man har et udviklingsmiljø, klart. Det er kropumuligt at udvikle noget bare lidt kompliceret, hvis man ikke kan se fejlbeskeder. Men der er tilsyneladende mange der udvikler direkte på deres produktionsserver, og i de tilfælde er det et temmelig dårligt råd, at bede dem slå fejlmeddelelser til globalt.
Det lå uden for scope af denne tråd at snakke meget mere om det, så jeg valgte bare at nævne den simple, sikre løsning. Du er for min skyld meget velkommen til at sige mere om det.
>Men der er tilsyneladende mange der udvikler direkte på deres produktionsserver, og i de tilfælde er det et temmelig dårligt råd, at bede dem slå fejlmeddelelser til globalt.
ja derfor laver man en extern fil og ligger ind i toppen af sin php fil, at rode med php.ini eller php.so som den vist hedder på linux skal man være varsom med
jeg har denne externe fil liggende
<?php define('IN_DEBUG_MODE', true); // Sæt til false i production mode if (IN_DEBUG_MODE) { ini_set("display_startup_errors", "on"); ini_set("display_errors", "on"); ini_set("html_errors", "false"); error_reporting(-1); // -1 viser alle slags fejl beskeder ini_set("ignore_repeated_errors", 0); } else { // Turn off all error reporting error_reporting(0); } ?>
som jeg laver en include_once på alle mine sider.
og så bruger jeg browseren (F12). chrome udvidet med Web Developer eller firefox udvidet med firebug
Jeg forstår det ikke. Har prøvet både #14 og #15 med fejlbeskeder slået til. Og jeg får bare samme fejl hver gang (HTTP ERROR 500). Ingen resultat ejheller i udviklerværktøjer.
Men det er det, der er så mærkeligt: for det eneste der er i php-dokumentet er #7...og det virker. Når jeg erstatter det med #12 eller dit forslag, får jeg bare serverfejlen og intet andet. Ikke andet end 500. Jeg har en .htaccess-fil (til subdomains)).
Så kom jeg lidt nærmere: Når jeg fra #14 fjerner disse to linier: $godkendte_tabelnavne = ['koeb', 'salg']; if ( in_array($tabelnavn, $godkendte_tabelnavne) ) får jeg output! salg => 1137 salg => 1140 salg => 1097 salg => 1166 Det er pudsigt. Men det løser jo problemet.
Se, forklarere det jo alt. Jeg har lettere ved at forstå syntaksen i #14, og den passer godt med, det jeg videre skal foretage mig.
Synes godt om
Ny brugerNybegynder
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.