I had the same problem whenever retrieving data from MSSQL using ODBC from a
NULL field.


To "solve" the problem I had to add a character asd default to that field.

I added a dot.

descr nvarchar  default '.'  .

(the sql sintax here is not the correct one.)




----- Original Message -----
From: "Aral Balkan" <[EMAIL PROTECTED]>
To: "Rasmus Lerdorf" <[EMAIL PROTECTED]>
Cc: <[EMAIL PROTECTED]>
Sent: Sunday, July 01, 2001 1:52 AM
Subject: Re: [PHP] emalloc / erealloc problem (was: help with custom session
handler)


> Well finally I am 99.9% sure that the problem is with Metabase. I've
managed
> to bring the code down to the absolute minimum to simplify things and I
can
> now state the bug clearly:
>
> On Pentium III 500Mhz running WinMe, Apache 1.3.19 and PHP 4.0.5, use of
> Metabase calls in custom session handler to update a MySQL database
randomly
> crash Apache with (again, randomly) errors in either PHP4TS.DLL or
> MSVCRT.DLL.
>
> When Apache does not crash, the code does work (I tested this with a
simple
> variable increment).
>
> When the Metabase session handler is replaced with one using MySQL calls,
> the problem goes away.
>
> Entries noticed in Apache's error.log that may be related are:
> FATAL:  emalloc():  Unable to allocate 1701082243 bytes
> FATAL:  erealloc():  Unable to allocate 369098752 bytes
>
> I've already written to Manuel about this and I'm sure he'll have the
> problem figured out in no time but in the meanwhile, I'm posting my code
> here so that this post may benefit others trying to do this in the future
> (and with the hope that maybe someone can discover something that *I'm*
> doing wrong that could be causing all this!)
>
> <?php
> /*
>  metabase sesssions library
>
>  error: makes Apache crash randomly with errors in PHP4TS.DLL and
MSVCRT.DLL
>  running on WinMe with Apache 1.3.19 and PHP 4.0.5
>
>  based on the code of Sterling Hughes (PHP Developer's Cookbook,
>  pgs. 222 - 224) and Ying Zhang (PHPBuilder, "Custom Session
>  Handlers in PHP4,
> http://www.phpbuilder.com/columns/ying20000602.php3?page=1)
>
>  metabase by Manuel Lemos ([EMAIL PROTECTED],
>          http://www.phpclasses.upperdesign.com/)
>
>  copyright (c) 2001, aral balkan ([EMAIL PROTECTED])
>       http://www.aralbalkan.com
> */
>
> // metabase database abstraction layer
> require_once "metabase/metabase_parser.php";
> require_once "metabase/metabase_manager.php";
> require_once "metabase/metabase_database.php";
> require_once "metabase/metabase_interface.php";
>
> $SESS_LIFE = get_cfg_var('session.gc_maxlifetime');
>
> // default life of session to an hour
> if ($SESS_LIFE == '') { $SESS_LIFE = 3600; }
>
> function on_session_start ($save_path, $session_name)
> {
>  global $database;
>
>  /*  db_init.php holds the values for
>   $db_type, $db_user, $db_pass, $db_host
>  */
>  require_once('db_init.php');
>
>  $metabase_init = array(
>  "Type"=>$db_type,
>  "User"=>$db_user,
>  "Password"=>$db_pass,
>  "Host"=>$db_host,
>  "IncludePath"=>"metabase/",
>  "Persistent"=>TRUE
>  );
>
>  $metabase_error = MetabaseSetupDatabase(&$metabase_init, &$database);
>
>  if ($metabase_error != '') {
>   die('Database setup error: '.$metabase_error);
>   return false; // failure
>  }
>
>  // select database
>  $previous_database_name = MetabaseSetDatabase($database, $db_name);
>  return true;
> }
>
> function on_session_end()
> {
>  // Nothing needs to be done in this function
>  // since we used a persistent connection
>  return true;
> }
>
> function on_session_read ($key)
> {
>  global $database;
>
>  $key = MetabaseGetTextFieldValue($database, $key);
>
>  $stmt = "SELECT sessionData FROM sessions";
>  $stmt .= " WHERE sessionID = $key";
>  $stmt .= " AND sessionExpire > ". time();
>
>  if (!($result = MetabaseQuery($database, $stmt))) {
>    // query failed
>    echo '> Main query (sql) failed.'.$e;
>    echo '> Error: '.MetabaseError($database).$e;
>    die();
>  }
>
>  $stmt_rows = MetabaseNumberOfRows($database, $result);
>
>  if ($stmt_rows) {
>   $sessionData = MetabaseFetchResult($database, $result, 0,
'sessionData');;
>   return($sessionData);
>  } else {
>   return false;
>  }
> }
>
> function on_session_write ($key, $val)
> {
>  global $session_db, $SESS_LIFE;
>  global $database;
>
>  // convert the text value to a format suitable for use in current
database
>  $expiry = time() + $SESS_LIFE;
>  $key = MetabaseGetTextFieldValue($database, $key);
>  $val = MetabaseGetTextFieldValue($database, $val);
>
>  $replace_stmt = "REPLACE INTO sessions (sessionID, sessionData,
> sessionExpire)"
>      ." values($key, $val, $expiry)";
>
>  $success = MetabaseQuery($database, $replace_stmt);
>
>  return $success;
> }
>
> function on_session_destroy ($key)
> {
>  global $database;
>
>  $key = MetabaseGetTextFieldValue($database, $key);
>  $stmt = "DELETE FROM sessions WHERE sessionID = $key";
>  $success = MetabaseQuery($database, $stmt);
>  return $success;
> }
>
> function on_session_gc ($max_lifetime)
> {
>  global $database;
>
>  $stmt = "delete from sessions where sessionExpire < " . time();
>  $success = MetabaseQuery($database, $stmt);
>  return $success;
> }
>
> // Set the save handlers
> session_set_save_handler("on_session_start", "on_session_end",
>        "on_session_read", "on_session_write",
>        "on_session_destroy", "on_session_gc");
>
> ?>
>
> Thanks,
> Aral :)
>
> ______________________________
> ([EMAIL PROTECTED])
>     New Media Producer, Kismia, Inc.
> ([EMAIL PROTECTED])
>     Adj. Prof., American University
> ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ
>
>
>
> --
> PHP General Mailing List (http://www.php.net/)
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> To contact the list administrators, e-mail: [EMAIL PROTECTED]
>
>


-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]

Reply via email to