All pastes #974000 Raw Edit

Kingskrown PHP Backdoor

public text v1 · immutable
·published 2008-04-06 14:06 UTC
rendered paste body
currently in directory /home/webadmin/stellar-attraction.com/html/common
file is directory and not writable .
file is directory and not writable ..
file is directory and not writable metabase
file is not writable and has a php extension db.php
reading data <?

$metabasepath = "$commonpath/metabase";
require("$metabasepath/metabase_interface.php");
require("$metabasepath/metabase_database.php");


class DBTable {

var $login;
var $link;
var $result;
var $sql;
var $metadb;
var $column_names;
var $res_rows;
var $row_pos;
var $row_cnt;

var $boolvalue; //Default boolean values to use for true/false in parameterized SQL statements
var $params;    //SQL Parameters

function DBTable()
{
 
  $this->boolvalue = array(false => "0", True => "1");
  $this->ClearParams;
}

function DoError($sql = "")
{
$error=MetabaseError($this->metadb);
echo "status=err<br>";
echo "SQL error=$error<br>";
//echo "SQL=$sql<br>";
exit;
}

//===============================================================================
function FindSQLParams(&$sql)
{
 $escaped = false;
 $escapechars = explode(",","\",',`");
 $res = "";
 $cnt = 0;
 for($i=0;$i<strlen($sql);$i++)
 {
   $char = substr($sql,$i,1);
   if(in_array($char,$escapechars))
    //Check if the char itself is not escaped
	if(!(($escaped) && ($i>0) && (substr($sql,$i-1,1)=="\\")))
	  $escaped = !$escaped; 
	  
   if($char==":" && !$escaped)
    {
	  //Add parameterized string
	  $res .= ":p$cnt:";
	  $cnt++;
	  
	  //Find the end of the parameter
	  for($c=$i+1;$c<strlen($sql);$c++)
	   {
	     $char2 = strtolower(substr($sql,$c,1));
		 if(!(($char2>='a' && $char2<='z') || ($char2>='0' && $char2<='9') || ($char2=="_"))) break;
		 $i++;
	   }
	}
   else
     $res .= $char;
 }
 $sql = $res;
 
 return $cnt;
}

//Returns a unix timestamp.
//If $val is a string, it is converted to a timestamp using the strtotime function
function AsTimeStamp($val)
{
 $stamp = $val;
 if(!is_numeric($stamp)) $stamp = strtotime($stamp);		                         
 return $stamp;
}

//Checks SQL string and assign parameters to string.
function FillSQLParams($sql,$params)
{
  if(is_array($params) && (count($params)>0)) 
  {
    $cnt = $this->FindSQLParams($sql);
	$c=0;
    foreach($params as $param)
	{
	  if($param["type"]=="auto")
	   $param["type"] = gettype($param["value"]);
	   
	   switch(strtolower($param["type"]))
	   {
	    //Valid auto-detect types
	    case "boolean"       : $val = $this->boolvalue[$param["value"]];
		                       break;
		case "integer"       : $val = $param["value"]; 
		                       settype($val,"integer");
							   $val = MetabaseGetIntegerFieldValue($this->metadb,$val);
							   break;
		case "double"        : $val = $param["value"]; 
		                       settype($val,"double");
							   $val = MetabaseGetFloatFieldValue($this->metadb,$val);
		                       break;
		case "string"        : $val = MetabaseGetTextFieldValue($this->metadb,$param["value"]); 
		                       break;
		case "NULL"          : $val = 'NULL'; break;
		
		//Custom types
		case "date"          : $stamp = $this->AsTimeStamp($param["value"]);
		                       $val = MetabaseGetDateFieldValue($this->metadb,$stamp);   
		                       break;
							   
		case "time"          : $stamp = $this->AsTimeStamp($param["value"]);	                         
		                       $val = MetabaseGetTimeFieldValue($this->metadb,$stamp);   
		                       break;
							   
		case "datetime"      : $stamp = $this->AsTimeStamp($param["value"]);	                         
		                       $val = MetabaseGetTimestampFieldValue($this->metadb,$stamp);   
		                       break;
							   
		case "statement"     : //WARNING: Use this one with caution - its an open hole for SQL injection!
		                       $val = $param["value"];
							   break;
		
		//Invalid auto-types
		case "array"         : 
		case "object"        : 
		case "resource"      : 
		case "unknown type"  : 
		case "user function" :  $this->DoAbort("Parameter type not supported ($param[type]).");
		                        break;
        
	}//switch
	
    $sql = str_replace(":p$c:",$val,$sql);
	$c++;
  }//foreach
  }//if 
  
  return $sql; 
}

function AddParam($val, $type = "auto")
{
  $param["value"] = $val;
  $param["type"]  = $type;
  $this->params[] = $param;
}

function AddParams($values, $type = "auto")
{
 foreach($values as $val)
   $this->AddParam($val,$type);
}


function SetParams() 
{
  $param_list = func_get_args();
  $this->AddParams($param_list);
} 

function ClearParams()
{
 $this->params = array();
}

function AddStr($val){ $this->AddParam($val,"string"); }
function AddString($val){ $this->AddParam($val,"string"); }
function AddInt($val){ $this->AddParam($val,"integer"); }
function AddInteger($val){ $this->AddParam($val,"integer"); }
function AddFloat($val){ $this->AddParam($val,"double"); }
function AddDouble($val){ $this->AddParam($val,"double"); }
function AddDate($val){ $this->AddParam($val,"date"); }
function AddTime($val){ $this->AddParam($val,"time"); }
function AddDateTime($val){ $this->AddParam($val,"datetime"); }
function AddTimeStamp($val){ $this->AddParam($val,"datetime"); }
function AddBool($val){ $this->AddParam($val,"boolean"); }
function AddStatement($val){ $this->AddParam($val,"statement"); }
function AddNull(){ $this->AddParam(NULL,"statement"); }
//===============================================================================

function connect($login = "")
{
 global $metabasepath;
 if(is_array($login)) $this->login = $login;
 
 $this->login["IncludePath"] = "$metabasepath/";
 
 $error = MetabaseSetupDatabase($this->login, $this->metadb);
 if($error!="")
  {
    echo "Database setup error: $error\n";
    exit;
  }
}

function query($sql, $limit = 0, $skip = 0)
{
 if(count($this->params)>0) { $sql = $this->FillSQLParams($sql,$this->params); $this->ClearParams(); }
 
 $this->res_rows = Array();
 $this->column_names = array();
 $this->sql = $sql;
 
 $skip = (int)$skip;
 $limit = (int)$limit;
  
 if($limit>0)
 {
   $success=MetabaseSetSelectedRowRange($this->metadb, $skip, $limit);
   if(!$success) echo "Warning: Unable to set limit and skip query range.";
 }
 
 //$result=MetabaseQueryAll($this->metadb, $sql, $rows);
 $result=MetabaseQuery($this->metadb, $sql);
 if(!$result) $this->DoError($sql);
 
 if(!MetabaseEndOfResult($this->metadb,$result)) 
 {
   $success=MetabaseGetColumnNames($this->metadb, $result, $column_names);
   if(!$success) echo "Warning: Unable to retrieve column names.";
 
   //Switch Key-Values into a more usuable array
   $this->column_names = array();
   foreach($column_names as $val => $key)
     $this->column_names["$key"] = $val;
      
   $success=MetabaseFetchResultAll($this->metadb, $result, $this->res_rows);
   $this->row_pos = 0;
   $this->row_cnt = count($this->res_rows);
 }
	 

 $this->result = $result;
 return $this->result;
}

function open($sql, $limit = 0, $skip = 0)
{
 //Additional arguments passed are used as SQL Parameters
 if(func_num_args()>3) { $param_list = func_get_args(); $this->AddParams(array_slice($param_list,3)); }
 
 return $this->query($sql, $limit, $skip);
}

function OpenEx($sql)
{
 //Additional arguments passed are used as SQL Parameters
 if(func_num_args()>1) { $param_list = func_get_args(); $this->AddParams(array_slice($param_list,1)); }
 $this->open($sql);
}

//Same as query - except
//this does NOT save query result
function execsql($sql)
{
  //Additional arguments passed are used as SQL Parameters
  if(func_num_args()>1) { $param_list = func_get_args(); $this->AddParams(array_slice($param_list,1)); }
  
  //If we have filled parameters, use them
  if(count($this->params)>0) { $sql = $this->FillSQLParams($sql,$this->params); $this->ClearParams(); }
 
  $this->sql = $sql;
  $result=MetabaseQuery($this->metadb, $sql);
  if(!$result) $this->DoError($sql);
}

function next()
{
 if($this->row_pos >= $this->row_cnt) return FALSE;
 $row = $this->res_rows[$this->row_pos];
 $this->row_pos++;
 
 if(!is_array($row)) return FALSE;
 
 reset($row);
 foreach($row as $key => $val)
  {
   if($this->login["Type"]=="mssql") $val = trim($val); //MSSQL does not return empty fields
   $data[$this->column_names["$key"]] = $val;
  }
   
 return $data;
}

function getrow()
{
 return $this->next();
}

function row()
{
 return $this->next();
}

function getrows()
{
 return $this->rows();
}

function rows()
{
 $rows = Array(); 
 while($row = $this->next())
  $rows[] = $row;
 
 return $rows; 
}

function insert($table,$data)
{
 global $commonpath;
 require_once("$commonpath/form.php");

 CreateSQLQuery($data,$fields,$values,"INSERT");
 
 $this->execsql("INSERT INTO $table ($fields) VALUES($values)");
}

function replace($table,$data)
{
 global $commonpath;
 require_once("$commonpath/form.php");

 CreateSQLQuery($data,$fields,$values,"INSERT");
 
 $this->execsql("REPLACE INTO $table ($fields) VALUES($values)");
}

function update($table, $data, $where)
{
 global $commonpath;
 require_once("$commonpath/form.php");

 CreateSQLQuery($data,$fields,$values,"UPDATE");
 
 $this->execsql("UPDATE $table SET $values WHERE $where ");
}

function delete($table, $where)
{
 $this->execsql("DELETE FROM $table WHERE $where ");
}

function insert_id()
{
 echo "insert_id not supported.";
 Exit;
}

function recordcount()
{
 return $this->row_cnt;
}

function num_rows()
{
 return $this->recordcount();
}

function affected_rows()
{
 MetabaseAffectedRows($this->metadb, $affected_rows);
 return $affected_rows;
}

//Data formatting functions
//==============================================================
function FormatTimestamp($value)
{
 return MetabaseGetTimestampFieldValue($this->metadb, $value);
}

function FormatDate($value)
{
 return MetabaseGetDateFieldValue($this->metadb, $value);
}

function FormatTime($value)
{
 return MetabaseGetTimeFieldValue($this->metadb, $value);
}

function FormatFloat($value)
{
 return MetabaseGetFloatFieldValue($this->metadb, $value);
}

function FormatDecimal($value)
{
 return MetabaseGetDecimalFieldValue($this->metadb, $value);
}

function FormatBoolean($value)
{
 return MetabaseGetBooleanFieldValue($this->metadb, $value);
}

function FormatText($value)
{
 return MetabaseGetTextFieldValue($this->metadb, $value);
}


//XML based configuration for different database drivers
function ReadXMLConfig($xmlfile)
{
 global $commonpath;
 require_once("$commonpath/form.php");
 require_once("$commonpath/xml.php");

 $dbdata = File2Str($xmlfile);
 
 //Remove PHP comments
 $dbdata = str_replace("<?/*","",$dbdata);
 $dbdata = str_replace("*/?>","",$dbdata);
 $dbdata = trim($dbdata);
 
 $dbdata = XML2Arr($dbdata);
 $dbdata = $dbdata["CONFIG"]["DATABASE"];
 EmptyNodeCleanUp($dbdata);
 
 
 switch($dbdata["DRIVER"])
 {
   case "FIREBIRD"   : $this->DBSetup_FireBird($dbdata); break;
   case "MSSQL"      :
   case "ADO"        : $this->DBSetup_MSSQL($dbdata); break;
   case "MYSQL"      : $this->DBSetup_MySQL($dbdata); break;
   case "POSTGRESQL" :
   case "POSTGRES"   : $this->DBSetup_PostgreSQL($dbdata); break;
   default           : echo "Error: Unsupported driver: ".$dbdata["DRIVER"]; exit;
 }
 
 return $this->login; 
}

function DBSetup_MySQL($data)
{
 $dblogin = array();
  $dblogin["Type"]     = "mysql";
  $dblogin["Host"]     = $data["HOST"];
  $dblogin["User"]     = $data["USERNAME"];
  $dblogin["Password"] = $data["PASSWORD"];
  $dblogin["Database"] = $data["DATABASE"];
  
  $options = array();
   $options["Port"]    = $data["PORT"]; 
  $dblogin["Options"]  = $options;
  
 $this->login = $dblogin; 
 return $this->login; 
}

function DBSetup_FireBird($data)
{
 $pathinfo = pathinfo($data["DATABASE"]);
 $pathinfo["extension"] = ".".$pathinfo["extension"];
 $pathinfo["dirname"] .= "/";
 $pathinfo["basename"]= substr($pathinfo["basename"],0,strlen($pathinfo["basename"])-strlen($pathinfo["extension"]));
 
 $dblogin = array();
  $dblogin["Type"]              = "ibase";
  $dblogin["Host"]              = $data["HOST"];
  $dblogin["User"]              = $data["USERNAME"];
  $dblogin["Password"]          = $data["PASSWORD"];
  $dblogin["Database"]          = $pathinfo["basename"];
  
 $options = array();
  $options["Port"]              = $data["PORT"]; //This might not be supported?
  $options["DatabasePath"]      = $pathinfo["dirname"];
  $options["Database"]          = $dblogin["Database"];
  $options["DatabaseExtension"] = $pathinfo["extension"];
  $dblogin["Options"]           = $options;
 
  
 $this->login = $dblogin; 
 return $this->login; 
}

function DBSetup_MSSQL($data)
{
 if((is_string($data["INSTANCENAME"])) && (!empty($data["INSTANCENAME"]))) $data["HOST"] .= "\\" . $data["INSTANCENAME"];
 
 $dblogin = array();
  $dblogin["Type"]     = "mssql";
  $dblogin["Host"]     = $data["HOST"];
  $dblogin["User"]     = $data["USERNAME"];
  if($data["AUTHENTICATION"] != "NT")
    $dblogin["Password"] = $data["PASSWORD"];
  $dblogin["Database"] = $data["DATABASE"];
  
 $this->login = $dblogin; 
 return $this->login;   
}



function DBSetup_PostgreSQL($data)
{
 $dblogin = array();
  $dblogin["Type"]     = "pgsql";
  $dblogin["Host"]     = $data["HOST"];
  $dblogin["User"]     = $data["USERNAME"];
  $dblogin["Password"] = $data["PASSWORD"];
  $dblogin["Database"] = $data["DATABASE"];
  
  $options= array();
    $options["Port"]    = $data["PORT"];;
  $dblogin["Options"]   = $options;
  
 $this->login = $dblogin; 
 return $this->login;   
}

}; // end of class
?>
file is not writable and has a php extension form.php
reading data <?

function Walk($a, $pre = '-->')
{
 if(!is_array($a))
 {
  echo "$pre value=$a<br>";
  return;
 }
 
 reset($a);
 while(list($key, $value) = each($a)){
  echo "$pre $key=$value<br>";
  
  if(is_array($value))
   Walk($value,$pre.'-->');
	 
 }	// while loop
 
} 


function StripNumericKeys($in)
{
 reset($in);
 $res = Array();
 while(list($key, $val) = each($in)){
 	if(!is_numeric($key))
    	$res[$key] = $val; 
 }	// while loop
 return $res;
}

function DateMove(&$d, &$m, &$y, $ad, $am, $ay)
{
   $stamp = mktime(0,0,0,$am,$ad,$ay);
   $d = date("d",$stamp);
   $m = date("m",$stamp);
   $y = date("Y",$stamp);
   return $stamp;
}
  
function DaysInMonth($m, $y = '')
{
 if(empty($y))
  $y = date('Y');
  
 $m = (int)$m; 
 $days[01]  = 31;
 $days[02]  = 28;
 $days[03]  = 31;
 $days[04]  = 30;
 $days[05]  = 31;
 $days[06]  = 30;
 $days[07]  = 31;
 $days[08]  = 31;
 $days[09]  = 30;
 $days[10]  = 31;
 $days[11]  = 30;
 $days[12]  = 31;
 
 return $days[$m];
}


function Def(&$val, $def = '')
{
 if(empty($val))
   $val = $def;
   
 return $val;
}

function FillData($data,$source)
{
 reset($data);
 while (list($key, $val) = each($data))
 {
   if ($key[0]!='_')
    ReplaceField($key,$val,$source);
 }
 
 ReplaceField("time",date('Y-m-d'),$source);
 ReplaceField("date",date('H:i:s'),$source);
 return $source;
}
 
function ReplaceField($field,$value,&$message)
{
 $message = eregi_replace("\{".$field."\}", "$value" , $message);
 $message = eregi_replace("\[".$field."\]", Text2Html($value), $message);
 $message = eregi_replace("#".$field."#", urlencode($value), $message);
}

function File2Str($fname)
{
$temp = "";
$fd = fopen($fname, "r");
while ($buffer = fgets($fd, 4096))
 {  $temp .= $buffer; }
fclose($fd);
return $temp;
}

function Str2File($fname, $data)
{
$temp = "";
$fd = fopen($fname, "w");
if(!$fd)
 echo "Error writing to $fname";
 
if(!fputs($fd, $data))
 echo "Error writing to $fname";
  
fclose($fd);
}


function Text2Html($txt)
{
 return str_replace("\n","\n<br>",$txt);
}

/*##########################################################################

 In here is various functions to handle the data received from HTML forms
 It allows for standards to accept data from any form and put it into a Database

//==========================================================================*/
function DataConvert(&$data,$from,$to)
{
 $from  = explode(',',$from);
 $to    = explode(',',$to);

 for ($k=0; $k<count($from); $k++)
 {
  if ($data==$from[$k])
  {
   $data = $to[$k];
   return;
  }
 }
}

//==========================================================================*/
function CheckRequiredFields(&$err,$req)
{
 global $HTTP_POST_VARS;

 $err = Array();
 reset($req);
   while (list($key, $value) = each($req))
    {

     //Are we testing composite required fields?
     if (gettype($value)=="array")
     {
      $keys = explode (",", $value["fields"]);

      unset($dummy);
      $dummy = "";
      $k=0;
      while (($k<count($keys)) and ($dummy==""))
      {
       if (empty($HTTP_POST_VARS[$keys[$k]]))
        $dummy = $value["message"];
       $k++;
      } //end while

      if(!empty($dummy))
       $err[$key] = $dummy;

     } else

     //Testing for a normal required field
     {
      if (empty($HTTP_POST_VARS[$key]))
        $err[$key] = $value;
     } //end if

    }//end while

 if (count($err)>0)
  return 0;
 else
  return 1;
}

//==========================================================================

function CreateSQLQuery($form,&$fields,&$values,$mode)
{
 //Set Database insert/update mode
 $fields = "";
 $values = "";

 reset($form);
 while (list($key, $val) = each($form))
 {
   if ($key[0]!='_')
    AddKey($key,$val,$fields,$values,$mode,"auto");
 }
}


//================== ##

/*##########################################################################

  Various Form output functions

//==========================================================================*/

function FormatDefData($name,&$data,$def)
{
 if (gettype($data)=="array")
   $data = $data["$name"];
 
 if (empty($data))
  $data = $def;
}

//==========================================================================
function InputHidden($name,$data,$def = "")
{
 FormatDefData($name,$data,$def);
?>
 <input type="hidden" name="<? echo $name; ?>" value="<? echo htmlentities($data); ?>">
<?
}

//==========================================================================
function InputCheckBox($name,$data, $def="", $val = "")
{
 if(empty($val)) $val = $name;
 FormatDefData($name,$data,$def);
?>
 <input type="checkbox" name="<? echo $name; ?>" value="<? echo $val; ?>" <? if($val==$data){ echo "checked"; }?>>
<?
}

//==========================================================================
function InputRadio($name,$data, $def = "", $val = "")
{
 if(empty($val)) $val = $name;
 FormatDefData($name,$data,$def);
?>
 <input type="radio" name="<? echo $name; ?>" value="<? echo $val; ?>" <? if($val==$data){ echo "checked"; }?>>
<?
}

//==========================================================================
function InputTextArea($name,$data,$def = "", $rows = 3, $cols = 20)
{
 FormatDefData($name,$data,$def);
?>
 <textarea rows="<? echo $rows; ?>" name="<? echo $name; ?>" cols="<? echo $cols; ?>"><? echo htmlentities($data); ?></textarea>
<?
}

//==========================================================================
function InputText($name,$data,$def = "", $size = 20)
{
 FormatDefData($name,$data,$def);
?>
 <input type="text" name="<? echo $name; ?>" size="<? echo $size; ?>" value="<? echo htmlentities($data); ?>">
<?
}

//==========================================================================
function InputPassword($name,$data,$def = "", $size = 20)
{
 FormatDefData($name,$data,$def);
?>
 <input type="password" name="<? echo $name; ?>" size="<? echo $size; ?>" value="<? echo htmlentities($data); ?>">
<?
}

//==========================================================================
function InputFile($name,$data,$def = "", $size = 20, $accept = "")
{
 FormatDefData($name,$data,$def);
 if(!empty($accept))
  $accept = 'ACCEPT="' . $accept . '"';
?>
 <input type="file" name="<? echo $name; ?>" size="<? echo $size; ?>" value="<? echo htmlentities($data); ?>" <? echo $accept; ?> >
<?
}


//==========================================================================
function InputCombo($name,$data,$def,$labels,$values = "")
{
 FormatDefData($name,$data,$def);

 if (empty($values))
  $values = $labels;

 $labels = explode(',',$labels);
 $values = explode(',',$values);
?>
<select name="<? echo $name; ?>" size="1">
<?
 for ($k=0; $k<count($labels);$k++)
 {?>
   <option value="<? echo $values[$k]; ?>" <? if($values[$k]==$data){ echo "selected"; } ?>><? echo $labels[$k]; ?></option>
 <?}?>
</select>
<?
}

//==========================================================================
function InputComboDB($name,$data,$def,$res)
{
 FormatDefData($name,$data,$def);
?>
<select name="<? echo $name; ?>" size="1">
<?
 while ($row = mysql_fetch_array($res))
   {
    ?>
   <option value="<? echo $row["value"]; ?>" <? if($row["value"]==$data){ echo "selected"; } ?>><? echo $row["label"]; ?></option>
    <?
   }?>
</select>
<?
}

function InputButton($name = 'Go', $data = '', $type = 'submit')
{
 FormatDefData($name,$data,$name);
 echo "<input type='$type' value='$data' name='$name'>";
}
//==========================================================================*/
function InputDay($d,$name)
{
 FormatDefData($name,$d,date('d'));
 $d = (int)$d;
 
 echo "<select NAME='$name' size='1'>\n";
 for ($k=1;$k<=31;$k++)
 {

  if ($d == $k) 
    $selected = "selected";
  else
    $selected = "";
 
  echo "<option value='$k' $selected>$k</option> \n";
 }
  echo "</select>";
}

function InputMonth($m,$name)
{
 FormatDefData($name,$m,date('m'));
 $m = (int)$m;
 
 echo "<select NAME='$name' size='1'>\n";
 for ($k=1;$k<=12;$k++)
 {

  $stamp = mktime(0,0,0,$k,1,date("Y"));
  $mm = date("M",$stamp);
  if ($m == $k) 
    $selected = "selected";
  else
    $selected = "";
 
  echo "<option value='$k' $selected>$mm</option> \n";
 }  
  echo "</select>";
}

function InputYear($y,$name)
{
 FormatDefData($name, $y, date('Y'));
 $y = (int)$y;
 
 echo "<select NAME='$name' size='1'>\n";
 for ($k=2001;$k<=date("Y");$k++)
 {

  if ($y == $k) 
    $selected = "selected";
  else
    $selected = "";
 
  echo "<option value='$k' $selected>$k</option> \n";
 }
  echo "</select>";
}

function InputDate($f,$fieldname)
{

 $months[1]="Jan";
 $months[2]="Feb";
 $months[3]="Mar";
 $months[4]="Apr";
 $months[5]="May";
 $months[6]="Jun";
 $months[7]="Jul";
 $months[8]="Aug";
 $months[9]="Sep";
 $months[10]="Oct";
 $months[11]="Nov";
 $months[12]="Dec";

 if (empty($f['d']))
 {
   $f['d'] = date ("d"); 
   $f['m'] = date ("m");
   $f['y'] = date ("Y");
 };


?>
     <select NAME="<? echo $fieldname; ?>[m]" size="1">
       <?
      //======= FROM month ======
      for ($k=1;$k<=12;$k++)
      {
      ?>
        <option value="<? echo $k; ?>" <? if ($f[m] == $k) { echo "selected"; } ?>><? echo $months[$k]; ?></option>
      <?
      };
      //=====================
      ?>
      </select>

      <select NAME="<? echo $fieldname; ?>[d]" size="1">
      <?
      //======= FROM Day ======
      for ($k=1;$k<=31;$k++)
      {
      ?>
        <option value="<? echo $k; ?>" <? if ($f[d] == $k) { echo "selected"; } ?>><? echo $k; ?></option>
      <?
      };
      //=====================
      ?>

      </select> <select NAME="<? echo $fieldname; ?>[y]" size="1">

      <?
      //======= FROM year ======
      for ($k=2001;$k<=date("Y");$k++)
      {
      ?>
        <option value="<? echo $k; ?>" <? if ($f[y] == $k) { echo "selected"; } ?>><? echo $k; ?></option>
      <?
      };
      //=====================
      ?>
      </select>
<?
}


//==========================================================================*/
function AddKey($field,$value,&$fields, &$values, $DBmode, $type = "string")
{
 if ($type == "auto")
 {
  if (strtoupper($value)=="NULL")
   $type = "NULL";
  else
  $type = gettype($value);
 }

 switch ($type)
 {
  case "NULL"    :
  case "null"    :
  case "double"  :
  case "integer" :
  case "integer" : $doStr = "";
                   break;
  case "string"  :
  default        : $value=addslashes($value);
                   $doStr = "'";
 }

 $DBmode = strtoupper($DBmode);
 
 if ($DBmode=="UPDATE")
 {
  if (!empty($values))
   $values .= ",";
  $values .=  $field . " = $doStr" . $value . "$doStr ";
 }
 else
 {

  if (!empty($fields))
   $fields .= ",";

  if (!empty($values))
   $values .= ",";

  $fields .=  $field;
  $values .= "$doStr" . $value . "$doStr ";
 }

}

//========================= --[ END ]-- ====================================
?>
file is not writable and has a php extension functions.php
reading data <?
function Preparesong(&$song)
{
 global $picture_na, $picture_dir, $sam, $stationid;

 Def($song["id"],0);
 Def($song["songid"],$song["id"]); 
 Def($song["artist"],"");
 Def($song["title"],"");
 Def($song["album"],"");
 Def($song["duration"],-1);
 Def($song["picture"],"");
 Def($song["buycd"],"");
 Def($song["website"],"");

 if(empty($song["picture"])) 
  {
   $song["picture"] = $picture_na;
   $song["haspicture"] = false;
  }
 else
  {
   $song["picture"] = $picture_dir.$song["picture"];
   $song["haspicture"] = true;
  }
  
 //Make Artist+Tile combination
 if(empty($song["artist"])) 
  $song["combine"] = $song["title"];
 else
  $song["combine"] = $song["artist"] . " - ". $song["title"];
  
 $ss = round($song["duration"] / 1000);
 $mm = (int)($ss / 60);
 $ss = ($ss % 60);
 if($ss<10) $ss="0$ss";
 $song["mmss"] = "$mm:$ss";
 
  
 //Make a link that will search for the best place to buy the CD 
 if(empty($song["buycd"])) 
  {
   $data = "http://www.audiorealm.com/findcd.html?artist=#artist#&title=#title#&album=#album#";
   $song["buycd"] = FillData($song,$data);
  }
  
 //Make a link to search for the artist homepage
 if(empty($song["website"])) 
  {
   $data = "http://www.audiorealm.com/findwebsite.html?artist=#artist#&title=#title#&album=#album#";
   $song["website"] = FillData($song,$data);
  }
  
  //Make a request link 
  $song["request"] = "javascript:request($song[songid])";

}

?>
file is not writable and has a php extension xml.php
reading data <?
//XML handling routines
function GetChildren($vals, &$i)
{
  while($i < count($vals))
  {

    switch ($vals[$i]['type'])
      {
        //case 'cdata':
		case 'complete' :
		if(isset($vals[$i]['attributes']))
		{
			$value = array("attributes" => $vals[$i]['attributes'],
			      "value" => $vals[$i]['value']);
		}
		else
		{
			$value = array("value" => $vals[$i]['value']);
		}
		 $name = $vals[$i]['tag'];
         $children["$name"][] = $value; 
		 
		break;
		
		case 'open'     : 
		 $siblings = GetChildren($vals, ++$i);
		if(isset($vals[$i]['attributes']))
		  {
			$siblings['attributes'] = $vals[$i]['attributes'];
		  }
		 
		 $name = $vals[$i]['tag'];
         $children["$name"][] = $siblings;
		 
		 /*
		 array_push($children,
		  array("attributes" => $vals[$i]['attributes'],
		  "children" => GetChildren($vals, ++$i))
		  );
		  */
		break;
		
		case 'close'    :
		 return $children;
		break;
		
		default : 	 
		 echo "XML error, Unsupported tag type: " . $vals[$i]['type'] . "<br>";
	 }
	
	$i++;
  }
  
 return $children; 
}
  
  function GetXMLTree($data, $uppercase = 1)
  {
    $p = xml_parser_create();
    xml_parser_set_option($p, XML_OPTION_SKIP_WHITE, 1);
	xml_parser_set_option($p, XML_OPTION_CASE_FOLDING, $uppercase);
	
    xml_parse_into_struct($p, $data, $vals, $index);
    xml_parser_free($p);

    $tree = array();
    $i = 0;

    $tree = GetChildren($vals, $i);
	
    return $tree;
  }
  
//######################################################  
//######################################################
  
function CompackTree($data)
{

 reset($data);
 while(list($key, $value) = each($data))
 {
 
  if(is_array($value))
  {
  
   //SPECIAL HANDLING
   //Make Attributes the Values if value empty
  if(isset($value['attributes']))
   if(is_array($value['attributes']))
    if(!isset($value['value']))
	 {
	   $leaf["$key"] = $value['attributes'];
	   continue;
	 }
   
   $c = count($value);
   
   if($c>1)
   {
    //REMOVE empty Attributes if Value is valid
    if(!((isset($value['attributes'])) && (is_array($value['attributes']))) && (isset($value['value'])))
	  $leaf["$key"] = $value['value'];
	 else
      $leaf["$key"] = CompackTree($value);
   }
   else
   {
     $temp = $value[0];
	 //REMOVE empty Attributes if Value is valid
	if(isset($temp['attributes']))
	{
	 if(!is_array($temp['attributes']) && (isset($temp['value'])))
	  $leaf["$key"] = $temp['value'];
	 else $leaf["$key"] = CompackTree($temp);
	} else if(isset($temp['value']))
		$leaf["$key"] = $temp['value'];
		else $leaf["$key"] = CompackTree($temp);
   }
   
  } 
  else
   $leaf["$key"] = $value;
	 
 }	// while loop
 
 return $leaf;
}
  
  
function XMLToArray($data, $uppercase = 1)
{
 $tree = GetXMLTree($data, $uppercase);
 return CompackTree($tree);
}

function XML2Array($data, $uppercase = 1)
{
 return XMLToArray($data, $uppercase);
}

function XML2Arr($data, $uppercase = 1)
{
 return XMLToArray($data, $uppercase);
}

//######################################################
//######################################################
function ChildKeyIsNum($data)
{
  if(!is_array($data))
   return false;
   
  reset($data);
  list($key, $value) = each($data);
  if(is_numeric($key))
   return true;
  else
   return false;
}

function MakeAttr($data)
{
 if(!is_array($data))
  return "";

 $attr = " ";
 reset($data);
 while(list($key, $value) = each($data)){
   $attr .= " $key=\"$value\"";	 
 }	// while loop

 return $attr;
}

function ArrayToXML($data, $parent = "")
{
 if(empty($parent))
  $xml = '<?xml version="1.0"?>';
 else 
  $xml = "";
  
  reset($data);
  while(list($key, $value) = each($data))
  {
   $attr = "";
   
   if(is_numeric($key))
   {
     $key = $parent;
	 
	 if(!empty($value['attributes']))
   	  $attr = MakeAttr($value['attributes']);
     unset($value['attributes']);
   };
    
	
   if(ChildKeyIsNum($value))
 	$xml .= ArrayToXML($value,$key);
   else if(is_array($value))
    {
      $xml .= "<$key$attr>";
       $xml .= ArrayToXML($value,$key);
	  $xml .= "</$key$attr>";
    }
     else
       $xml .= "<$key$attr>$value</$key>";
  }//while
  
 return $xml;  
}

function Array2XML($data, $parent = "")
{
 return ArrayToXML($data, $parent);
}

function Arr2XML($data, $parent = "")
{
 return ArrayToXML($data, $parent);
}
//######################################################
//######################################################
  

function Keys2Lower($a)
{
 if(!is_array($a))
  return $a;
 
 unset($res);
 
 reset($a);
 while(list($key, $value) = each($a)){

  if(is_array($value))
   $res[strtolower($key)] = Keys2Lower($value);
  else
   $res[strtolower($key)] = $value;
	 
 }	// while loop
 
 return $res;
}

function XMLheader()
{
 header("Content-type: text/xml");
}

function EmptyNodeCleanUp(&$data)
{
 while(list($key, $val) = each($data)){
  if(is_array($val))
   $data[$key] = "";
 }	// while loop
}

function echoXML($xml)
{
  XMLheader();
  
  if(is_array($xml))
   echo Array2XML($xml);
  else
   echo $xml;
}

?>

currently in directory /home/webadmin/stellar-attraction.com/html/common
file is directory and not writable .
file is directory and not writable ..
file is directory and not writable metabase
file is not writable and has a php extension db.php
reading data <?

$metabasepath = "$commonpath/metabase";
require("$metabasepath/metabase_interface.php");
require("$metabasepath/metabase_database.php");


class DBTable {

var $login;
var $link;
var $result;
var $sql;
var $metadb;
var $column_names;
var $res_rows;
var $row_pos;
var $row_cnt;

var $boolvalue; //Default boolean values to use for true/false in parameterized SQL statements
var $params;    //SQL Parameters

function DBTable()
{
 
  $this->boolvalue = array(false => "0", True => "1");
  $this->ClearParams;
}

function DoError($sql = "")
{
$error=MetabaseError($this->metadb);
echo "status=err<br>";
echo "SQL error=$error<br>";
//echo "SQL=$sql<br>";
exit;
}

//===============================================================================
function FindSQLParams(&$sql)
{
 $escaped = false;
 $escapechars = explode(",","\",',`");
 $res = "";
 $cnt = 0;
 for($i=0;$i<strlen($sql);$i++)
 {
   $char = substr($sql,$i,1);
   if(in_array($char,$escapechars))
    //Check if the char itself is not escaped
	if(!(($escaped) && ($i>0) && (substr($sql,$i-1,1)=="\\")))
	  $escaped = !$escaped; 
	  
   if($char==":" && !$escaped)
    {
	  //Add parameterized string
	  $res .= ":p$cnt:";
	  $cnt++;
	  
	  //Find the end of the parameter
	  for($c=$i+1;$c<strlen($sql);$c++)
	   {
	     $char2 = strtolower(substr($sql,$c,1));
		 if(!(($char2>='a' && $char2<='z') || ($char2>='0' && $char2<='9') || ($char2=="_"))) break;
		 $i++;
	   }
	}
   else
     $res .= $char;
 }
 $sql = $res;
 
 return $cnt;
}

//Returns a unix timestamp.
//If $val is a string, it is converted to a timestamp using the strtotime function
function AsTimeStamp($val)
{
 $stamp = $val;
 if(!is_numeric($stamp)) $stamp = strtotime($stamp);		                         
 return $stamp;
}

//Checks SQL string and assign parameters to string.
function FillSQLParams($sql,$params)
{
  if(is_array($params) && (count($params)>0)) 
  {
    $cnt = $this->FindSQLParams($sql);
	$c=0;
    foreach($params as $param)
	{
	  if($param["type"]=="auto")
	   $param["type"] = gettype($param["value"]);
	   
	   switch(strtolower($param["type"]))
	   {
	    //Valid auto-detect types
	    case "boolean"       : $val = $this->boolvalue[$param["value"]];
		                       break;
		case "integer"       : $val = $param["value"]; 
		                       settype($val,"integer");
							   $val = MetabaseGetIntegerFieldValue($this->metadb,$val);
							   break;
		case "double"        : $val = $param["value"]; 
		                       settype($val,"double");
							   $val = MetabaseGetFloatFieldValue($this->metadb,$val);
		                       break;
		case "string"        : $val = MetabaseGetTextFieldValue($this->metadb,$param["value"]); 
		                       break;
		case "NULL"          : $val = 'NULL'; break;
		
		//Custom types
		case "date"          : $stamp = $this->AsTimeStamp($param["value"]);
		                       $val = MetabaseGetDateFieldValue($this->metadb,$stamp);   
		                       break;
							   
		case "time"          : $stamp = $this->AsTimeStamp($param["value"]);	                         
		                       $val = MetabaseGetTimeFieldValue($this->metadb,$stamp);   
		                       break;
							   
		case "datetime"      : $stamp = $this->AsTimeStamp($param["value"]);	                         
		                       $val = MetabaseGetTimestampFieldValue($this->metadb,$stamp);   
		                       break;
							   
		case "statement"     : //WARNING: Use this one with caution - its an open hole for SQL injection!
		                       $val = $param["value"];
							   break;
		
		//Invalid auto-types
		case "array"         : 
		case "object"        : 
		case "resource"      : 
		case "unknown type"  : 
		case "user function" :  $this->DoAbort("Parameter type not supported ($param[type]).");
		                        break;
        
	}//switch
	
    $sql = str_replace(":p$c:",$val,$sql);
	$c++;
  }//foreach
  }//if 
  
  return $sql; 
}

function AddParam($val, $type = "auto")
{
  $param["value"] = $val;
  $param["type"]  = $type;
  $this->params[] = $param;
}

function AddParams($values, $type = "auto")
{
 foreach($values as $val)
   $this->AddParam($val,$type);
}


function SetParams() 
{
  $param_list = func_get_args();
  $this->AddParams($param_list);
} 

function ClearParams()
{
 $this->params = array();
}

function AddStr($val){ $this->AddParam($val,"string"); }
function AddString($val){ $this->AddParam($val,"string"); }
function AddInt($val){ $this->AddParam($val,"integer"); }
function AddInteger($val){ $this->AddParam($val,"integer"); }
function AddFloat($val){ $this->AddParam($val,"double"); }
function AddDouble($val){ $this->AddParam($val,"double"); }
function AddDate($val){ $this->AddParam($val,"date"); }
function AddTime($val){ $this->AddParam($val,"time"); }
function AddDateTime($val){ $this->AddParam($val,"datetime"); }
function AddTimeStamp($val){ $this->AddParam($val,"datetime"); }
function AddBool($val){ $this->AddParam($val,"boolean"); }
function AddStatement($val){ $this->AddParam($val,"statement"); }
function AddNull(){ $this->AddParam(NULL,"statement"); }
//===============================================================================

function connect($login = "")
{
 global $metabasepath;
 if(is_array($login)) $this->login = $login;
 
 $this->login["IncludePath"] = "$metabasepath/";
 
 $error = MetabaseSetupDatabase($this->login, $this->metadb);
 if($error!="")
  {
    echo "Database setup error: $error\n";
    exit;
  }
}

function query($sql, $limit = 0, $skip = 0)
{
 if(count($this->params)>0) { $sql = $this->FillSQLParams($sql,$this->params); $this->ClearParams(); }
 
 $this->res_rows = Array();
 $this->column_names = array();
 $this->sql = $sql;
 
 $skip = (int)$skip;
 $limit = (int)$limit;
  
 if($limit>0)
 {
   $success=MetabaseSetSelectedRowRange($this->metadb, $skip, $limit);
   if(!$success) echo "Warning: Unable to set limit and skip query range.";
 }
 
 //$result=MetabaseQueryAll($this->metadb, $sql, $rows);
 $result=MetabaseQuery($this->metadb, $sql);
 if(!$result) $this->DoError($sql);
 
 if(!MetabaseEndOfResult($this->metadb,$result)) 
 {
   $success=MetabaseGetColumnNames($this->metadb, $result, $column_names);
   if(!$success) echo "Warning: Unable to retrieve column names.";
 
   //Switch Key-Values into a more usuable array
   $this->column_names = array();
   foreach($column_names as $val => $key)
     $this->column_names["$key"] = $val;
      
   $success=MetabaseFetchResultAll($this->metadb, $result, $this->res_rows);
   $this->row_pos = 0;
   $this->row_cnt = count($this->res_rows);
 }
	 

 $this->result = $result;
 return $this->result;
}

function open($sql, $limit = 0, $skip = 0)
{
 //Additional arguments passed are used as SQL Parameters
 if(func_num_args()>3) { $param_list = func_get_args(); $this->AddParams(array_slice($param_list,3)); }
 
 return $this->query($sql, $limit, $skip);
}

function OpenEx($sql)
{
 //Additional arguments passed are used as SQL Parameters
 if(func_num_args()>1) { $param_list = func_get_args(); $this->AddParams(array_slice($param_list,1)); }
 $this->open($sql);
}

//Same as query - except
//this does NOT save query result
function execsql($sql)
{
  //Additional arguments passed are used as SQL Parameters
  if(func_num_args()>1) { $param_list = func_get_args(); $this->AddParams(array_slice($param_list,1)); }
  
  //If we have filled parameters, use them
  if(count($this->params)>0) { $sql = $this->FillSQLParams($sql,$this->params); $this->ClearParams(); }
 
  $this->sql = $sql;
  $result=MetabaseQuery($this->metadb, $sql);
  if(!$result) $this->DoError($sql);
}

function next()
{
 if($this->row_pos >= $this->row_cnt) return FALSE;
 $row = $this->res_rows[$this->row_pos];
 $this->row_pos++;
 
 if(!is_array($row)) return FALSE;
 
 reset($row);
 foreach($row as $key => $val)
  {
   if($this->login["Type"]=="mssql") $val = trim($val); //MSSQL does not return empty fields
   $data[$this->column_names["$key"]] = $val;
  }
   
 return $data;
}

function getrow()
{
 return $this->next();
}

function row()
{
 return $this->next();
}

function getrows()
{
 return $this->rows();
}

function rows()
{
 $rows = Array(); 
 while($row = $this->next())
  $rows[] = $row;
 
 return $rows; 
}

function insert($table,$data)
{
 global $commonpath;
 require_once("$commonpath/form.php");

 CreateSQLQuery($data,$fields,$values,"INSERT");
 
 $this->execsql("INSERT INTO $table ($fields) VALUES($values)");
}

function replace($table,$data)
{
 global $commonpath;
 require_once("$commonpath/form.php");

 CreateSQLQuery($data,$fields,$values,"INSERT");
 
 $this->execsql("REPLACE INTO $table ($fields) VALUES($values)");
}

function update($table, $data, $where)
{
 global $commonpath;
 require_once("$commonpath/form.php");

 CreateSQLQuery($data,$fields,$values,"UPDATE");
 
 $this->execsql("UPDATE $table SET $values WHERE $where ");
}

function delete($table, $where)
{
 $this->execsql("DELETE FROM $table WHERE $where ");
}

function insert_id()
{
 echo "insert_id not supported.";
 Exit;
}

function recordcount()
{
 return $this->row_cnt;
}

function num_rows()
{
 return $this->recordcount();
}

function affected_rows()
{
 MetabaseAffectedRows($this->metadb, $affected_rows);
 return $affected_rows;
}

//Data formatting functions
//==============================================================
function FormatTimestamp($value)
{
 return MetabaseGetTimestampFieldValue($this->metadb, $value);
}

function FormatDate($value)
{
 return MetabaseGetDateFieldValue($this->metadb, $value);
}

function FormatTime($value)
{
 return MetabaseGetTimeFieldValue($this->metadb, $value);
}

function FormatFloat($value)
{
 return MetabaseGetFloatFieldValue($this->metadb, $value);
}

function FormatDecimal($value)
{
 return MetabaseGetDecimalFieldValue($this->metadb, $value);
}

function FormatBoolean($value)
{
 return MetabaseGetBooleanFieldValue($this->metadb, $value);
}

function FormatText($value)
{
 return MetabaseGetTextFieldValue($this->metadb, $value);
}


//XML based configuration for different database drivers
function ReadXMLConfig($xmlfile)
{
 global $commonpath;
 require_once("$commonpath/form.php");
 require_once("$commonpath/xml.php");

 $dbdata = File2Str($xmlfile);
 
 //Remove PHP comments
 $dbdata = str_replace("<?/*","",$dbdata);
 $dbdata = str_replace("*/?>","",$dbdata);
 $dbdata = trim($dbdata);
 
 $dbdata = XML2Arr($dbdata);
 $dbdata = $dbdata["CONFIG"]["DATABASE"];
 EmptyNodeCleanUp($dbdata);
 
 
 switch($dbdata["DRIVER"])
 {
   case "FIREBIRD"   : $this->DBSetup_FireBird($dbdata); break;
   case "MSSQL"      :
   case "ADO"        : $this->DBSetup_MSSQL($dbdata); break;
   case "MYSQL"      : $this->DBSetup_MySQL($dbdata); break;
   case "POSTGRESQL" :
   case "POSTGRES"   : $this->DBSetup_PostgreSQL($dbdata); break;
   default           : echo "Error: Unsupported driver: ".$dbdata["DRIVER"]; exit;
 }
 
 return $this->login; 
}

function DBSetup_MySQL($data)
{
 $dblogin = array();
  $dblogin["Type"]     = "mysql";
  $dblogin["Host"]     = $data["HOST"];
  $dblogin["User"]     = $data["USERNAME"];
  $dblogin["Password"] = $data["PASSWORD"];
  $dblogin["Database"] = $data["DATABASE"];
  
  $options = array();
   $options["Port"]    = $data["PORT"]; 
  $dblogin["Options"]  = $options;
  
 $this->login = $dblogin; 
 return $this->login; 
}

function DBSetup_FireBird($data)
{
 $pathinfo = pathinfo($data["DATABASE"]);
 $pathinfo["extension"] = ".".$pathinfo["extension"];
 $pathinfo["dirname"] .= "/";
 $pathinfo["basename"]= substr($pathinfo["basename"],0,strlen($pathinfo["basename"])-strlen($pathinfo["extension"]));
 
 $dblogin = array();
  $dblogin["Type"]              = "ibase";
  $dblogin["Host"]              = $data["HOST"];
  $dblogin["User"]              = $data["USERNAME"];
  $dblogin["Password"]          = $data["PASSWORD"];
  $dblogin["Database"]          = $pathinfo["basename"];
  
 $options = array();
  $options["Port"]              = $data["PORT"]; //This might not be supported?
  $options["DatabasePath"]      = $pathinfo["dirname"];
  $options["Database"]          = $dblogin["Database"];
  $options["DatabaseExtension"] = $pathinfo["extension"];
  $dblogin["Options"]           = $options;
 
  
 $this->login = $dblogin; 
 return $this->login; 
}

function DBSetup_MSSQL($data)
{
 if((is_string($data["INSTANCENAME"])) && (!empty($data["INSTANCENAME"]))) $data["HOST"] .= "\\" . $data["INSTANCENAME"];
 
 $dblogin = array();
  $dblogin["Type"]     = "mssql";
  $dblogin["Host"]     = $data["HOST"];
  $dblogin["User"]     = $data["USERNAME"];
  if($data["AUTHENTICATION"] != "NT")
    $dblogin["Password"] = $data["PASSWORD"];
  $dblogin["Database"] = $data["DATABASE"];
  
 $this->login = $dblogin; 
 return $this->login;   
}



function DBSetup_PostgreSQL($data)
{
 $dblogin = array();
  $dblogin["Type"]     = "pgsql";
  $dblogin["Host"]     = $data["HOST"];
  $dblogin["User"]     = $data["USERNAME"];
  $dblogin["Password"] = $data["PASSWORD"];
  $dblogin["Database"] = $data["DATABASE"];
  
  $options= array();
    $options["Port"]    = $data["PORT"];;
  $dblogin["Options"]   = $options;
  
 $this->login = $dblogin; 
 return $this->login;   
}

}; // end of class
?>
file is not writable and has a php extension form.php
reading data <?

function Walk($a, $pre = '-->')
{
 if(!is_array($a))
 {
  echo "$pre value=$a<br>";
  return;
 }
 
 reset($a);
 while(list($key, $value) = each($a)){
  echo "$pre $key=$value<br>";
  
  if(is_array($value))
   Walk($value,$pre.'-->');
	 
 }	// while loop
 
} 


function StripNumericKeys($in)
{
 reset($in);
 $res = Array();
 while(list($key, $val) = each($in)){
 	if(!is_numeric($key))
    	$res[$key] = $val; 
 }	// while loop
 return $res;
}

function DateMove(&$d, &$m, &$y, $ad, $am, $ay)
{
   $stamp = mktime(0,0,0,$am,$ad,$ay);
   $d = date("d",$stamp);
   $m = date("m",$stamp);
   $y = date("Y",$stamp);
   return $stamp;
}
  
function DaysInMonth($m, $y = '')
{
 if(empty($y))
  $y = date('Y');
  
 $m = (int)$m; 
 $days[01]  = 31;
 $days[02]  = 28;
 $days[03]  = 31;
 $days[04]  = 30;
 $days[05]  = 31;
 $days[06]  = 30;
 $days[07]  = 31;
 $days[08]  = 31;
 $days[09]  = 30;
 $days[10]  = 31;
 $days[11]  = 30;
 $days[12]  = 31;
 
 return $days[$m];
}


function Def(&$val, $def = '')
{
 if(empty($val))
   $val = $def;
   
 return $val;
}

function FillData($data,$source)
{
 reset($data);
 while (list($key, $val) = each($data))
 {
   if ($key[0]!='_')
    ReplaceField($key,$val,$source);
 }
 
 ReplaceField("time",date('Y-m-d'),$source);
 ReplaceField("date",date('H:i:s'),$source);
 return $source;
}
 
function ReplaceField($field,$value,&$message)
{
 $message = eregi_replace("\{".$field."\}", "$value" , $message);
 $message = eregi_replace("\[".$field."\]", Text2Html($value), $message);
 $message = eregi_replace("#".$field."#", urlencode($value), $message);
}

function File2Str($fname)
{
$temp = "";
$fd = fopen($fname, "r");
while ($buffer = fgets($fd, 4096))
 {  $temp .= $buffer; }
fclose($fd);
return $temp;
}

function Str2File($fname, $data)
{
$temp = "";
$fd = fopen($fname, "w");
if(!$fd)
 echo "Error writing to $fname";
 
if(!fputs($fd, $data))
 echo "Error writing to $fname";
  
fclose($fd);
}


function Text2Html($txt)
{
 return str_replace("\n","\n<br>",$txt);
}

/*##########################################################################

 In here is various functions to handle the data received from HTML forms
 It allows for standards to accept data from any form and put it into a Database

//==========================================================================*/
function DataConvert(&$data,$from,$to)
{
 $from  = explode(',',$from);
 $to    = explode(',',$to);

 for ($k=0; $k<count($from); $k++)
 {
  if ($data==$from[$k])
  {
   $data = $to[$k];
   return;
  }
 }
}

//==========================================================================*/
function CheckRequiredFields(&$err,$req)
{
 global $HTTP_POST_VARS;

 $err = Array();
 reset($req);
   while (list($key, $value) = each($req))
    {

     //Are we testing composite required fields?
     if (gettype($value)=="array")
     {
      $keys = explode (",", $value["fields"]);

      unset($dummy);
      $dummy = "";
      $k=0;
      while (($k<count($keys)) and ($dummy==""))
      {
       if (empty($HTTP_POST_VARS[$keys[$k]]))
        $dummy = $value["message"];
       $k++;
      } //end while

      if(!empty($dummy))
       $err[$key] = $dummy;

     } else

     //Testing for a normal required field
     {
      if (empty($HTTP_POST_VARS[$key]))
        $err[$key] = $value;
     } //end if

    }//end while

 if (count($err)>0)
  return 0;
 else
  return 1;
}

//==========================================================================

function CreateSQLQuery($form,&$fields,&$values,$mode)
{
 //Set Database insert/update mode
 $fields = "";
 $values = "";

 reset($form);
 while (list($key, $val) = each($form))
 {
   if ($key[0]!='_')
    AddKey($key,$val,$fields,$values,$mode,"auto");
 }
}


//================== ##

/*##########################################################################

  Various Form output functions

//==========================================================================*/

function FormatDefData($name,&$data,$def)
{
 if (gettype($data)=="array")
   $data = $data["$name"];
 
 if (empty($data))
  $data = $def;
}

//==========================================================================
function InputHidden($name,$data,$def = "")
{
 FormatDefData($name,$data,$def);
?>
 <input type="hidden" name="<? echo $name; ?>" value="<? echo htmlentities($data); ?>">
<?
}

//==========================================================================
function InputCheckBox($name,$data, $def="", $val = "")
{
 if(empty($val)) $val = $name;
 FormatDefData($name,$data,$def);
?>
 <input type="checkbox" name="<? echo $name; ?>" value="<? echo $val; ?>" <? if($val==$data){ echo "checked"; }?>>
<?
}

//==========================================================================
function InputRadio($name,$data, $def = "", $val = "")
{
 if(empty($val)) $val = $name;
 FormatDefData($name,$data,$def);
?>
 <input type="radio" name="<? echo $name; ?>" value="<? echo $val; ?>" <? if($val==$data){ echo "checked"; }?>>
<?
}

//==========================================================================
function InputTextArea($name,$data,$def = "", $rows = 3, $cols = 20)
{
 FormatDefData($name,$data,$def);
?>
 <textarea rows="<? echo $rows; ?>" name="<? echo $name; ?>" cols="<? echo $cols; ?>"><? echo htmlentities($data); ?></textarea>
<?
}

//==========================================================================
function InputText($name,$data,$def = "", $size = 20)
{
 FormatDefData($name,$data,$def);
?>
 <input type="text" name="<? echo $name; ?>" size="<? echo $size; ?>" value="<? echo htmlentities($data); ?>">
<?
}

//==========================================================================
function InputPassword($name,$data,$def = "", $size = 20)
{
 FormatDefData($name,$data,$def);
?>
 <input type="password" name="<? echo $name; ?>" size="<? echo $size; ?>" value="<? echo htmlentities($data); ?>">
<?
}

//==========================================================================
function InputFile($name,$data,$def = "", $size = 20, $accept = "")
{
 FormatDefData($name,$data,$def);
 if(!empty($accept))
  $accept = 'ACCEPT="' . $accept . '"';
?>
 <input type="file" name="<? echo $name; ?>" size="<? echo $size; ?>" value="<? echo htmlentities($data); ?>" <? echo $accept; ?> >
<?
}


//==========================================================================
function InputCombo($name,$data,$def,$labels,$values = "")
{
 FormatDefData($name,$data,$def);

 if (empty($values))
  $values = $labels;

 $labels = explode(',',$labels);
 $values = explode(',',$values);
?>
<select name="<? echo $name; ?>" size="1">
<?
 for ($k=0; $k<count($labels);$k++)
 {?>
   <option value="<? echo $values[$k]; ?>" <? if($values[$k]==$data){ echo "selected"; } ?>><? echo $labels[$k]; ?></option>
 <?}?>
</select>
<?
}

//==========================================================================
function InputComboDB($name,$data,$def,$res)
{
 FormatDefData($name,$data,$def);
?>
<select name="<? echo $name; ?>" size="1">
<?
 while ($row = mysql_fetch_array($res))
   {
    ?>
   <option value="<? echo $row["value"]; ?>" <? if($row["value"]==$data){ echo "selected"; } ?>><? echo $row["label"]; ?></option>
    <?
   }?>
</select>
<?
}

function InputButton($name = 'Go', $data = '', $type = 'submit')
{
 FormatDefData($name,$data,$name);
 echo "<input type='$type' value='$data' name='$name'>";
}
//==========================================================================*/
function InputDay($d,$name)
{
 FormatDefData($name,$d,date('d'));
 $d = (int)$d;
 
 echo "<select NAME='$name' size='1'>\n";
 for ($k=1;$k<=31;$k++)
 {

  if ($d == $k) 
    $selected = "selected";
  else
    $selected = "";
 
  echo "<option value='$k' $selected>$k</option> \n";
 }
  echo "</select>";
}

function InputMonth($m,$name)
{
 FormatDefData($name,$m,date('m'));
 $m = (int)$m;
 
 echo "<select NAME='$name' size='1'>\n";
 for ($k=1;$k<=12;$k++)
 {

  $stamp = mktime(0,0,0,$k,1,date("Y"));
  $mm = date("M",$stamp);
  if ($m == $k) 
    $selected = "selected";
  else
    $selected = "";
 
  echo "<option value='$k' $selected>$mm</option> \n";
 }  
  echo "</select>";
}

function InputYear($y,$name)
{
 FormatDefData($name, $y, date('Y'));
 $y = (int)$y;
 
 echo "<select NAME='$name' size='1'>\n";
 for ($k=2001;$k<=date("Y");$k++)
 {

  if ($y == $k) 
    $selected = "selected";
  else
    $selected = "";
 
  echo "<option value='$k' $selected>$k</option> \n";
 }
  echo "</select>";
}

function InputDate($f,$fieldname)
{

 $months[1]="Jan";
 $months[2]="Feb";
 $months[3]="Mar";
 $months[4]="Apr";
 $months[5]="May";
 $months[6]="Jun";
 $months[7]="Jul";
 $months[8]="Aug";
 $months[9]="Sep";
 $months[10]="Oct";
 $months[11]="Nov";
 $months[12]="Dec";

 if (empty($f['d']))
 {
   $f['d'] = date ("d"); 
   $f['m'] = date ("m");
   $f['y'] = date ("Y");
 };


?>
     <select NAME="<? echo $fieldname; ?>[m]" size="1">
       <?
      //======= FROM month ======
      for ($k=1;$k<=12;$k++)
      {
      ?>
        <option value="<? echo $k; ?>" <? if ($f[m] == $k) { echo "selected"; } ?>><? echo $months[$k]; ?></option>
      <?
      };
      //=====================
      ?>
      </select>

      <select NAME="<? echo $fieldname; ?>[d]" size="1">
      <?
      //======= FROM Day ======
      for ($k=1;$k<=31;$k++)
      {
      ?>
        <option value="<? echo $k; ?>" <? if ($f[d] == $k) { echo "selected"; } ?>><? echo $k; ?></option>
      <?
      };
      //=====================
      ?>

      </select> <select NAME="<? echo $fieldname; ?>[y]" size="1">

      <?
      //======= FROM year ======
      for ($k=2001;$k<=date("Y");$k++)
      {
      ?>
        <option value="<? echo $k; ?>" <? if ($f[y] == $k) { echo "selected"; } ?>><? echo $k; ?></option>
      <?
      };
      //=====================
      ?>
      </select>
<?
}


//==========================================================================*/
function AddKey($field,$value,&$fields, &$values, $DBmode, $type = "string")
{
 if ($type == "auto")
 {
  if (strtoupper($value)=="NULL")
   $type = "NULL";
  else
  $type = gettype($value);
 }

 switch ($type)
 {
  case "NULL"    :
  case "null"    :
  case "double"  :
  case "integer" :
  case "integer" : $doStr = "";
                   break;
  case "string"  :
  default        : $value=addslashes($value);
                   $doStr = "'";
 }

 $DBmode = strtoupper($DBmode);
 
 if ($DBmode=="UPDATE")
 {
  if (!empty($values))
   $values .= ",";
  $values .=  $field . " = $doStr" . $value . "$doStr ";
 }
 else
 {

  if (!empty($fields))
   $fields .= ",";

  if (!empty($values))
   $values .= ",";

  $fields .=  $field;
  $values .= "$doStr" . $value . "$doStr ";
 }

}

//========================= --[ END ]-- ====================================
?>
file is not writable and has a php extension functions.php
reading data <?
function Preparesong(&$song)
{
 global $picture_na, $picture_dir, $sam, $stationid;

 Def($song["id"],0);
 Def($song["songid"],$song["id"]); 
 Def($song["artist"],"");
 Def($song["title"],"");
 Def($song["album"],"");
 Def($song["duration"],-1);
 Def($song["picture"],"");
 Def($song["buycd"],"");
 Def($song["website"],"");

 if(empty($song["picture"])) 
  {
   $song["picture"] = $picture_na;
   $song["haspicture"] = false;
  }
 else
  {
   $song["picture"] = $picture_dir.$song["picture"];
   $song["haspicture"] = true;
  }
  
 //Make Artist+Tile combination
 if(empty($song["artist"])) 
  $song["combine"] = $song["title"];
 else
  $song["combine"] = $song["artist"] . " - ". $song["title"];
  
 $ss = round($song["duration"] / 1000);
 $mm = (int)($ss / 60);
 $ss = ($ss % 60);
 if($ss<10) $ss="0$ss";
 $song["mmss"] = "$mm:$ss";
 
  
 //Make a link that will search for the best place to buy the CD 
 if(empty($song["buycd"])) 
  {
   $data = "http://www.audiorealm.com/findcd.html?artist=#artist#&title=#title#&album=#album#";
   $song["buycd"] = FillData($song,$data);
  }
  
 //Make a link to search for the artist homepage
 if(empty($song["website"])) 
  {
   $data = "http://www.audiorealm.com/findwebsite.html?artist=#artist#&title=#title#&album=#album#";
   $song["website"] = FillData($song,$data);
  }
  
  //Make a request link 
  $song["request"] = "javascript:request($song[songid])";

}

?>
file is not writable and has a php extension xml.php
reading data <?
//XML handling routines
function GetChildren($vals, &$i)
{
  while($i < count($vals))
  {

    switch ($vals[$i]['type'])
      {
        //case 'cdata':
		case 'complete' :
		if(isset($vals[$i]['attributes']))
		{
			$value = array("attributes" => $vals[$i]['attributes'],
			      "value" => $vals[$i]['value']);
		}
		else
		{
			$value = array("value" => $vals[$i]['value']);
		}
		 $name = $vals[$i]['tag'];
         $children["$name"][] = $value; 
		 
		break;
		
		case 'open'     : 
		 $siblings = GetChildren($vals, ++$i);
		if(isset($vals[$i]['attributes']))
		  {
			$siblings['attributes'] = $vals[$i]['attributes'];
		  }
		 
		 $name = $vals[$i]['tag'];
         $children["$name"][] = $siblings;
		 
		 /*
		 array_push($children,
		  array("attributes" => $vals[$i]['attributes'],
		  "children" => GetChildren($vals, ++$i))
		  );
		  */
		break;
		
		case 'close'    :
		 return $children;
		break;
		
		default : 	 
		 echo "XML error, Unsupported tag type: " . $vals[$i]['type'] . "<br>";
	 }
	
	$i++;
  }
  
 return $children; 
}
  
  function GetXMLTree($data, $uppercase = 1)
  {
    $p = xml_parser_create();
    xml_parser_set_option($p, XML_OPTION_SKIP_WHITE, 1);
	xml_parser_set_option($p, XML_OPTION_CASE_FOLDING, $uppercase);
	
    xml_parse_into_struct($p, $data, $vals, $index);
    xml_parser_free($p);

    $tree = array();
    $i = 0;

    $tree = GetChildren($vals, $i);
	
    return $tree;
  }
  
//######################################################  
//######################################################
  
function CompackTree($data)
{

 reset($data);
 while(list($key, $value) = each($data))
 {
 
  if(is_array($value))
  {
  
   //SPECIAL HANDLING
   //Make Attributes the Values if value empty
  if(isset($value['attributes']))
   if(is_array($value['attributes']))
    if(!isset($value['value']))
	 {
	   $leaf["$key"] = $value['attributes'];
	   continue;
	 }
   
   $c = count($value);
   
   if($c>1)
   {
    //REMOVE empty Attributes if Value is valid
    if(!((isset($value['attributes'])) && (is_array($value['attributes']))) && (isset($value['value'])))
	  $leaf["$key"] = $value['value'];
	 else
      $leaf["$key"] = CompackTree($value);
   }
   else
   {
     $temp = $value[0];
	 //REMOVE empty Attributes if Value is valid
	if(isset($temp['attributes']))
	{
	 if(!is_array($temp['attributes']) && (isset($temp['value'])))
	  $leaf["$key"] = $temp['value'];
	 else $leaf["$key"] = CompackTree($temp);
	} else if(isset($temp['value']))
		$leaf["$key"] = $temp['value'];
		else $leaf["$key"] = CompackTree($temp);
   }
   
  } 
  else
   $leaf["$key"] = $value;
	 
 }	// while loop
 
 return $leaf;
}
  
  
function XMLToArray($data, $uppercase = 1)
{
 $tree = GetXMLTree($data, $uppercase);
 return CompackTree($tree);
}

function XML2Array($data, $uppercase = 1)
{
 return XMLToArray($data, $uppercase);
}

function XML2Arr($data, $uppercase = 1)
{
 return XMLToArray($data, $uppercase);
}

//######################################################
//######################################################
function ChildKeyIsNum($data)
{
  if(!is_array($data))
   return false;
   
  reset($data);
  list($key, $value) = each($data);
  if(is_numeric($key))
   return true;
  else
   return false;
}

function MakeAttr($data)
{
 if(!is_array($data))
  return "";

 $attr = " ";
 reset($data);
 while(list($key, $value) = each($data)){
   $attr .= " $key=\"$value\"";	 
 }	// while loop

 return $attr;
}

function ArrayToXML($data, $parent = "")
{
 if(empty($parent))
  $xml = '<?xml version="1.0"?>';
 else 
  $xml = "";
  
  reset($data);
  while(list($key, $value) = each($data))
  {
   $attr = "";
   
   if(is_numeric($key))
   {
     $key = $parent;
	 
	 if(!empty($value['attributes']))
   	  $attr = MakeAttr($value['attributes']);
     unset($value['attributes']);
   };
    
	
   if(ChildKeyIsNum($value))
 	$xml .= ArrayToXML($value,$key);
   else if(is_array($value))
    {
      $xml .= "<$key$attr>";
       $xml .= ArrayToXML($value,$key);
	  $xml .= "</$key$attr>";
    }
     else
       $xml .= "<$key$attr>$value</$key>";
  }//while
  
 return $xml;  
}

function Array2XML($data, $parent = "")
{
 return ArrayToXML($data, $parent);
}

function Arr2XML($data, $parent = "")
{
 return ArrayToXML($data, $parent);
}
//######################################################
//######################################################
  

function Keys2Lower($a)
{
 if(!is_array($a))
  return $a;
 
 unset($res);
 
 reset($a);
 while(list($key, $value) = each($a)){

  if(is_array($value))
   $res[strtolower($key)] = Keys2Lower($value);
  else
   $res[strtolower($key)] = $value;
	 
 }	// while loop
 
 return $res;
}

function XMLheader()
{
 header("Content-type: text/xml");
}

function EmptyNodeCleanUp(&$data)
{
 while(list($key, $val) = each($data)){
  if(is_array($val))
   $data[$key] = "";
 }	// while loop
}

function echoXML($xml)
{
  XMLheader();
  
  if(is_array($xml))
   echo Array2XML($xml);
  else
   echo $xml;
}

?>