TheFireBat Posted July 30, 2015 Share Posted July 30, 2015 I'm struggling to get PHP to write sessions to a database. My issue is that when I override the session handler and proceed to call session_start() I get an error message telling me that the headers were already sent. I've been reading for days with no results. Common issues that pop up are the BOM and whitespace. I used vi to double check if I have a BOM, which I don't. As for whitespace, I don't see any in my code. However, for testing purposes I removed all blank lines and all tabs. I'll add formatting back in once I solve the issue, but for now, I removed it all. I don't think whitespace is my issue. The other reason I don't think whitespace is my issue is reading the error message from phpdbg. [PHP Warning: session_start(): Cannot send session cookie - headers already sent in /usr/local/apache2/htdocs/index.php on line 43] [PHP Stack trace:] [PHP 1. {main}() /usr/local/apache2/htdocs/index.php:0] [PHP 2. session_start() /usr/local/apache2/htdocs/index.php:43] [PHP Warning: session_start(): Cannot send session cache limiter - headers already sent in /usr/local/apache2/htdocs/index.php on line 43] [PHP Stack trace:] [PHP 1. {main}() /usr/local/apache2/htdocs/index.php:0] [PHP 2. session_start() /usr/local/apache2/htdocs/index.php:43] If I turn on verbose mode in phpdbg the line before the error is: [L4 0xb73454f4 ZEND_RETURN C0 <unused> <unused> /usr/local/apache2/htdocs/index.php] Based on the code I provide below, line 4 is in the open function and is the return value. Line 43 is session_start(). This is where I'm confused. The error message is telling me calling session_start assigns the header and the open function is also trying to assign a header? From what I understand, the session handler's first call is to the open function. Open is being called, I just don't get why both open and session_start are trying to send headers separately. I don't see any whitespace, there is no BOM. I must be doing something wrong with the session handler? <?php $db = pg_connect ( "host='' port='' dbname = '' user='' password=''" ); function open() { return true; } function close() { return true; } function read($id) { $stmt = 'SELECT data FROM sessions WHERE id = \'' . $id . '\''; $result = pg_query($stmt); $numrows = pg_num_rows($result); if( $numrows > 0 ) { $row = pg_fetch_array($result, 0, PGSQL_ASSOC); return $row['data']; } else return ''; } function write($id, $data) { $access = time(); $stmt = 'REPLACE INTO sessions VALUES (\'' . $id . '\', ' . $access . ',\'' . $data . '\')'; $result = pg_query($stmt); if( $result) return true; return false; } function destroy($id) { $stmt = 'DELETE FROM sessions WHERE id = \'' . $id . '\''; $result = pg_query($stmt); if( $result ) return true; return false; } function gc($max) { $old = time() - $max; $stmt = 'DELETE * FROM sessions WHERE access < ' . $old; $result = pg_query($stmt); if( $result ) return true; return false; } session_set_save_handler("open", "close", "read", "write", "destroy", "gc"); session_start(); ?> Note, I'm also attaching the file with the code as well. index.php Link to comment https://forums.phpfreaks.com/topic/297553-php-session-writing-to-database/ Share on other sites More sharing options...
TheFireBat Posted July 30, 2015 Author Share Posted July 30, 2015 1) REPLACE INTO is not PostgreSQL compatible. I modified the code to instead use: $stmt = 'SELECT data FROM sessions WHERE id = \'' . $id . '\''; $result = pg_query($stmt); $numrows = pg_num_rows($result); if( $numrows > 0 ) { $stmt = 'UPDATE sessions SET (id, access, data) = (\'' . $id . '\', ' . $access . ',\'' . $data . '\')'; } else { $stmt = 'INSERT INTO sessions (id, access, data) VALUES (\'' . $id . '\', ' . $access . ',\'' . $data . '\')'; } 2) My session now works in Firefox, but phpdbg still complains about the headers. I never tried it in browser because I was focused on getting rid of errors in phpdbg before hand. I verified it's working by going into the database and seeing the test session variable I added increment as I refresh. 3) This now begs the question, what is phpdbg doing? Why is phpdbg sending headers where my browsers, both Chrome and Firefox, do not? Can I fix/configure phpdbg to work properly? Here is how I am running phpdbg. cd /usr/local/apache2/htdocs phpdbg phpdbg> exec index.php phpdbg> run I imaigne there is an issue with how I am running phpdbg? Link to comment https://forums.phpfreaks.com/topic/297553-php-session-writing-to-database/#findComment-1517764 Share on other sites More sharing options...
mac_gyver Posted July 30, 2015 Share Posted July 30, 2015 yes, your errors are due to the debugger. php code debuggers generally work by adding a layer of output buffing to send the debugging information to their client module. you should generally only use a debugger to debug why your code isn't doing what you expect (that's why they are called debuggers), not as the primary method of running your code. Link to comment https://forums.phpfreaks.com/topic/297553-php-session-writing-to-database/#findComment-1517768 Share on other sites More sharing options...
TheFireBat Posted July 30, 2015 Author Share Posted July 30, 2015 I started in the browser but moved to using phpdbg once I started having errors show up. Once I was in phpdbg I didn't plan to move out until I removed all errors. So I started with quite a few errors and had dwinled it down to just the remaining errors with the headers. Not knowing any better, I should have gone back to the browser once I was down to just the headers. I will definitely know better for next time. I am new to PHP and didn't know that the debugger was adding an extra layer and modifying/sending headers. Thank you for clearing that up. Link to comment https://forums.phpfreaks.com/topic/297553-php-session-writing-to-database/#findComment-1517770 Share on other sites More sharing options...
singhRahul34 Posted August 5, 2015 Share Posted August 5, 2015 hello sir, actually i have started session in a page and i want to know if i login from index.php it take me to home.php(where i have started a session ) if i give a url index.php it redirects me to that page but i want to use session which doesnot redirect me to that page unless until i dont logout from that page try to help me please Link to comment https://forums.phpfreaks.com/topic/297553-php-session-writing-to-database/#findComment-1518051 Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.