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

Kodeord


Reklame
Top 10 brugere
Perl
#NavnPoint
bjarneA 141
poul_from 50
soccer 30
Nicknack 14
Tmpj 0
Problemer med Perl5 og MySQL på Linux
Fra : Thomas Skyt


Dato : 14-07-02 01:37

Hej,

jeg har et lille problem med et script jeg sidder og bakser med - koden
er her:

**************** Kode start ********************

$username = $incgi->param("username");
$password = $incgi->param("password");

$authhost = $ENV{REMOTE_ADDR};
$sessionvalue = time;

# Forbered forbindelsen til serveren

$logindb = DBI->connect('dbi:mysql:sofagang:localhost','BRUGER','KODEORD')
   || die("Error: $DBI::errstr");
$sessiondb = DBI->connect('dbi:mysql:sofagang:localhost','BRUGER','KODEORD')
   || die("Error: $DBI::errstr");

# Select query'en

$loginqry = "select * from auth where username = \"$username\"";

# Forbered query'en

$query = $logindb->prepare($loginqry);

# Udfør query'en

$result = $query->execute();

while(@line = $query->fetchrow_array) {
   $authusername = $line[1]; # username
   $authpassword = $line[2]; # password
   $authgrants = $line[3]; # grants
   $authfullname = $line[4]; # full name
   $authmail = $line[5]; # e-mail address
}

$result = $logindb->disconnect;

    # Slet eksisterende logins fra denne bruger

    $sessqry = "delete from session where user = \"$authusername\"";
    $query = $sessiondb->prepare($sessqry);
    $result = $query->execute();
    $result = $query->finish();

    # Forbered session query

    $sessqry = "insert into
session(invoked,user,host,unixtime)
values(NOW(''), ?, ?, ?)";

    $query = $sessiondb->prepare($sessqry);

    # Udfør query'en

    $result = $query->execute($authusername, $authhost, $sessionvalue);

    $result = $query->finish();
    $result = $sessiondb->disconnect;

**************** Kode slut ********************

Den nederste del med insert'en går uden problemer men den øverste med
delete'en vil bare absolut ikke, selvom den virker fra en kommandoprompt
ind på mysql.

Er der nogen der har en idé?

/Thomas Skyt

 
 
Kim Hansen (14-07-2002)
Kommentar
Fra : Kim Hansen


Dato : 14-07-02 09:46

Thomas Skyt <thomas@sofagang.dk> writes:

> $loginqry = "select * from auth where username = \"$username\"";
> $query = $logindb->prepare($loginqry);
> $result = $query->execute();

Generelt ville jeg rette alle anvendelser af variable i queries til:

$loginqry = "select * from auth where username = ?";
$query = $logindb->prepare($loginqry) or die;
$result = $query->execute($username) or die;

Så kommer man aldrig til at få problemer med at man skal quote " og
evt. andre tegn.

'or die' tricket vil fortælle dig præcist hvor din fejl er, det udtryk
bør du sætte ind efter stort set hver DBI funktioner.

--
Kim Hansen | |\ _,,,---,,_ | Det er ikke
Dalslandsgade 8, A708 | /,`.-'`' -. ;-;;,_ | Jeopardy.
2300 København S | |,4- ) )-,_. ,\ ( `'-' | Svar _efter_
Phone: 32 88 60 86 | '---''(_/--' `-'\_) | spørgsmålet.

Thorbjoern Ravn Ande~ (14-07-2002)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 14-07-02 10:49

Kim Hansen <k@oek.dk> writes:

> 'or die' tricket vil fortælle dig præcist hvor din fejl er, det udtryk
> bør du sætte ind efter stort set hver DBI funktioner.

or die "$?" (er det vist)

vil også fortælle dig HVAD fejlen er.
--
Thorbjørn Ravn Andersen
http://homepage.mac.com/ravn

Kim Hansen (14-07-2002)
Kommentar
Fra : Kim Hansen


Dato : 14-07-02 11:39

Thorbjoern Ravn Andersen <thunderbear@bigfoot.com> writes:

> Kim Hansen <k@oek.dk> writes:
>
> > 'or die' tricket vil fortælle dig præcist hvor din fejl er, det udtryk
> > bør du sætte ind efter stort set hver DBI funktioner.
>
> or die "$?" (er det vist)
>
> vil også fortælle dig HVAD fejlen er.

Ikke med DBI, der vil:
or die $dbh->errstr;
eller, afhængigt af hvilke udtryk det følger,
or die $DBI::errstr;
være bedre.

'or die' giver et linjenummer, det er som regel nok. Hvis det ikke er
nok må man slå op hvad den korrekte måde ville være for at få en bedre
fejlbesked.

--
Kim Hansen | |\ _,,,---,,_ | Det er ikke
Dalslandsgade 8, A708 | /,`.-'`' -. ;-;;,_ | Jeopardy.
2300 København S | |,4- ) )-,_. ,\ ( `'-' | Svar _efter_
Phone: 32 88 60 86 | '---''(_/--' `-'\_) | spørgsmålet.

Thomas Skyt (14-07-2002)
Kommentar
Fra : Thomas Skyt


Dato : 14-07-02 13:42

On Sun, 14 Jul 2002 10:46:20 +0200, Kim Hansen wrote:

> Generelt ville jeg rette alle anvendelser af variable i queries til:
>
> $loginqry = "select * from auth where username = ?"; $query =
> $logindb->prepare($loginqry) or die; $result =
> $query->execute($username) or die;
>
> Så kommer man aldrig til at få problemer med at man skal quote " og evt.
> andre tegn.

Det hjalp!

Nu stoppede den ved prepare og gav besked på fejlen - en stjerne ... man
kan ikke "delete * from session", kun "delete from session"

> 'or die' tricket vil fortælle dig præcist hvor din fejl er, det udtryk
> bør du sætte ind efter stort set hver DBI funktioner.

Det vidste jeg godt - for fremtiden bør jeg anvende det mere rundhåndet.

/Thomas Skyt

Jesper Krogh Christe~ (16-07-2002)
Kommentar
Fra : Jesper Krogh Christe~


Dato : 16-07-02 07:49



Stefan Hanski (16-07-2002)
Kommentar
Fra : Stefan Hanski


Dato : 16-07-02 20:45

Hej,

1) Begynd altid din kode med:

#!/usr/bin/perl -w
use strict;

Det ville have fanget din fejl, nemlig at $username er undef i din select
statement.

mvh
Stefan



"Thomas Skyt" <thomas@sofagang.dk> wrote in message
news:pan.2002.07.14.02.36.33.277574.2766@sofagang.dk...
> Hej,
>
> jeg har et lille problem med et script jeg sidder og bakser med - koden
> er her:
>
> **************** Kode start ********************
>
> $username = $incgi->param("username");
> $password = $incgi->param("password");
>
> $authhost = $ENV{REMOTE_ADDR};
> $sessionvalue = time;
>
> # Forbered forbindelsen til serveren
>
> $logindb = DBI->connect('dbi:mysql:sofagang:localhost','BRUGER','KODEORD')
> || die("Error: $DBI::errstr");
> $sessiondb =
DBI->connect('dbi:mysql:sofagang:localhost','BRUGER','KODEORD')
> || die("Error: $DBI::errstr");
>
> # Select query'en
>
> $loginqry = "select * from auth where username = \"$username\"";
>
> # Forbered query'en
>
> $query = $logindb->prepare($loginqry);
>
> # Udfør query'en
>
> $result = $query->execute();
>
> while(@line = $query->fetchrow_array) {
> $authusername = $line[1]; # username
> $authpassword = $line[2]; # password
> $authgrants = $line[3]; # grants
> $authfullname = $line[4]; # full name
> $authmail = $line[5]; # e-mail address
> }
>
> $result = $logindb->disconnect;
>
> # Slet eksisterende logins fra denne bruger
>
> $sessqry = "delete from session where user = \"$authusername\"";
> $query = $sessiondb->prepare($sessqry);
> $result = $query->execute();
> $result = $query->finish();
>
> # Forbered session query
>
> $sessqry = "insert into
> session(invoked,user,host,unixtime)
> values(NOW(''), ?, ?, ?)";
>
> $query = $sessiondb->prepare($sessqry);
>
> # Udfør query'en
>
> $result = $query->execute($authusername, $authhost, $sessionvalue);
>
> $result = $query->finish();
> $result = $sessiondb->disconnect;
>
> **************** Kode slut ********************
>
> Den nederste del med insert'en går uden problemer men den øverste med
> delete'en vil bare absolut ikke, selvom den virker fra en kommandoprompt
> ind på mysql.
>
> Er der nogen der har en idé?
>
> /Thomas Skyt
>



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

Månedens bedste
Årets bedste
Sidste års bedste