/ 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
MySQL - Findes brugeren?
Fra : Jimmy


Dato : 14-04-03 21:04

Hej

Jeg har en simpel funktion, hvis eneste formål er at returnere 1, hvis en
bruger findes, og 0, hvis ikke.

Jeg er ny i PHP og søger derfor hjælp til at forsimple og PHP-agtiggøre
funktionen:


-----
function user_exists($Bruger)
{
$sql_user_exists = "SELECT ID FROM users WHERE User = '$Bruger' LIMIT
1";

$data_user_exists = mysql_query($sql_user_exists) or die(mysql_error() .
"ERROR: $sql_user_exists<br>");
$arr_user_exists = mysql_fetch_array($data_user_exists, MYSQL_ASSOC);

if (is_array($arr_user_exists))
{
return 1;
}
else
{
return 0;
}
}
-----


Jeg er med på at ovenstående er håbløst

Kan man i øvrigt ikke returnere a la formen:

return (defined(is_array($arr_user_exists))) ? 1 : 0;


Mvh
Jimmy



 
 
Jonas Koch Bentzen (14-04-2003)
Kommentar
Fra : Jonas Koch Bentzen


Dato : 14-04-03 22:01

Jimmy wrote:
>
> function user_exists($Bruger)

Hvorfor blande dansk og engelsk?

> $data_user_exists = mysql_query($sql_user_exists) or die(mysql_error() .

die(mysql_error()) er ikke bare verdens mest brugte fejlhåndtering, det
er også den dårligste. Så er det sagt :) Spørg, hvis du vil have argumenter.

Her er mit forslag til funktionen. Den bruger PEAR DB
(http://pear.php.net/manual/en/core.db.php):

function brugerFindes($bruger) {
   global $db;

   return ($db->getOne('SELECT id FROM brugere WHERE bruger =
'.$db->quote($bruger)));
}

Funktionen returner TRUE eller FALSE. Jeg går i eksemplet ud fra, at
ID'et vil være højere end 1, fordi ID-nummering i databaser normalt
starter med 1. Hvis der er risiko for, at ID-nummeret kan være 0 (og
funktionen derfor returnerer falsk, selv om brugeren findes), skal
funktionen ændres en smule.


Leonard (15-04-2003)
Kommentar
Fra : Leonard


Dato : 15-04-03 10:37

Jonas Koch Bentzen <ingen.email@eksempel.dk> wrote:

>die(mysql_error()) er ikke bare verdens mest brugte fejlhåndtering, det
>er også den dårligste. Så er det sagt :) Spørg, hvis du vil have argumenter.

Det vil jeg gerne, og så formoder jeg du samtidig giver et forslag til
en bedre.
--
med venlig hilsen
Leonard - http://leonard.dk/

Jonas Koch Bentzen (15-04-2003)
Kommentar
Fra : Jonas Koch Bentzen


Dato : 15-04-03 12:40

Leonard wrote:
> Jonas Koch Bentzen <ingen.email@eksempel.dk> wrote:
>
>>die(mysql_error()) er ikke bare verdens mest brugte fejlhåndtering, det
>>er også den dårligste. Så er det sagt :) Spørg, hvis du vil have argumenter.
>
> Det vil jeg gerne

1. Fejlmeddelelsen vil i bedste fald være uforståelig for brugeren. I
værste fald vil den give oplysninger om databasen, som kan hjælpe en
hacker med at lave sjove ting. En kombination af manglende citering af
GET-variabler og det, at en person kender tabel- og feltnavnene, kan
være meget farlig.

2. Fejlmeddelelsen kan være skjult. Det vil f.eks. ske i følgende eksempel:

<select name='noget'>
   <?php
   $resultat = mysql_query('SELCT id, navn FRM tabel') or die(mysql_error());
   while ($raekke = mysql_fetch_object($resultat)) {
      echo "<option value='$raekke->id'>$raekke->navn</option>";
   }
   ?>
</select>

Her vil fejlmeddelelsen komme ind mellem <select> og </select>, hvilket
betyder, at den i mange browsere ikke vil blive vist.

3. Generelt er det et problem, at scriptet uden videre dør midt i en
HTML-side. Udover, at det giver ugyldig kode, kan det også have en eller
flere af følgende virkninger:
   I. Fejlmeddelelsen bliver vist langt nede på en side, så brugeren ikke
ser den.
   II. Fejlmeddelelsen bliver skjult helt som en følge af, at den opstår
et uheldigt sted i HTML-koden.

4. Administratoren/programmøren får ikke besked om fejlen.

Ikke kun i HTML-sammenhæng, men også i GUI-programmering er det helt
ubrugeligt bare at lade scriptet stoppe og spytte en fejlmeddelelse ud.
I HTML-sammenhæng bør man danne en ny side, som kommer med en
fejlmeddelelse. I GUI-programmering (okay, HTML er også en GUI, men jeg
hentyder her til Gtk+ og lignende) bør man f.eks. lave en pop-up-boks
(alert-lignende ting), der fortæller om fejlen.

Og hvordan kommer man så med en helt ny side til fejlen, hvis man
allerede er nået langt ned i scriptet og HTML'en? Man bruger output
buffering-funktionerne. På toppen af siden kalder man ob_start(). Hvis
der opstår en fejl, fjerner man alt det, der hidtil er opsamlet i
output-bufferen, og begynder forfra: Udskriver sidehovedet (det har man
selvfølgelig en funktion til), udskriver en fejlmeddelelse og udskriver
sidefoden.

Her er en forenklet udgave af noget, jeg har brugt på et af mine sites:

<?php
// Fortæller PHP, at alle fejl skal håndteres
// af vores egen funktion, der hedder "error()":
set_error_handler("error");
ob_start();

function error($type, $message, $file, $lineNumber) {
   ob_end_clean();
   ob_start();

   // Sidehovedet:
   echo head();

   echo "Der er opstået en fejl:<br/>\n";

   // Skriver fejlmeddelelsen ned i en fejllog:
   $message = date("Y-m-d H:i")." | ".basename($file).":$lineNumber |
$message";
   error_log("$message\n", 3, ERRORLOG);

   echo "Fejlen er nedskrevet i fejlloggen og bliver rettet hurtigst
muligt.\n";

   // Sidefoden - og farvel...
   exit(foot());
}

> og så formoder jeg du samtidig giver et forslag til
> en bedre.

Det har jeg gjort en del gange i denne gruppe, så derfor ville jeg ikke
gentage mig selv.

http://groups.google.com/groups?q=error+group:dk.edb.internet.webdesign.serverside.php+author:jonas+koch+bentzen&hl=da&lr=&ie=UTF-8&oe=UTF-8&selm=adi7eq%241fp%241%40sunsite.dk&rnum=8

http://www.evolt.org/article/Abstract_PHP_s_database_code_with_PEAR_DB/17/21927/index.html#comment32658

--
Jonas Koch Bentzen

http://findhim.com/


Leonard (15-04-2003)
Kommentar
Fra : Leonard


Dato : 15-04-03 20:53

Jonas Koch Bentzen <ingen.email@eksempel.dk> wrote:

>Det har jeg gjort en del gange i denne gruppe, så derfor ville jeg ikke
>gentage mig selv.

Og det burde heller ikke være nødvendigt, og tak for at du alligevel
prøver igen.

Jeg har nu forsøgt at bruge error_handler men der sker ingenting på
denne:
http://leonard.dk/test/error.php
koden kan ses på
http://leonard.dk/test/error.phps

med indsat or die(mysql_error()) for jeg fejlen frem:
http://leonard.dk/test/error-die.php
koden kan ses på
http://leonard.dk/test/error-die.phps

--
med venlig hilsen
Leonard - http://leonard.dk/

Jonas Koch Bentzen (15-04-2003)
Kommentar
Fra : Jonas Koch Bentzen


Dato : 15-04-03 21:11

Leonard wrote:
>
> Jeg har nu forsøgt at bruge error_handler men der sker ingenting på
> denne:
> http://leonard.dk/test/error.php
> koden kan ses på
> http://leonard.dk/test/error.phps

Du har så vidt jeg kan angivet, at ingen fejl skal meldes:

error_reporting(0);

Enten skal du helt fjerne linjen eller også skal du ændre værdien til
noget andet end 0.

Som standard (altså, hvis man bruger set_error_handler(), men ikke
angiver error_reporting()) vil alle fejl undtagen syntaksfejl (parse
errors) blive håndteret af set_error_handler(). Det giver et par
overraskelser for mange programmører, for lige pludselig får man også
E_NOTICE'r at se (det gør man ikke som standard, altså når man ikke
bruger set_error_handler()). En E_NOTICE-fejl forekommer f.eks., hvis
man bruger en variabel, der ikke er sat, eller bruger en arraynøgle, der
ikke er defineret. Altså skal man til at bruge isset(), empty() og den
slags i stor stil. Det er irriterende i starten, men når man vænnet sig
til det, indser man, at det er guld værd. I øvrigt er det også sådan,
stort set alle andre sprog fungerer: I dem kan man heller ikke undersøge
indholdet af variabler, der ikke er sat.

Der er selvfølgelig også den hurtige, hack-agtige løsning, der er at
undlade at vise E_NOTICE-fejl:

function fejl($type, $besked) {
   if ($type == E_NOTICE) return;

   echo "Fejl: $besked";
}


Leonard (15-04-2003)
Kommentar
Fra : Leonard


Dato : 15-04-03 21:21

Jonas Koch Bentzen <ingen.email@eksempel.dk> wrote:

>Du har så vidt jeg kan angivet, at ingen fejl skal meldes:
>
>error_reporting(0);

Den tog jeg med fordi den er i eksemplet på php.net.
Nu har jeg udkommenteret den, men det gør ingen forskel.
--
med venlig hilsen
Leonard - http://leonard.dk/

Jonas Koch Bentzen (15-04-2003)
Kommentar
Fra : Jonas Koch Bentzen


Dato : 15-04-03 21:32

Leonard wrote:
> Jonas Koch Bentzen <ingen.email@eksempel.dk> wrote:
>
>
>>Du har så vidt jeg kan angivet, at ingen fejl skal meldes:
>>
>>error_reporting(0);
>
>
> Den tog jeg med fordi den er i eksemplet på php.net.
> Nu har jeg udkommenteret den, men det gør ingen forskel.

Så skyldes problemet, at mysql_query() ikke selv udsender en advarsel,
når noget går galt. Det løses sådan her:

mysql_query('...') or trigger_error(mysql_error())

Det ligner meget "or die(mysql_error())"-metoden, men forskellen er, at
man med kombinationen af trigger_error() og sin egen fejlfunktion har
mulighed for at danne en ordentlig fejlside, hvor fejlmeddelelsen ikke
er gemt inde i <select></select>, <script></script> eller lignende. Man
kan også vælge at bruge error_log() inde i fejlfunktionen til at få
tilsendt en mail eller få skrevet fejlmeddelelsen ned i en logfil. Alt
det er ikke rigtig muligt med "or die(mysql_error))".


Leonard (15-04-2003)
Kommentar
Fra : Leonard


Dato : 15-04-03 21:44

Jonas Koch Bentzen <ingen.email@eksempel.dk> wrote:

>mysql_query('...') or trigger_error(mysql_error())
og så virker det.

error_reporting(0);
må gerne være der, mon ikke 0 er det samme som at alt skal reportes?

--
med venlig hilsen
Leonard - http://leonard.dk/

Jonas Koch Bentzen (15-04-2003)
Kommentar
Fra : Jonas Koch Bentzen


Dato : 15-04-03 21:51

Leonard wrote:
>
> error_reporting(0);
> må gerne være der, mon ikke 0 er det samme som at alt skal reportes?

Hmmm... Det kan egentlig godt være. Men i så fald er det vist
overflødigt, for bruger man set_error_handler() overføres *alle* fejl
(undtagen syntaksfejl og fatale fejl) til ens fejlhåndteringsfunktion. I
den funktion kan man så evt. lave noget switch på fejltypen a la:

switch ($type) {
   case E_NOTICE:
      $besked = "Blot en petitesse";
      break;
   case E_WARNING:
      $besked = "Nu er du advaret!";
      break;
   case E_ERROR:
      $besked = "Den er helt gal!";
      break;
}

echo $besked;


Thomas Lindgaard (16-04-2003)
Kommentar
Fra : Thomas Lindgaard


Dato : 16-04-03 09:58

Leonard <dette.er.ikke.en.mail@der.virker.invalid> wrote in
news:nmro9v0g4j7muiut09tolc6q7t9s91bv0o@4ax.com:

> error_reporting(0);
> m† gerne v‘re der, mon ikke 0 er det samme som at alt skal reportes?
>

Brug hellere de definerede konstanter - de er både nemmere at læse og så er
man sikker på at det også virker i fremtidige versioner af PHP.

http://www.php.net/manual/en/function.error-reporting.php (tabel 1)

--
Hyggehej
/Thomas

Søg
Reklame
Statistik
Spørgsmål : 177559
Tips : 31968
Nyheder : 719565
Indlæg : 6408937
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste