Avatar billede denser80 Nybegynder
19. april 2007 - 16:08 Der er 9 kommentarer

mysql sessions

hey. jeg har et lille script til at bruge mysql som session lager, fra "php-security-2005", og scriptet ser ud som følger:
(paster det fulde script hvis der er brug for rettelser flere steder end det sted spørgsmålet hér handler om)
<?PHP
1 session_set_save_handler('_open',
2                                    '_close',
3                                    '_read',
4                                    '_write',
5                                    '_destroy',
6                                    '_clean');
7    function _open()
8    {
9        global $_sess_db;
10      $db_user = $_SERVER['DB_USER'];
11      $db_pass = $_SERVER['DB_PASS'];
12      $db_host = 'localhost';
13          if ($_sess_db = mysql_connect($db_host, $db_user, 14$db_pass))
15            {
16                return mysql_select_db('sessions', $_sess_db);
17            }
18        return FALSE;
19    }
20    function _close()
21    {
22        global $_sess_db;
23        return mysql_close($_sess_db);
24    }
25    function _read($id)
26    {
27        global $_sess_db;
28        $id = mysql_real_escape_string($id);
29        $sql = "SELECT data
30        FROM sessions
31        WHERE id = '$id'";
32          if ($result = mysql_query($sql, $_sess_db))
33          {
34              if (mysql_num_rows($result))
35                {
36                    $record = mysql_fetch_assoc($result);
37                    return $record['data'];
38                }
39            }
40        return '';
41    }
42    function _write($id, $data)
43    {
44        global $_sess_db;
45        $access = time();
46        $id = mysql_real_escape_string($id);
47        $access = mysql_real_escape_string($access);
48        $data = mysql_real_escape_string($data);
49        $sql = "REPLACE
50        INTO sessions
51        VALUES ('$id', '$access', '$data')";
52        return mysql_query($sql, $_sess_db);
53    }
54    function _destroy($id)
55    {
56        global $_sess_db;
57        $id = mysql_real_escape_string($id);
58        $sql = "DELETE
59        FROM sessions
60        WHERE id = '$id'";
61        return mysql_query($sql, $_sess_db);
62    }
63    function _clean($max)
64    {
65        global $_sess_db;
66        $old = time() - $max;
67        $old = mysql_real_escape_string($old);
68        $sql = "DELETE
69        FROM sessions
70        WHERE access < '$old'";
71        return mysql_query($sql, $_sess_db);
72    }
73?>
men scriptet som det er skrevet i guiden, og ctrl-c/v'et, giver følgende fejlmeddelelse: "Warning: mysql_close(): supplied argument is not a valid MySQL-Link resource in o:\public\www\system\scripts\db_sessions.php on line 23" .... warum??
Avatar billede dkfire Nybegynder
20. april 2007 - 16:57 #1
Er du sikker på du får forbindelse til mysql når du konnekter.
Din fejl kan skyldes at den ikke får forbindelse til mysql, derved bliver $_sess_db ikke til en mysql-link.
Avatar billede denser80 Nybegynder
20. april 2007 - 19:38 #2
Det kan sagtens tænkes at være dér den ligger. Hvis scriptet som det er dér burde virke, og det burde trods alt, kilden taget i betragtning ;)
Tænkte det kunne være en syntaks der var ændret siden dokumentets undfangelse, men jeg kører ikke med nyeste php/mysql, så 2005 er jo ikke uddateret i dén henseende.
Avatar billede johan.o Nybegynder
20. april 2007 - 23:56 #3
Ved ikke om årsagen er i denne linje..

13          if ($_sess_db = mysql_connect($db_host, $db_user, 14$db_pass))

..mon ikke det skal være..

13          if ($_sess_db = mysql_connect($db_host, $db_user, $db_pass))

..Men jeg ved ikke lige hvorfor linje nummeret for linje 14 står der ?

Mvh. Johan
Avatar billede johan.o Nybegynder
20. april 2007 - 23:57 #4
arhh..mon ikke det er noget du har lavet af hensyn til billedet :)..sorry :)

Mvh. Johan
Avatar billede dkfire Nybegynder
21. april 2007 - 10:55 #5
Hvis jeg var dig ville jeg lige lave et echo når du prøve at oprette en for bindelse til mysql, så kan du se om det lykkes eller om den fejler.

Nu ved jeg ikke lige hvilken version af php du kører, men hvorfor laver du ikke en class istedet, så kan du samle alle dine funktioner der. Så slipper du for global.
Avatar billede denser80 Nybegynder
21. april 2007 - 23:41 #6
Jeg HAR prøvet at indsætte nogen ECHO's for at se hvad og hvor meget der sker hvornår, som følger:
13          if ($_sess_db = mysql_connect($db_host, $db_user, 14$db_pass))
15            {
16                echo "fejl1"; return mysql_select_db('sessions', $_sess_db);
17            }
18        echo "fejl2"; return FALSE;
19    }

Jeg har oprettet en database der hedder 'sessions', og fyldt med den SQL kommando der nævnes i dokumentet:
"CREATE TABLE sessions
(
id varchar(32) NOT NULL,
access int(10) unsigned,
data text,
PRIMARY KEY (id)
);"
Jeg ændrede også henvisngerne til brugernavn/psw til at være direkte oprettelse af variabel/værdi istedet for henvisning til en konstant med data'ene i, men det er samme fejlmeddelelse der kommer ud af det :(
Min php,MySQL og Apache version de der fulgte med "EasyPHP 1.7", som nu er i en 1.8 der benytter "Apache 2.2.3 - PHP 5.2.0 - MySQL 5.0.27 - PHPMyAdmin 2.9.1.1 - SQLiteManager 1.2.0" (fra hjemmesiden, easyphp.org).
Og valget af metode er fordi det er den metode jeg lige havde ved hånden til ctrl-c/v fra dokumentet.
Ku godt være jeg skulle køre version 1.8 af EasyPHP med nyere versioner af alle elementer og se hvad phpsec har at foreslå om dét
Avatar billede johan.o Nybegynder
22. april 2007 - 00:28 #7
Denne test..

if ($_sess_db = mysql_connect($db_host, $db_user, $db_pass))

vil vel returnere true uanset om mysql_connect var en succes eller ej....

Hvad får du ud af disse linjer...

$_sess_db = mysql_connect($db_host, $db_user, $db_pass);
if($_sess_db===false) {
echo "No connection !"; }
else {
echo "God fin forbindelse."; }

Mvh. Johan
Avatar billede johan.o Nybegynder
22. april 2007 - 00:39 #8
Nej nej nej...nu tror jeg hellere jeg må blande mig uden om denne tråd :)..tsk tsk..sorry guys, ikke særligt overbevisende..he he...:)

Mvh. Johan
Avatar billede johan.o Nybegynder
22. april 2007 - 12:27 #9
He he..jeg vover skindet på næsen og 'blander' mig igen :)

Mangler du ikke en session_start(); ?

Hvis du smider denne ind til sidst f.eks. får du da fejl ?

Mvh. Johan
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