/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Errorhandling i php/sql
Fra : Poul Erik Jensen


Dato : 08-06-05 22:58

Kan nogen løse dette ellers simple udseende problem, som jeg altså er gået
død på?

$kolonne indeholder kolonnenavne, hvoraf nogle ikke findes i tabellen

$result = mysql_query("SELECT $kolonne FROM tabel WHERE id='$id'") or
die(mysql_error());

Hvis kolonnen findes skal indholdet bearbejdes - ellers skal det blot
ignoreres uden noget synligt resultat.

Det går fint hvis kolonnen findes, men hvis ikke følger en fejludskrivning
og efterfølgende exit - som gerne skulle håndteres.

--
Med venlig hilsen Poul Erik Jensen
www.genealog.dk www.skolekammeraten.dk
Subj. må tilføjes [1234] ved direkte svar




 
 
Troels Hansen (09-06-2005)
Kommentar
Fra : Troels Hansen


Dato : 09-06-05 07:18

Poul Erik Jensen wrote:
> Kan nogen løse dette ellers simple udseende problem, som jeg altså er gået
> død på?
>
> $kolonne indeholder kolonnenavne, hvoraf nogle ikke findes i tabellen
>
> $result = mysql_query("SELECT $kolonne FROM tabel WHERE id='$id'") or
> die(mysql_error());
>
> Hvis kolonnen findes skal indholdet bearbejdes - ellers skal det blot
> ignoreres uden noget synligt resultat.
>
> Det går fint hvis kolonnen findes, men hvis ikke følger en fejludskrivning
> og efterfølgende exit - som gerne skulle håndteres.

At du har det problem siger noget om at din database er lavet forkert,
men hvis du vil "løse" problemer han du jo bare bruge din mysql_query
til at tjekke om der kommer en fejl:
if($result = mysql_query("SELECT $kolonne FROM tabel WHERE id='$id'")){
// udskriv resultatet
}
og lade være med at udskrive hvis du får fejl.

Poul Erik Jensen (09-06-2005)
Kommentar
Fra : Poul Erik Jensen


Dato : 09-06-05 12:27

"Troels Hansen" <idle@emanymtonstaht.dk> skrev i en meddelelse
news:42a7df9c$0$18644$14726298@news.sunsite.dk...
> Poul Erik Jensen wrote:
>> fejludskrivning og efterfølgende exit -

> At du har det problem siger noget om at din database er
> lavet forkert,

Du har sikkert ret - som novice i php/sql sammenhængjeg bruger jeg sikkert
'værktøjet' forkert, men jeg troede faktisk det var muligt at søge efter
noget i en database, selv om det ikke fandtes i denne - uden at få
programstop.

Det kan man så også "løse", som du udtrykker det, men efterfølgende skulle
man jo gerne have databaseindholdet ud i en variabel og så går det galt,
hvis indholdet (kolonnen) slet ikke findes.

Værdien skal, hvis den findes, bruges til videre bearbejdning, der springes
over i fald den ikke findes - men den del er der ikke noget problem i.

--
Med venlig hilsen Poul Erik Jensen
www.genealog.dk www.skolekammeraten.dk
Subj. må tilføjes [1234] ved direkte svar




Per Thomsen (09-06-2005)
Kommentar
Fra : Per Thomsen


Dato : 09-06-05 13:05

Poul Erik Jensen wrote:
> "Troels Hansen" <idle@emanymtonstaht.dk> skrev i en meddelelse
> news:42a7df9c$0$18644$14726298@news.sunsite.dk...
>
>>Poul Erik Jensen wrote:
>>
>>>fejludskrivning og efterfølgende exit -
>
>
>>At du har det problem siger noget om at din database er
>>lavet forkert,
>
>
> Du har sikkert ret - som novice i php/sql sammenhængjeg bruger jeg sikkert
> 'værktøjet' forkert, men jeg troede faktisk det var muligt at søge efter
> noget i en database, selv om det ikke fandtes i denne - uden at få
> programstop.

Jeg synes også det ser ud som om, du har misforstået brugen af databaser.

Så vidt jeg kan gennemskue, ud fra dine beskeder, så sletter og
indsætter du kolonner, med værdier i en række.
Det er vist lidt omvendt af hvordan man 'normalt' gør.

Når du sender en SQL query til databasen, hvor kolonnen ikke findes, så
vil databasen mene at der er fejl i din SQL. Dette kan du selfølgelig
godt anvende på den måde du gør, men det har jeg aldrig set før.

Det man gør er at man har en tabel med nogle faste kolonner (dvs.
antallet af kolonner ændrer sig ikke). Og så tilføjer, sletter og ændrer
man rækker i denne SQL.

Databasen vil ikke have noget problem med at søge efter rækker, der ikke
findes, den vil finder bare ikke nogen rækker.

Altså kort sagt: Det er en SQL fejl at udvælge kolonner, der ikke
findes, men det er ikke en SQL fejl at søge efter en række der ikke findes.

Hvis jeg ellers gætter rigtigt på, hvad det er du gerne vil gøre, så er
det noget med at søge efter en værdi med et bestemt navn og et bestemt id.

Et simpelt tabel-design kunne f.eks. se således (i MySql syntax):
   CREATE TABLE NameValue (
    name VARCHAR(32) NOT NULL,
    value VARCHAR(32) NOT NULL,
    id INT NOT NULL,
    PRIMARY KEY(name,id)
   );
   
Lad os så sige at du indsætter værdien 'bar' med navnet 'foo' og id 1:
INSERT INTO NameValues(id,name,value) VALUES(1,'foo','bar);

Det du så ønsker at gøre er at undersøge om der findes en værdi med
navnet 'foo' og id=1:
   SELECT value FROM NameValue WHERE name='foo' AND id=1;
eller i PHP:
$res = mysql_query('SELECT value FROM NameValue WHERE name=\''.$name.'\'
AND id='.$id);

hvis der er fejl i din SQL, vil ovenstående fejle, men læg nu mærke til
at det ikke er en fejl, at databasen ikke finder nogle rækker.

Du kan i stedet spørge, hvor mange rækker der blev fundet med
mysql_num_rows():

   if( $res=mysql_query(...) ) {
    if( (mysql_num_rows($res)>0 ) {
    // der blev fundet nogle rækker
    } else {
    // der blev ikke fundet nogle rækker
    }
   }



"Din" statement:

$result = mysql_query("SELECT $kolonne FROM tabel WHERE id='$id'") or
die(mysql_error());

dør altså, fordi at det er en fejl i SQL'en at angive en kolonne, der
ikke findes.


Det er selfølgelig ikke fuldstændig utænkeligt at din fremgangsmåde er
velovervejet og besluttet. Hvis du vil fortsætte med den fremgangsmåde,
kan du bruge, noget i denne stil:

$res = mysql_query(...));
if ( ($errCode = mysql_errno($res))==0 ) {
// kolonnen findes
} else {
// kolonnen findes højst sandsynligt ikke,
// men kan jo også være andre fejl i din SQL.

// se http://dev.mysql.com/doc/mysql/en/error-handling.html)
if( $errCode==1054 ) {// Unknown column
   // kolonnen findes ikke
} else {
   die( mysql_error() ); //Der er noget andet galt.
}
}

Håber det kan hjælpe dig videre...

MVH Per Thomsen,
http://www.pert.dk/




Poul Erik Jensen (09-06-2005)
Kommentar
Fra : Poul Erik Jensen


Dato : 09-06-05 14:20

"Per Thomsen" <pert@pert.dk> skrev i en meddelelse
news:42a8307c$0$18641$14726298@news.sunsite.dk...

> Så vidt jeg kan gennemskue, ud fra dine beskeder, så sletter og indsætter
> du kolonner, med værdier i en række.

Det er nu ikke rigtigt, for der er et antal kolonner der indeholder hver
deres rækkes værdi.

> Det er vist lidt omvendt af hvordan man 'normalt' gør.

Nåe, ja, det kan jeg godt se - det forudsættes at kende både kolonne og
række - så kræver jeg måske for meget, når jeg føst vil finde ud af om
kolonnen findes - og det er så blot at lave en tabel med godkendte kolonner
og spørge der først?

Godt nok mere besværligt end en "simpel" errorhandler )

> Når du sender en SQL query til databasen, hvor kolonnen
> ikke findes, så vil databasen mene at der er fejl i din SQL

Det er selvklart.

> Dette kan du selfølgelig godt anvende på den måde du gør,
> men det har jeg aldrig set før.

Jamen ... humlebien ))

