|
| 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
>
| |
|
|