Avatar billede horizon Nybegynder
01. september 2008 - 22:12 Der er 13 kommentarer og
1 løsning

problemer med settype() og at analysere en string

Jeg trækker nogle data ud fra en database og skal så finde ud af hvilken type variabel jeg så skal arbejde med. problemet er bare at alt åbenbart håndteres som en string da min hent funktion smider alt ind i et array som f.eks. $resultat[vaerdi]

Jeg har prøvet og sidde og gøgle lidt med en funktion til at finde ud af hvilken type data jeg sidder med.

if($resultat[Vaerdi] == 'true' or 'false')
        $type = boolean;
    elseif(preg_match("/[0-9]/", $resultat[Vaerdi], $subpatterns = null, $flags = null, $offset = null))
        $type = integer;
    elseif(is_float($resultat[Vaerdi]))
        $type = float;
    elseif(is_array($resultat[Vaerdi]))
        $type = "array";
    elseif(is_object($resultat[Vaerdi]))
        $type = "object";
    elseif($resultat[Vaerdi] == '' || $resultat[Vaerdi] == 'null')
        $type = null;
    else
        $type = string;
   
    settype($resultat[Vaerdi], $type);

Der er dog flere ting her jeg endnu mangler og har problemer med

boolean kan den sagtens finde ud af.

Hvis variablen indeholder tal og bogstaver, så klipper den alt væk efter den første gruppe tal og siger at det er et integer selvom det jo burde returneres som en string.

Hvordan finder jeg ud af om jeg har med objects at gøre

hvordan finder jeg ud af om jeg har et decimaltal

Og så når jeg echoer variablen til sidst eller når jeg skal bruge den, så med mindre den er null så skriver den kun 1.

Lidt hjælp kunne godt bruges ;-)
Avatar billede jakobdo Ekspert
02. september 2008 - 08:10 #1
Hvis du laver var_dump() på $resultat[Vaerdi]
Kan den så fortælle hvad du har med at gøre ?
I stedet for preg_match(), hvorfor så ikke bruge is_numeric() eller is_int() ?

Du kan også prøve at kigge på: http://dk.php.net/manual/en/function.gettype.php
Selvom de advarer mod det.
Avatar billede jakobdo Ekspert
02. september 2008 - 10:05 #2
Se kode eksempler her: http://www.codebreaker.dk/exp/843852
Avatar billede erikjacobsen Ekspert
02. september 2008 - 10:13 #3
Det er ikke den måde du skal gøre det på. Lad mig påpege et par ting:

Det hedder ikke

  if($resultat[Vaerdi] == 'true' or 'false')

men

  if($resultat[Vaerdi]=='true' || $resultat[Vaerdi]=='false')

Du kan ikke regne med at

  elseif(preg_match("/[0-9]/", $resultat[Vaerdi], $subpatterns = null, $flags = null, $offset = null))

giver mening. Det er ikke et tal-felt bare fordi det indeholder et enkelt ciffer. Det har du jo så opdaget. Men selv om du finder et felt, der kun indeholder cifre, er det jo ikke et tegn på at det er et talfelt, og heller ikke nogen indikation af at det skal behandles som tal.

Og den her:

  $type = boolean;

mener du vel ikke - skulle det ikke være

  $type = "boolean";

?


Men der er en løsning, der dog er langt væk fra den du har her. Du skal spørge databasen hvilken type hvert felt har. Det kan den svare på. Der er dog stor forskel på hvordan man gør afhængig af hvilken database du anvender.
Avatar billede dkfire Nybegynder
02. september 2008 - 12:26 #4
Hvorfor er det lige at du med kode vil finde du af hvilken type din variabel er.
Har du ikke styr på hvilke typer du henter og bruger i din database ??

PHP håndtere, modsat andre programmerings sprog, variabler løst. Dvs at php ikke ligger sig fast på en type for de enkelte variabler. Du skal derfor selv holde styr på hvilken type din variabel indeholder på et givet tidspunkt.
En variabel i php kan sagtens indeholde en streng på et tidspunkt og det næste tidspunkt være tildelt et array.
PHP vil ikke melde fejl hvis du skriver et array i en variabel som før indeholdte en streng, men vil der i mod melde fejl hvis du prøver at læse arrayet som en streng. Derfor er det vigtigt at du selv holder styr på hvad dine variabler indeholder og ikke lader koden gøre det.
Avatar billede jakobdo Ekspert
02. september 2008 - 12:46 #5
dkfire: Det kan jo være det skal bruges til backup af en database. :o)
Avatar billede dkfire Nybegynder
02. september 2008 - 17:58 #6
Så er det da meget nemmere at bede mysql, eller hvem det nu er, om at give tabelstrukturen, ellers kan du da ikke lige vide om det er int(10) eller int(5) som er blevet brugt.
Avatar billede horizon Nybegynder
02. september 2008 - 21:41 #7
dkfire > lige præcis denne tabel indeholder forskellige former for data, så derfor kunne jeg godt tænke mig at vide hvilken form for data jeg har med at gøre.

erikjacobsen > Fik også selv opdaget de manglende "" og den "or false" fejl.

jakobdo > problemet med gettype som jeg har opdaget er at mine variabler altid returnerer "string" som svar.

Generelt er grunden til dette at jeg har oplevet at hvis jeg ikke skriver f.eks. $resultat == "true" i stedet for $ resultat == true, så reagerer scripts tit uventet.
Avatar billede jakobdo Ekspert
02. september 2008 - 21:59 #8
Til at få info fra mysql, skal du bruge: http://dk.php.net/mysql_list_fields
Avatar billede dkfire Nybegynder
02. september 2008 - 22:12 #9
Når du siger forskellige former for data, så mener du bare at hver kolonne indeholder forskellig typer af data ?
Avatar billede horizon Nybegynder
02. september 2008 - 22:16 #10
dkfire > aah ja. præcis...

jakobdo > takker, snuser lige lidt til det.
Avatar billede horizon Nybegynder
09. oktober 2008 - 22:18 #11
splittede det op i forskellige databaser. var det nemmeste.

men smid et svar begge to.
Avatar billede jakobdo Ekspert
10. oktober 2008 - 06:32 #12
Svar!
Avatar billede erikjacobsen Ekspert
10. oktober 2008 - 08:48 #13
Ingen point til mig, tak.
Avatar billede jakobdo Ekspert
10. oktober 2008 - 12:53 #14
Takker for point.
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