> Databasen vil ikke have noget problem med at søge efter
> rækker, der ikke findes, den vil finder bare ikke nogen rækker.

Tja, der mangler åbentbart en dimention.

> Hvis jeg ellers gætter rigtigt på, hvad det er du gerne vil gøre, så er
> det noget med at søge efter en værdi med et bestemt
> navn og et bestemt id.

Ja, det er netop det det handler om.

> Et simpelt tabel-design ...
> Du kan i stedet spørge, ....
> Det er selfølgelig ikke fuldstændig utænkeligt ...
> Håber det kan hjælpe dig videre...

Jo, tak for tips - dem vil jeg lige ulme lidt på.

--
Med venlig hilsen Poul Erik Jensen
www.genealog.dk www.skolekammeraten.dk
Subj. må tilføjes [1234] ved direkte svar





Poul Erik Jensen (09-06-2005)
Kommentar
Fra : Poul Erik Jensen


Dato : 09-06-05 15:58

"Per Thomsen" <pert@pert.dk> skrev i en meddelelse
news:42a8307c$0$18641$14726298@news.sunsite.dk...

> $res = mysql_query(...));
> if ( ($errCode = mysql_errno($res))==0 ) {

Warning: mysql_errno(): supplied resource is not a valid MySQL-Link resource

Samme fejl, hvad enten query fejler eller ej

Det virker ikke - jeg kan se i referencen, at koden er korrekt, men det er
jo netop mit problem, at nok kan man læse syntaksen, men ikke samspillet med
andre kommandoer, der sikkert er væsentlig at forstå.

Men den foreslåede kode fejler altså.

Det ender jo nok med en tabel med de korrekte kolonnenavne, men det er for
mig at se en halv løsning, der skal administreres, frem for en foretrukket
automatisk vedligeholdelse - hvis kolonnen ikke findes, så ignorer eller
opret den.

--
Med venlig hilsen Poul Erik Jensen
www.genealog.dk www.skolekammeraten.dk
Subj. må tilføjes [1234] ved direkte svar




Per Thomsen (09-06-2005)
Kommentar
Fra : Per Thomsen


Dato : 09-06-05 20:51

Poul Erik Jensen wrote:
> "Per Thomsen" <pert@pert.dk> skrev i en meddelelse
> news:42a8307c$0$18641$14726298@news.sunsite.dk...
>
>
>>$res = mysql_query(...));
>>if ( ($errCode = mysql_errno($res))==0 ) {
>
>
> Warning: mysql_errno(): supplied resource is not a valid MySQL-Link resource
>
> Samme fejl, hvad enten query fejler eller ej

Det var vist mig, der var lidt for hurtig, da jeg indtastede de linjer.
Man skal ikke give 'result resourcen' med som parameter, men derimod
'link resourcen' (det er den der bliver returneret fra mysql_connect().

Det er vist meget normalt, at man slet ikke angiver den, så vil den
sidste åbnede link resource blive anvendt.

Så måske noget i denne stil:

if( $link = mysql_connect($host, $user, $password) ) {
if( mysql_select_db($database, $link) ) {
if( $res = mysql_query($sql, $link) ) {
//kolonnen findes
if( ($numRows = mysql_num_rows($res))>0 ) {
// Der blev fundet $numRows rækker
} else {
// ingen rækker fundet
}
} else {
if( ($errCode = mysql_errno($link))!=0 ) {
if( $errCode==1054 ) ) {
// kolonnen findes ikke
} else {
// noget andet gik galt.
}
}
}
}
}

Man kan godt så godt undvære at give $link parameteren med, så er jo
bare fjerne den alle steder, hvor den er anvendt i ovenstående.

Hvis du stadig ikke kan få det til at virke så bliver du nok nødt til at
vise os den kildekode der fejler.

Men...

Forestil dig to tabeller:
Tabel 1: GodkendtVaerdi ( name )
Tabel 2: Vaerdi ( id, name, value )

Så kan du f.eks. lave:
SELECT value FROM Vaerdi, GodkendtVaerdi WHERE
Vaerdi.name=GodkendtVaerdi.name AND Vaerdi.name=$name AND id=$id;

Synes du virkelig det er mere besværligt end fejlhåndteringsteknikken?

Jeg er næsten sikker på at de i dk.edb.database, gerne vil hjælpe dig
med at få designet en database, der kan håndtere den situation, du
tilsyneladende mener opstår.



>
> Det virker ikke - jeg kan se i referencen, at koden er korrekt, men det er
> jo netop mit problem, at nok kan man læse syntaksen, men ikke samspillet med
> andre kommandoer, der sikkert er væsentlig at forstå.

Tjah... koden var jo så ikke helt korrekt, det gør nok ikke lettere. :)


>
> Men den foreslåede kode fejler altså.
>
> Det ender jo nok med en tabel med de korrekte kolonnenavne, men det er for
> mig at se en halv løsning, der skal administreres, frem for en foretrukket
> automatisk vedligeholdelse - hvis kolonnen ikke findes, så ignorer eller
> opret den.
>

I mit ovenstående eksempel kan man jo så slette, tilføje og ændre
rækkerne i GodkendtVaerdi tabellen.

Mit eksempel er naturligvis et meget søgt eksempel, men da jeg jo ikke
egentlig ved, hvad det er du prøver at opnå, må det være sådan :).

Jeg er ikke nogen ekspert ud i databaser, men på mit indre 'db design
board' lyser alle lamper rødt. Jeg synes du skulle slå en smut forbi
dk.edb.database, og høre deres mening, om din metode. De er sikkert
meget bedre (end ihvertfald jeg) til at forklare, hvorfor det ikke er en
god ide, og hvad man i stedet kan gøre.

MVH Per Thomsen,
http://www.pert.dk/




Poul Erik Jensen (10-06-2005)
Kommentar
Fra : Poul Erik Jensen


Dato : 10-06-05 00:40

"Per Thomsen" <pert@pert.dk> skrev i en meddelelse
news:42a89daf$0$18650$14726298@news.sunsite.dk...

> Mit eksempel er naturligvis et meget søgt eksempel, men da jeg jo ikke
> egentlig ved, hvad det er du prøver
> at opnå, må det være sådan :).

Fint nok - det giver stof til eksperimentering.

Jeg er vendt tilbage til noget der virker )
Det er godt nok mere besværligt og giver fejl, når der ikke er nogen tabel
til værdien - hvilket ikke har den store betydning, hvor den er udeladt.

Tak for dine desiner og for seriøs snak, der har givet mig noget at tænke
over og sat ting på plads, det ellers kan være vanskeligt at opnå forståelse
af. Nu kan jeg godt forstå din argumentation mod min metodik - men man skal
jo som bekendt kravle før man går )

--
Med venlig hilsen Poul Erik Jensen
www.genealog.dk www.skolekammeraten.dk
Subj. må tilføjes [1234] ved direkte svar



Poul Erik Jensen (13-06-2005)
Kommentar
Fra : Poul Erik Jensen


Dato : 13-06-05 14:00

"Per Thomsen" <pert@pert.dk> skrev i en meddelelse
news:42a89daf$0$18650$14726298@news.sunsite.dk...
> Så måske noget i denne stil:
>

Løsningen blev denne:

$res = mysql_query("SELECT $foo FROM db WHERE id='$s_id'");

if(!$res)
{
// Kolonnen $foo fandtes ikke, men oprettes
mysql_query("ALTER TABLE db ADD $foo SMALLINT NOT NULL");

}else{

//Kolonnen $foo fandtes
while($r = mysql_fetch_array($res))
{
$temp = $r["$foo"];
....
mysql_query("UPDATE db SET $foo='$temp' WHERE id='$s_id'");
}

}

Måske ikke lige efter bogen - men den har jeg jo heller ikke læst ))
--
Med venlig hilsen Poul Erik Jensen
www.genealog.dk www.skolekammeraten.dk
Subj. må tilføjes [1234] ved direkte svar



Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408527
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste