Compare commits

...

13 Commits

Author SHA1 Message Date
Clemens Schwaighofer
a2129f91c5 White space fixes 2016-08-31 15:20:40 +09:00
Clemens Schwaighofer
adf46f620b Update class basic, bug fixes for acl unit set in login class
class basic has a simple date string format method. returns Y-m-d h:i:s
for a trimestring, optional microseconds too
bug fix for unit/edit access id check in login class
2016-08-27 13:28:42 +09:00
Clemens Schwaighofer
31bef7a531 Add default space in byte string format, only read enable ea data
read only enabled edit access data fields
add default space between the converted byte data and the label
2016-08-02 14:38:23 +09:00
Clemens Schwaighofer
20b134231e Update description for edit access data return method 2016-07-20 10:57:29 +09:00
Clemens Schwaighofer
236a415fb4 Add get edit access data value for edit access id/key pair 2016-07-20 10:56:36 +09:00
Clemens Schwaighofer
1551df058d Bug fix for Login class and read sub data for edit access block 2016-07-19 16:44:21 +09:00
Clemens Schwaighofer
f980b1e76a Bug fix: did not add new sub data entries if there are no entries
If we load data that has no sub data referenced the list was not created
2016-07-19 16:14:41 +09:00
Clemens Schwaighofer
8de868fe4a Add new direct reference data element list to edit page
An edit page can have a new type of reference data type that is not a
link between table A and main table, but a sub table to main table with
several text fields + enable field.
This sub field list can have a max set, that adds empty rows to keep max
empty list available.
The sub table filed does not need a read_data element as the read is
directly connected to the master table (uses the elemen list key name
for table and the elements as read fields).
This sub elements need to have at least one as type = text and can have
error check addded (currently unique and alphanumeric work).

Also fix all old addslashes to correct db_escape_string

Read in for reference list also can have multiple elements (read data ->
name | seperated)

All sub reads have element prefixes

Inline documentation update
2016-07-19 15:12:43 +09:00
Clemens Schwaighofer
a20df16c2c Add enable field to edit access data 2016-07-15 17:31:40 +09:00
Clemens Schwaighofer
939ff2e4a5 Update Login Class with correct acl method and edit access data read
edit access data is read and put into the unit (edit access) array
the base acl method is adjusted to the current simple flat array one
- base acl only
- no max anymore (never needed)
- page acl
- unit (edit access) acl list + detail data
2016-07-15 16:17:40 +09:00
Clemens Schwaighofer
1c3cc95fdb Update form class and edit access table array
Form class has new check part for alpha numeric with spaces called
"alphanumericspace".

edit access table array gets update for making color no longer mandatory
(almost never used).
And adds alpha numeric with spaces and unique check for the name.
2016-07-15 11:40:42 +09:00
Clemens Schwaighofer
115e9ad700 Add edit access automatic UID set psql function
Trigger that gets called when edit access table is insert or update
called.

UID is set by removing all white spaces.
Original name set is already checked for Alphanumeric with spaces and
unique check.

On Insert always set UID.
On Update only set if UID is not set yet.
2016-07-15 11:37:45 +09:00
Clemens Schwaighofer
3aaa9b3f0d Remove old SVN $id$, add edit_access_data table
edit_access_data table can hold name/value pairs for additional info in
the access group
2016-07-15 10:13:29 +09:00
59 changed files with 576 additions and 367 deletions

View File

@@ -1,6 +1,5 @@
#!/bin/bash
# $Id: create_default_trigger.sh 3158 2010-09-02 02:49:00Z gullevek $
# creates the default on update trigger for the inherited generic tables (date/name)
orig_file="../tmpl/trigger.tmpl"

View File

@@ -1,6 +1,5 @@
#!/bin/bash
# $Id: drop_data.sh 3158 2010-09-02 02:49:00Z gullevek $
# quick hack for import
#echo "EXIT";

View File

@@ -1,7 +1,5 @@
#!/bin/bash
# $Id: drop_reload.sh 3158 2010-09-02 02:49:00Z gullevek $
rm error;
rm output;
bin/drop_data.sh;

View File

@@ -1,6 +1,5 @@
#!/bin/bash
# $Id: import_data.sh 4382 2013-02-18 07:27:24Z gullevek $
# quick hack for import
#echo "EXIT";

View File

@@ -0,0 +1,28 @@
-- add uid add for edit_access table
CREATE OR REPLACE FUNCTION set_edit_access_uid() RETURNS TRIGGER AS
$$
DECLARE
myrec RECORD;
v_uid VARCHAR;
BEGIN
-- skip if NEW.name is not set
IF NEW.name IS NOT NULL AND NEW.name <> '' THEN
-- use NEW.name as base, remove all spaces
-- name data is already unique, so we do not need to worry about this here
v_uid := REPLACE(NEW.name, ' ', '');
IF TG_OP = 'INSERT' THEN
-- always set
NEW.uid := v_uid;
ELSIF TG_OP = 'UPDATE' THEN
-- check if not set, then set
SELECT INTO myrec t.* FROM edit_access t WHERE edit_access_id = NEW.edit_access_id;
IF FOUND THEN
NEW.uid := v_uid;
END IF;
END IF;
END IF;
RETURN NEW;
END;
$$
LANGUAGE 'plpgsql';

View File

@@ -1,4 +1,3 @@
-- $Id: update_function.sql 3158 2010-09-02 02:49:00Z gullevek $
-- adds the created or updated date tags
CREATE OR REPLACE FUNCTION set_generic() RETURNS TRIGGER AS '

View File

@@ -1,4 +1,3 @@
-- $Id: edit_access.sql 4382 2013-02-18 07:27:24Z gullevek $
-- AUTHOR: Clemens Schwaighofer
-- DATE: 2005/07/05
-- DESCRIPTION:

View File

@@ -0,0 +1,16 @@
-- AUTHOR: Clemens Schwaighofer
-- DATE: 2016/7/15
-- DESCRIPTION:
-- sub table to edit access, holds additional data for access group
-- TABLE: edit_access_data
-- HISTORY:
-- DROP TABLE edit_access_data;
CREATE TABLE edit_access_data (
edit_access_data_id SERIAL PRIMARY KEY,
edit_access_id INT NOT NULL,
name VARCHAR,
value VARCHAR,
enabled SMALLINT NOT NULL DEFAULT 0,
FOREIGN KEY (edit_access_id) REFERENCES edit_access (edit_access_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE
) INHERITS (edit_generic) WITHOUT OIDS;

View File

@@ -1,4 +1,3 @@
-- $Id: edit_access_right.sql 4382 2013-02-18 07:27:24Z gullevek $
-- AUTHOR: Clemens Schwaighofer
-- DATE: 2005/07/05
-- DESCRIPTION:

View File

@@ -1,4 +1,3 @@
-- $Id: edit_access_user.sql 3158 2010-09-02 02:49:00Z gullevek $
-- AUTHOR: Clemens Schwaighofer
-- DATE: 2005/07/05
-- DESCRIPTION:

View File

@@ -1,4 +1,3 @@
-- $Id: edit_generic.sql 3158 2010-09-02 02:49:00Z gullevek $
-- AUTHOR: Clemens Schwaighofer
-- DATE: 2005/07/05
-- DESCRIPTION:

View File

@@ -1,4 +1,3 @@
-- $Id: edit_group.sql 3158 2010-09-02 02:49:00Z gullevek $
-- AUTHOR: Clemens Schwaighofer
-- DATE: 2005/07/05
-- DESCRIPTION:

View File

@@ -1,4 +1,3 @@
-- $Id: edit_language.sql 3158 2010-09-02 02:49:00Z gullevek $
-- AUTHOR: Clemens Schwaighofer
-- DATE: 2005/07/05
-- DESCRIPTION:

View File

@@ -1,4 +1,3 @@
-- $Id: edit_log.sql 4382 2013-02-18 07:27:24Z gullevek $
-- AUTHOR: Clemens Schwaighofer
-- DATE: 2005/07/05
-- DESCRIPTION:

View File

@@ -1,4 +1,3 @@
-- $Id: edit_menu_group.sql 4382 2013-02-18 07:27:24Z gullevek $
-- AUTHOR: Clemens Schwaighofer
-- DATE: 2005/07/05
-- DESCRIPTION:

View File

@@ -1,4 +1,3 @@
-- $Id: edit_page.sql 4382 2013-02-18 07:27:24Z gullevek $
-- AUTHOR: Clemens Schwaighofer
-- DATE: 2005/07/05
-- DESCRIPTION:

View File

@@ -1,4 +1,3 @@
-- $Id: edit_page_access.sql 4382 2013-02-18 07:27:24Z gullevek $
-- AUTHOR: Clemens Schwaighofer
-- DATE: 2005/07/05
-- DESCRIPTION:

View File

@@ -1,4 +1,3 @@
-- $Id: edit_page_menu_group.sql 3158 2010-09-02 02:49:00Z gullevek $
-- AUTHOR: Clemens Schwaighofer
-- DATE: 2005/07/05
-- DESCRIPTION:

View File

@@ -1,4 +1,3 @@
-- $Id: edit_page_visible_group.sql 3158 2010-09-02 02:49:00Z gullevek $
-- AUTHOR: Clemens Schwaighofer
-- DATE: 2005/07/05
-- DESCRIPTION:

View File

@@ -1,4 +1,3 @@
-- $Id: edit_query_string.sql 3158 2010-09-02 02:49:00Z gullevek $
-- AUTHOR: Clemens Schwaighofer
-- DATE: 2005/07/05
-- DESCRIPTION:

View File

@@ -1,4 +1,3 @@
-- $Id: edit_scheme.sql 3158 2010-09-02 02:49:00Z gullevek $
-- AUTHOR: Clemens Schwaighofer
-- DATE: 2005/07/05
-- DESCRIPTION:

View File

@@ -1,4 +1,3 @@
-- $Id: edit_temp_files.sql 4382 2013-02-18 07:27:24Z gullevek $
-- AUTHOR: Clemens Schwaighofer
-- DATE: 2005/07/08
-- DESCRIPTION:

View File

@@ -1,4 +1,3 @@
-- $Id: edit_user.sql 4226 2012-11-02 07:19:57Z gullevek $
-- AUTHOR: Clemens Schwaighofer
-- DATE: 2005/07/06
-- DESCRIPTION:

View File

@@ -1,4 +1,3 @@
-- $Id: edit_visible_group.sql 4382 2013-02-18 07:27:24Z gullevek $
-- AUTHOR: Clemens Schwaighofer
-- DATE: 2005/07/05
-- DESCRIPTION:

View File

@@ -1,4 +1,3 @@
-- $Id: generic.sql 3158 2010-09-02 02:49:00Z gullevek $
-- AUTHOR: Clemens Schwaighofer
-- DATE: 2005/07/05
-- DESCRIPTION:

View File

@@ -1,5 +1,3 @@
-- $Id: trg_edit_access.sql 3158 2010-09-02 02:49:00Z gullevek $
-- DROP TRIGGER trg_edit_access ON edit_access;
CREATE TRIGGER trg_edit_access
BEFORE INSERT OR UPDATE ON edit_access

View File

@@ -0,0 +1,4 @@
-- DROP TRIGGER trg_edit_access_data ON edit_access_data;
CREATE TRIGGER trg_edit_access_data
BEFORE INSERT OR UPDATE ON edit_access_data
FOR EACH ROW EXECUTE PROCEDURE set_generic();

View File

@@ -1,5 +1,3 @@
-- $Id: trg_edit_access_right.sql 3158 2010-09-02 02:49:00Z gullevek $
-- DROP TRIGGER trg_edit_access_right ON edit_access_right;
CREATE TRIGGER trg_edit_access_right
BEFORE INSERT OR UPDATE ON edit_access_right

View File

@@ -1,5 +1,3 @@
-- $Id: trg_edit_access_user.sql 3158 2010-09-02 02:49:00Z gullevek $
-- DROP TRIGGER trg_edit_access_user ON edit_access_user;
CREATE TRIGGER trg_edit_access_user
BEFORE INSERT OR UPDATE ON edit_access_user

View File

@@ -1,5 +1,3 @@
-- $Id: trg_edit_group.sql 3158 2010-09-02 02:49:00Z gullevek $
-- DROP TRIGGER trg_edit_group ON edit_group;
CREATE TRIGGER trg_edit_group
BEFORE INSERT OR UPDATE ON edit_group

View File

@@ -1,5 +1,3 @@
-- $Id: trg_edit_language.sql 3158 2010-09-02 02:49:00Z gullevek $
-- DROP TRIGGER trg_edit_language ON edit_language;
CREATE TRIGGER trg_edit_language
BEFORE INSERT OR UPDATE ON edit_language

View File

@@ -1,5 +1,3 @@
-- $Id: trg_edit_log.sql 3158 2010-09-02 02:49:00Z gullevek $
-- DROP TRIGGER trg_edit_log ON edit_log;
CREATE TRIGGER trg_edit_log
BEFORE INSERT OR UPDATE ON edit_log

View File

@@ -1,5 +1,3 @@
-- $Id: trg_edit_menu_group.sql 3158 2010-09-02 02:49:00Z gullevek $
-- DROP TRIGGER trg_edit_visible_group ON edit_visible_group;
CREATE TRIGGER trg_edit_menu_group
BEFORE INSERT OR UPDATE ON edit_menu_group

View File

@@ -1,5 +1,3 @@
-- $Id: trg_edit_page.sql 3158 2010-09-02 02:49:00Z gullevek $
-- DROP TRIGGER trg_edit_page ON edit_page;
CREATE TRIGGER trg_edit_page
BEFORE INSERT OR UPDATE ON edit_page

View File

@@ -1,5 +1,3 @@
-- $Id: trg_edit_page_access.sql 3158 2010-09-02 02:49:00Z gullevek $
-- DROP TRIGGER trg_edit_page_access ON edit_page_access;
CREATE TRIGGER trg_edit_page_access
BEFORE INSERT OR UPDATE ON edit_page_access

View File

@@ -1,5 +1,3 @@
-- $Id: trg_edit_query_string.sql 3158 2010-09-02 02:49:00Z gullevek $
-- DROP TRIGGER trg_edit_query_string ON edit_query_string;
CREATE TRIGGER trg_edit_query_string
BEFORE INSERT OR UPDATE ON edit_query_string

View File

@@ -1,5 +1,3 @@
-- $Id: trg_edit_scheme.sql 3158 2010-09-02 02:49:00Z gullevek $
-- DROP TRIGGER trg_edit_scheme ON edit_scheme;
CREATE TRIGGER trg_edit_scheme
BEFORE INSERT OR UPDATE ON edit_scheme

View File

@@ -1,5 +1,3 @@
-- $Id: trg_edit_user.sql 3158 2010-09-02 02:49:00Z gullevek $
-- DROP TRIGGER trg_edit_user ON edit_user;
CREATE TRIGGER trg_edit_user
BEFORE INSERT OR UPDATE ON edit_user

View File

@@ -1,5 +1,3 @@
-- $Id: trg_edit_visible_group.sql 3158 2010-09-02 02:49:00Z gullevek $
-- DROP TRIGGER trg_edit_visible_group ON edit_visible_group;
CREATE TRIGGER trg_edit_visible_group
BEFORE INSERT OR UPDATE ON edit_visible_group

View File

@@ -0,0 +1,4 @@
-- DROP TRIGGER trg_set_edit_access_uid ON edit_access;
CREATE TRIGGER trg_set_edit_access_uid
BEFORE INSERT OR UPDATE ON edit_access
FOR EACH ROW EXECUTE PROCEDURE set_edit_access_uid();

View File

@@ -5,7 +5,7 @@
$DB_DEBUG = 1;
if ($DEBUG_ALL)
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
define('USE_DATABASE', true);
// sample config
@@ -28,10 +28,12 @@
// set + check edit access id
$edit_access_id = 3;
print "ACL UNIT: ".print_r(array_keys($login->acl['unit']), 1)."<br>";
print "ACCESS CHECK: ".$login->login_check_edit_access($edit_access_id)."<br>";
if ($login->login_check_edit_access($edit_access_id))
$basic->edit_access_id = $edit_access_id;
else
$basic->edit_access_id = $login->acl['info']['default_edit_access'];
$basic->edit_access_id = $login->acl['unit_id'];
// $basic->debug('SESSION', $basic->print_ar($_SESSION));

View File

@@ -9,7 +9,7 @@
* - edit_pages.php
* - edit_schemes.php
* - edit_users.php
* - edit_visible_group.php
* - edit_visible_group.php
* HISTORY:
* 2005/06/30 (cs) remove color settings, they are in CSS File now
* 2005/06/22 (cs) moved load of config array into form class, set lang and lang is must set var for form class; removed the page name setting, moved it into the form class, remove all HTML from main page
@@ -107,15 +107,15 @@
}
// log backend data
// data part creation
$data = array (
'_SESSION' => $_SESSION,
'_GET' => $_GET,
'_POST' => $_POST,
'_FILES' => $_FILES
);
// log action
EditLog('Edit Submit', serialize($data));
// data part creation
$data = array (
'_SESSION' => $_SESSION,
'_GET' => $_GET,
'_POST' => $_POST,
'_FILES' => $_FILES
);
// log action
EditLog('Edit Submit', serialize($data));
$form->form_procedure_load(${$form->archive_pk_name});
$form->form_procedure_new();
@@ -310,12 +310,15 @@
$elements[] = $form->form_create_element("name");
$elements[] = $form->form_create_element("color");
$elements[] = $form->form_create_element("description");
// add name/value list here
$elements[] = $form->form_show_list_table("edit_access_data");
break;
break;
default:
print "NO NO NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO!";
break;
}
//$form->debug('edit', "Elements: <pre>".$form->print_ar($elements));
// $form->debug('edit', "Elements: <pre>".$form->print_ar($elements));
$DATA['elements'] = $elements;
$DATA['hidden'] = $form->form_create_hidden_fields();
$DATA['save_delete'] = $form->form_create_save_delete();

View File

@@ -67,7 +67,7 @@
$smarty->setTemplateDir(TEMPLATES.DEFAULT_TEMPLATE);
$DATA['css'] = CSS.DEFAULT_TEMPLATE;
$DATA['js'] = JS.DEFAULT_TEMPLATE;
}
}
// order name is _always_ order_number for the edit interface

View File

@@ -155,7 +155,7 @@
if (!$error)
{
if ($_FILES['file_up']['name'])
{
{
$mime_type = $_FILES['file_up']['type'];
$file_size = $_FILES['file_up']['size'];
$file_name = $_FILES['file_up']['name'];

View File

@@ -64,6 +64,8 @@
$cms->menu_show_flag = 'main';
// db nfo
$cms->db_info();
// set acl
$cms->acl = $login->acl;
//------------------------------ class init end
//------------------------------ logging start

View File

@@ -95,7 +95,7 @@
if (!is_dir($cms->pictures))
$cms->pictures = LAYOUT.DEFAULT_TEMPLATE.PICTURES.'/';
if (!is_dir($cms->cache_pictures))
$cms->cache_pictures = LAYOUT.DEFAULT_TEMPLATE.CACHE.IMAGES.'/';
$cms->cache_pictures = LAYOUT.DEFAULT_TEMPLATE.CACHE.IMAGES.'/';
// if the template_dir is != DEFAULT_TEMPLATE, then try to make a lang switch
// if the default lang is not like the lang given, switch lang

View File

@@ -10,7 +10,8 @@
"value" => $GLOBALS["name"],
"output_name" => $this->l->__("Access Group Name"),
"mandatory" => 1,
"type" => "text"
"type" => "text",
"error_check" => "alphanumericspace|unique"
),
"description" => array (
"value" => $GLOBALS["description"],
@@ -20,7 +21,7 @@
"color" => array (
"value" => $GLOBALS["color"],
"output_name" => $this->l->__("Color"),
"mandatory" => 1,
"mandatory" => 0,
"type" => "text",
"size" => 6,
"length" => 6,
@@ -28,7 +29,6 @@
"error_regex" => "/[\dA-Fa-f]{6}/",
"error_example" => "F6A544"
)
),
"table_name" => "edit_access",
"load_query" => "SELECT edit_access_id, name FROM edit_access ORDER BY name",
@@ -36,6 +36,43 @@
array (
"name" => "name"
)
),
"element_list" => array (
"edit_access_data" => array (
"output_name" => "Edit Access Data",
"type" => "reference_data", # is not a sub table read and connect, but only a sub table with data
"max_empty" => 5, # maxium visible if no data is set, if filled add this number to visible
"prefix" => "ead",
"elements" => array (
"edit_access_data_id" => array (
"output_name" => "Activate",
"type" => "hidden",
"int" => 1,
"pk_id" => 1
),
"name" => array (
"type" => "text",
"error_check" => "alphanumeric|unique",
"output_name" => "Name"
),
"value" => array (
"type" => "text",
"output_name" => "Value"
),
"enabled" => array (
"type" => "checkbox",
"output_name" => "Activate",
"int" => 1,
"element_list" => array(1)
),
"edit_access_id" => array (
"int" => 1,
"type" => "hidden",
"fk_id" => 1 # reference main key from master table above
)
)
)
)
);
?>

View File

@@ -8,7 +8,6 @@
* with your name on it ...
* DESCRIPTION
* Basic Admin interface backend
* - sets ACLs
* - sets action flags
* - menu creation
* - array vars for smarty
@@ -45,11 +44,8 @@
public $action_loaded;
public $action_value;
public $action_error;
// DEPRICATED -> use login acl
// public $page_acl; // the acl the user has on this page
// public $default_acl;
// DEPRICATED access rights
// public $access_rights = array ();
// ACL array variable if we want to set acl data from outisde
public $acl = array ();
// the current active edit access id
public $edit_access_id;
// error/warning/info messages
@@ -370,7 +366,8 @@
$string = $this->l->__('Year').' ';
$string .= '<select id="year'.$suffix.'" name="year'.$suffix.'" onChange="'.$on_change_call.'">';
for ($i = date("Y"); $i <= $max_year; $i ++)
{ $string .= '<option value="'.$i.'" '.(($year == $i) ? 'selected' : '').'>'.$i.'</option>';
{
$string .= '<option value="'.$i.'" '.(($year == $i) ? 'selected' : '').'>'.$i.'</option>';
}
$string .= '</select> '.$this->l->__('Month').' ';
$string .= '<select id="month'.$suffix.'" name="month'.$suffix.'" onChange="'.$on_change_call.'">';

View File

@@ -36,11 +36,11 @@
* PUBLIC METHODS
* debug -> calls with "level", "string" and flag to turn off (0) the newline at the end
* debug_for -> sets debug on/off for a type (error, echo, print) for a certain level
* print_error_msg -> prints out the error message, optional parameter is a header prefix
* print_error_msg -> prints out the error message, optional parameter is a header prefix
* fdebug -> prints line directly to debug_file.log in tmp
*
* print_time -> prints time + microtime, optional flag to turn off (0) microtime printout
* basic -> constructor
* basic -> constructor
* _basic -> desconstructor
* info -> info about that class
* running_time -> prints out the time of start/end (automatically called on created and error printout
@@ -175,7 +175,7 @@
"class_version" => "0.9.0",
"class_created" => "2003-03-24",
"class_author" => 'Clemens "Gullevek" Schwaighofer (.at)'
);
);
// set the page name
$this->page_name = $this->get_page_name();
@@ -530,8 +530,8 @@
$traces = debug_backtrace();
// extended info (later)
/*
* $file = $trace[$level]['file'];
* $line = $trace[$level]['line'];
* $file = $trace[$level]['file'];
* $line = $trace[$level]['line'];
* $object = $trace[$level]['object'];
* if (is_object($object)) { $object = get_class($object); }
*
@@ -664,7 +664,7 @@
// to use it call with set_error_handler(array("baisc", "ErrorHandler"));
// NOTE: this will only catch any additional erros created AFTER the set_error_hanlder was set, so mostly no strict/notices from the classes are visible
public static function ErrorHandler($type, $message, $file, $line, $context)
{
{
// error levels for PHP
// values based on 5.3
$error_level = array (
@@ -683,7 +683,7 @@
4096 => 'E_RECOVERABLE_ERROR', // since 5.2
8192 => 'E_DEPRICATED', // since 5.3
16384 => 'E_USER_DEPRICATED', // since 5.3
30719 => 'E_ALL' // 6143 in 5.2, 2047 in previous versions
30719 => 'E_ALL' // 6143 in 5.2, 2047 in previous versions
);
$fn = ROOT.LOG.'php_errors-'.date('Y-m-d').'.log';
@@ -733,7 +733,7 @@
// tries to find mailto:user@bubu.at and changes it into -> <a href="mailto:user@bubu.at">E-Mail senden</a>
// or tries to take any url (http, ftp, etc) and transform it into a valid URL
// the string is in the format: some url|name#css|, same for email
public function magic_links($string, $target = "_blank")
public function magic_links($string, $target = "_blank")
{
$output = $string;
$protList = array("http", "https", "ftp", "news", "nntp");
@@ -761,13 +761,13 @@
// _1: URL or email
// _2: atag (>)
// _3: (_1) part of url or email [main url or email pre @ part]
// _4: (_2) parameters of url or email post @ part
// _4: (_2) parameters of url or email post @ part
// _5: (_3) parameters of url or tld part of email
// _7: link name/email link name
// _9: style sheet class
$self = $this;
// $this->debug('URL', 'Before: '.$output);
$output = preg_replace_callback("/(href=\")?(\>)?\b($protRegex)([\w\.\-?&=+%#~,;\/]+)\b([\.\-?&=+%#~,;\/]*)(\|([^\||^#]+)(#([^\|]+))?\|)?/",
$output = preg_replace_callback("/(href=\")?(\>)?\b($protRegex)([\w\.\-?&=+%#~,;\/]+)\b([\.\-?&=+%#~,;\/]*)(\|([^\||^#]+)(#([^\|]+))?\|)?/",
function ($matches) use ($self)
{
return @$self->create_url($matches[1], $matches[2], $matches[3], $matches[4], $matches[5], $matches[7], $matches[9]);
@@ -775,17 +775,17 @@
$output
);
// find email-addresses, but not mailto prefix ones
$output = preg_replace_callback("/(mailto:)?(\>)?\b([\w\.-]+)@([\w\.\-]+)\.([a-zA-Z]{2,4})\b(\|([^\||^#]+)(#([^\|]+))?\|)?/",
$output = preg_replace_callback("/(mailto:)?(\>)?\b([\w\.-]+)@([\w\.\-]+)\.([a-zA-Z]{2,4})\b(\|([^\||^#]+)(#([^\|]+))?\|)?/",
function ($matches) use ($self)
{
return @$self->create_email($matches[1], $matches[2], $matches[3], $matches[4], $matches[5], $matches[7], $matches[9]);
},
},
$output
);
$this->debug('URL', 'After: '.$output);
// // we have one slashes after the Protocol -> internal link no domain, strip out the proto
// $output = preg_replace("/($protRegex)\/(.*)/e", "\\2", $ouput);
// $output = preg_replace("/($protRegex)\/(.*)/e", "\\2", $ouput);
// $this->debug('URL', "$output");
// post processing
@@ -798,7 +798,7 @@
}
// METHOD create_url [INTERNAL]
// PARAMS url link, anchor tag (define both type or url),
// PARAMS url link, anchor tag (define both type or url),
// _1, _2, _3 = part of thel URL, if atag is set, _1 is not used
// target: link target, name: name for the url, if not given _2 + _3 is used
// class: style sheet
@@ -813,7 +813,7 @@
if (preg_match("/\/\/$/", $_1) && preg_match("/^\//", $_2))
{
$_1 = '';
$target = '';
$target = '';
}
else
{
@@ -943,7 +943,7 @@
// haystack (search in)
// key: the key to look for in
// path: recursive call for previous path
// RETURN all array elements paths where the element was found
// RETURN all array elements paths where the element was found
// DESCRIPTION
// recursive array search function, which returns all found not only the first one
public static function array_search_recursive_all($needle, $haystack, $key, $path = NULL)
@@ -993,20 +993,20 @@
// DESCRIPTION
// array search simple. looks for key, value combination, if found, returns true
public static function array_search_simple($array, $key, $value)
{
{
if (!is_array($array))
$array = array ();
foreach ($array as $_key => $_value)
{
{
// if value is an array, we search
if (is_array($_value))
{
{
// call recursive, and return result if it is true, else continue
if (($result = basic::array_search_simple($_value, $key, $value)) !== false)
return $result;
}
elseif ($_key == $key && $_value = $value)
{
{
return true;
}
}
@@ -1049,17 +1049,17 @@
}
// METHOD: ByteStringFormat
// PARAMS: int
// PARAMS: int bytes, boolean for space, default is set
// RETURN: string
// DESC: converts bytes into formated string with KB, MB, etc
public static function ByteStringFormat($number)
public static function ByteStringFormat($number, $space = true)
{
if (is_numeric($number) && $number > 0)
{
// labels in order of size
$labels = array('B', 'KB', 'MB', 'GB', 'TB');
// calc file size, round down too two digits, add label based max change
return round($number / pow(1024, ($i = floor(log($number, 1024)))), 2).''.$labels[$i];
return round($number / pow(1024, ($i = floor(log($number, 1024)))), 2).($space ? ' ' : '').$labels[$i];
}
return $number;
}
@@ -1081,6 +1081,20 @@
return $number;
}
// METHOD: DateStringFormat
// PARAMS: unix timestamp, true/false to show microtime
// RETURN: string formated date+time in Y-M-D h:m:s
// DESC : a simple wrapper for the date format
public static function DateStringFormat($timestamp, $show_micro = true)
{
list ($timestamp, $ms) = explode('.', round($timestamp, 4));
if ($show_micro)
$string = date("Y-m-d H:i:s", $timestamp).' '.$ms.'ms';
else
$string = date("Y-m-d H:i:s", $timestamp);
return $string;
}
// METHOD: TimeStringFormat
// PARAMS: seconds
// RETURN: formated time string
@@ -1557,7 +1571,7 @@
// RETURN: random string
// DESC: creates a random string from alphanumeric characters: A-Z a-z 0-9 ./
private function cryptSaltString($nSize = 22)
{
{
// A-Z is 65,90
// a-z is 97,122
// 0-9 is 48,57
@@ -1566,7 +1580,7 @@
$max = array (57, 90, 122);
$chars = array ();
for ($i = 0; $i < count($min); $i ++)
{
{
for ($j = $min[$i]; $j <= $max[$i]; $j ++)
{
$chars[] = chr($j);
@@ -1576,9 +1590,9 @@
$max_rand = count($chars) - 1;
// create the salt part
for ($i = 1; $i <= $nSize; $i ++)
{
{
$salt_string .= $chars[mt_rand(0, $max_rand)];
}
}
return $salt_string;
}
@@ -1745,12 +1759,12 @@
$L = round((($MAX + $MIN) / 2) * 100);
if ($MIN == $MAX)
{
{
// H, S, L
return array(0, 0, $L);
}
else
{
{
// HUE to 0~360
if ($r == $MAX)
$HUE = ($g - $b) / ($MAX - $MIN);
@@ -1783,11 +1797,11 @@
return array($l * 255, $l * 255, $l * 255);
}
else
{
{
$m2 = ($l < 0.5) ? $l * ($s + 1) : ($l + $s) - ($l * $s);
$m1 = $l * 2 - $m2;
$hue = function ($base) use ($m1, $m2)
{
{
// base = hue, hue > 360 (1) - 360 (1), else < 0 + 360 (1)
$base = ($base < 0) ? $base + 1 : (($base > 1) ? $base - 1 : $base);
// 6: 60, 2: 180, 3: 240
@@ -1855,13 +1869,13 @@
// DESC: guesses the email type (mostly for mobile) from the domain
// if second is set to true, it will return short naming scheme (only provider)
public function getEmailType($email, $short = false)
{
{
// trip if there is no email address
if (!$email)
return "invalid";
// loop until we match a mobile type, return this first found type
foreach ($this->mobile_email_type as $email_regex => $email_type)
{
{
if (preg_match("/$email_regex/", $email))
{
if ($short)

View File

@@ -15,7 +15,7 @@
* PUBLIC VARIABLES
*
* PRIVATE VARIABLES
*
*
* PUBLIC METHODS
*
* PRIVATE METHODS
@@ -123,14 +123,14 @@
$text = str_replace('&gt;', '>', $text);
$text = str_replace('&amp;', '&', $text);
$text = str_replace('&quot;', '"', $text);
$text = str_replace('&#039;', "'", $text);
$text = str_replace('&#039;', "'", $text);
return $text;
}
// METHOD db_dump_array
// PARAMS none
// RETURN returns the current array
// DESC dumps the current data
// DESC dumps the current data
public function db_dump_array($write = 0)
{
reset($this->table_array);
@@ -220,11 +220,11 @@
if (file_exists($this->table_array[$column]["path"].$dateiname))
unlink($this->table_array[$column]["path"].$dateiname);
}
if ($this->table_array[$column]["fk"])
{
// zusammenstellen der FKs
if ($q_where)
if ($q_where)
$q_where .= " AND ";
$q_where .= $column." = ".$this->table_array[$column]["value"];
}
@@ -235,13 +235,13 @@
// attach fk row if there ...
if ($q_where)
$q .= " AND ".$q_where;
// if 0, error
// if 0, error
unset ($this->pk_id);
if (!$this->db_exec($q))
{
$this->error_id=22;
$this->_db_error();
}
}
return $this->table_array;
}
@@ -257,11 +257,11 @@
if (!$this->db_check_pk_set())
return $this->table_array;
reset($this->table_array);
// create select part & addition FK part
// create select part & addition FK part
while (list($column, $data_array)=each($this->table_array))
{
if ($q_select)
$q_select .= ", ";
if ($q_select)
$q_select .= ", ";
$q_select .= $column;
// check FK ...
@@ -272,7 +272,7 @@
$q_where .= $column .= " = ".$this->table_array[$column]["value"];
}
}
$q = "SELECT ";
$q .= $q_select;
$q .= " FROM ".$this->table_name." WHERE ";
@@ -284,7 +284,7 @@
if ($this->db_exec($q))
{
if ($res = $this->db_fetch_array())
{
{
reset($this->table_array);
while (list($column, $data_array) = each($this->table_array))
{
@@ -326,7 +326,7 @@
{
if (is_array($table_array))
$this->table_array = $table_array;
// PK ID check
// PK ID check
// if ($this->pk_id && !$this->table_array[$this->pk_name]["value"])
// $this->table_array[$this->pk_name]["value"]=$this->pk_id;
// checken ob PKs gesetzt, wenn alle -> update, wenn keiner -> insert, wenn ein paar -> ERROR!
@@ -351,7 +351,7 @@
unset($this->table_array[$column]["delete"]);
if (file_exists($this->table_array[$column]["path"].$this->table_array[$column]["value"]))
unlink($this->table_array[$column]["path"].$this->table_array[$column]["value"]);
$dateiname = str_replace("_tn", "", $this->table_array[$column]["value"]);
$dateiname = str_replace("_tn", "", $this->table_array[$column]["value"]);
if (file_exists($this->table_array[$column]["path"].$dateiname))
unlink($this->table_array[$column]["path"].$dateiname);
$this->table_array[$column]["value"] = "";
@@ -376,7 +376,7 @@
copy($this->table_array[$column]["tmp"], $this->table_array[$column]["path"].$dateiname);
// automatisch thumbnail generieren, geht nur mit convert (ImageMagic!!!), aber nur bei bild ..
if (strtolower($ext) == "jpeg" || strtolower($ext) == "jpg" || strtolower($ext) == "gif" || strtolower($ext) == "png")
{
{
$dateiname_tn = $name.$pk_ids_file."_tn.".$ext;
$eingang = $this->table_array[$column]["path"].$dateiname;
$ausgang = $this->table_array[$column]["path"].$dateiname_tn;
@@ -403,7 +403,7 @@
$this->table_array[$column]["value"] = $this->table_array[$column]["HIDDEN_value"];
if (!$insert)
{
if (strlen($q_data))
if (strlen($q_data))
$q_data .= ", ";
$q_data .= $column." = ";
}
@@ -444,7 +444,7 @@ $this->debug('write_check', "[$column][".$this->table_array[$column]["value"]."]
if ($addslashes)
$q_data .= $this->db_escape_string($this->convert_entities($this->table_array[$column]["value"]));
else
$q_data .= addslashes($this->table_array[$column]["value"]);
$q_data .= $this->db_escape_string($this->table_array[$column]["value"]);
$q_data .= "'";
}
}
@@ -453,7 +453,7 @@ $this->debug('write_check', "[$column][".$this->table_array[$column]["value"]."]
// NOW get PK, and FK settings (FK only for update query)
// get it at the end, cause now we can be more sure of no double IDs, etc
reset($this->table_array);
// create select part & addition FK part
// create select part & addition FK part
while (list($column, $data_array) = each($this->table_array))
{
// check FK ...
@@ -491,7 +491,7 @@ $this->debug('write_check', "[$column][".$this->table_array[$column]["value"]."]
{
$q = "INSERT INTO ".$this->table_name." ";
$q .= "(".$q_vars.") ";
$q .= "VALUES (".$q_data.")";
$q .= "VALUES (".$q_data.")";
// write primary key too
/* if ($q_data)
$q .= ", ";
@@ -504,7 +504,7 @@ $this->debug('write_check', "[$column][".$this->table_array[$column]["value"]."]
{
$this->error_id = 22;
$this->_db_error();
}
}
// set primary key
if ($insert)
{
@@ -513,6 +513,6 @@ $this->debug('write_check', "[$column][".$this->table_array[$column]["value"]."]
}
// return the table if needed
return $this->table_array;
}
}
} // end of class
?>

View File

@@ -7,13 +7,13 @@
* but let me know if u made changes, and please don't redistribute it
* with your name on it ...
* SHORT DESCRIPTON:
* 2013/10/10, prepare/excute were added, including auto RETURNING primary key if
* possible for any INSERT query in exec or prepare/execute, better debugging and
* data dumping. Proper string escape wrapper, special db exec writer for complex
* 2013/10/10, prepare/excute were added, including auto RETURNING primary key if
* possible for any INSERT query in exec or prepare/execute, better debugging and
* data dumping. Proper string escape wrapper, special db exec writer for complex
* array inserts in auto calls. boolean converter from postresql to php
*
* 2003/12/08, one major change: renamed db_exec_ext to db_return, as it has not
* much in common with the normal db_exec wrapper, as it was written only for
* 2003/12/08, one major change: renamed db_exec_ext to db_return, as it has not
* much in common with the normal db_exec wrapper, as it was written only for
* SELECT statements and better handling of those.
*
* 2002/12/20, extended the "simple" functionality to what I wanted
@@ -118,7 +118,7 @@
* $mixed db_return_row($query)
* - gibt die erste Zeile zurück (als array)
* $array_of_hashes db_return_array($query)
* - return an array of hashes with all data
* - return an array of hashes with all data
* db_close()
* - closes db connection and writes error_msg to global error_msg
* db_cursor_pos($query)
@@ -181,7 +181,7 @@
* 2004/07/15 (cs) changed the deconstructor to call _basic deconstructor
* 2003-06-20: added a '3' flag to db_return so NO caching is done at all (if array might get too big)
* 2003-06-19: made the error messages in DEBUG output red so they are better to see
* 2003-06-09: never started class_basic, insert this, for mobile phone detection
* 2003-06-09: never started class_basic, insert this, for mobile phone detection
* 2003-04-10: moved the error handling out of the db_pgsql.inc back to db_io class
* 2003-04-09: major change as db_io does not hold any DB specific calls anymore,
* those are loaded dynamically during class start, from a include
@@ -193,14 +193,14 @@
* changed the "shape" of class info vars to fit into extend modell
* 2003-02-13: in db_exec the setting for the last insert id was still via the function,
* changed this to call the internal PHP mysql command.
* 2003-01-28: ugly bug within creating the field_names. The array was not reseted
* 2003-01-28: ugly bug within creating the field_names. The array was not reseted
* before, and so the field for the db_exec where not correct.
* 2003-01-16: fixed a "select" check in db_exec,
* added a privet method for checking query of INSERT, UPDATE, DELETE
* 2003-01-09: code cleanups and more inline documentation
* 2003-01-08: renamed db_exec_ext to db_return for obious reasons
* added a "check for select query" for all db_return* methods
* 2003-01-08: db_return gets another functionality: if u use 1 or 2 as reset value,
* 2003-01-08: db_return gets another functionality: if u use 1 or 2 as reset value,
* the cursor will be reset BEFORE the read and no chaced data will be read.
* if you use 2, the md5 array will be kept so next read with no flag is cached,
* wheres with 1, the data gets DESTROYED at the end of the read
@@ -210,9 +210,9 @@
* 2003-01-07: fixed a small bug in return_array as he mixed up the order if you used
* SELECT * FROM ...
* 2002-12-26: changed strstr to stristr 'couse not everyone types SELECT, etc in capitals
* 2002-12-24: moved the debug output in db_return to the call if,
* 2002-12-24: moved the debug output in db_return to the call if,
* so it is only printed once
* 2002-12-20: added db_dump_data function for printing out all data in
* 2002-12-20: added db_dump_data function for printing out all data in
* cursor_ext (or from one query in it)
* 2002-12-20: testing and implemtenting of session storing the class (not fully tested!)
* documenting all the functions and some code cleenup
@@ -222,7 +222,7 @@
* more complex (array based IO fkts) moved into a seperate file
* 2002-12-16: further reconstruction ...
* 2002-12-10: further improvment in changing db_mysql to a class
* 2002-10-18: renamed lesen to db_read, speichern to db_save and
* 2002-10-18: renamed lesen to db_read, speichern to db_save and
* loeschen to db_delete
* 19.08.2002: 1 convertiert &lt; &gt; &quot; &amp; &#309; in original
* HTML zeichen zurück (für htmlspecialcharsfct)
@@ -230,7 +230,7 @@
* addslashes (1=ja,0=nein/default)
* 04.04.2002: FK added to lesen()
* 10.07.2001: simple return row function geschrieben
* 03.07.2001: kein Thumbnail erzeugen wenn Datei nicht:
* 03.07.2001: kein Thumbnail erzeugen wenn Datei nicht:
* JPG/JPEG/GIF/PNG als Endung hat
* 22.06.2001: Mozilla Fix für File upload
* 10.05.2001: alle fkt haben "db_" als pre zur identifizierung
@@ -266,12 +266,12 @@
// FOR BELOW: (This should be private and only readable through some method)
// cursor array for cached readings
public $cursor_ext; // hash of hashes
// per query vars
// per query vars
public $cursor; // actual cursor (DBH)
public $num_rows; // how many rows have been found
public $num_fields; // how many fields has the query
public $field_names; // array with the field names of the current query
public $insert_id; // last inserted ID
public $insert_id; // last inserted ID
// other vars
private $nbsp = ''; // used by print_array recursion function
// error & warning id
@@ -391,10 +391,10 @@
// RETURN: true on successfull connect, false if failed
// DESC:
// internal connection function. Used to connect to the DB if there is no connection done yet.
// Called before any execute
// Called before any execute
private function _connect_to_db()
{
// generate connect string
// generate connect string
$this->dbh = $this->db_functions->_db_connect($this->db_host, $this->db_user, $this->db_pwd, $this->db_name, $this->db_port, $this->db_ssl);
// if no dbh here, we couldn't connect to the DB itself
if (!$this->dbh)
@@ -410,7 +410,7 @@
$this->error_id = 15;
$this->_db_error();
return false;
}
}
// set search path if needed
if ($this->db_schema)
{
@@ -511,14 +511,14 @@
if ($id)
$prefix .= '[<span style="color: #920069;">'.$id.'</span>] ';
if ($type)
$prefix .= '{<span style="font-style: italic; color: #3f0092;">'.$type.'</span>} ';
$prefix .= '{<span style="font-style: italic; color: #3f0092;">'.$type.'</span>} ';
if ($prefix)
$prefix .= '- ';
$this->debug($debug_id, $prefix.$error_string, true);
}
// METHOD _db_error
// PARAMS cursor -> current cursor for pg_result_error, mysql uses dbh, pg_last_error too,
// PARAMS cursor -> current cursor for pg_result_error, mysql uses dbh, pg_last_error too,
// but pg_result_error is more accurate
// msg -> optional message
// RETURN none
@@ -593,7 +593,7 @@
// METHOD _db_return_table
// PARAMS insert/select/update/delete query
// RETURN array with schema and table
// DESC extracts schema and table from the query, if no schema returns just empty string
// DESC extracts schema and table from the query, if no schema returns just empty string
private function _db_return_table($query)
{
if (preg_match("/^SELECT /i", $query))
@@ -854,7 +854,7 @@
// METHOD db_dump_data
// PARAMS query -> if given, only from this quey (if found)
// RETURN formated string with all the data in the array
// RETURN formated string with all the data in the array
// DESC dumps ALL data for this query, OR if no query given all in cursor_ext array
public function db_dump_data($query = 0)
{
@@ -878,11 +878,11 @@
// if set to 2, the data will be read new and cached (wheres 1 reads new AND destroys at end of read)
// -> if set to 3, after EACH row, the data will be reset, no caching is done except for basic (count, etc)
// RETURN res mixed (array/hash)
// DESC single running function, if called creates md5 from
// DESC single running function, if called creates md5 from
// query string and so can itself call exec/return calls
// caches data, so next time called with IDENTICAL (!!!!)
// [this means 1:1 bit to bit identical query] returns cached
// data, or with reset flag set calls data from DB again
// data, or with reset flag set calls data from DB again
public function db_return($query, $reset = 0)
{
if (!$query)
@@ -915,7 +915,7 @@
$this->_db_error('', $this->cursor_ext[$md5]['query']);
return false;
}
// if it is a call with reset in it we reset the cursor, so we get an uncached return
// but only for the FIRST call (pos == 0)
if ($reset && !$this->cursor_ext[$md5]['pos'])
@@ -966,7 +966,7 @@
} // only go if NO cursor exists
// if cursor exists ...
if ($this->cursor_ext[$md5]['cursor'])
if ($this->cursor_ext[$md5]['cursor'])
{
if ($this->cursor_ext[$md5]['firstcall'] == 1)
{
@@ -987,7 +987,7 @@
$this->cursor_ext[$md5]['read_rows'] = 0;
}
// read data for further work ... but only if necessarry
if ($this->cursor_ext[$md5]['read_rows'] == $this->cursor_ext[$md5]['num_rows'])
if ($this->cursor_ext[$md5]['read_rows'] == $this->cursor_ext[$md5]['num_rows'])
$return = 0;
else
$return = $this->_db_convert_encoding($this->db_functions->_db_fetch_array($this->cursor_ext[$md5]['cursor']));
@@ -1002,7 +1002,7 @@
$this->cursor_ext[$md5]['cursor'] = 1;
$return = 0;
}
else
else
{
// unset return value ...
unset($return);
@@ -1012,7 +1012,7 @@
$field_value = $this->cursor_ext[$md5][$this->cursor_ext[$md5]['pos']][$this->cursor_ext[$md5]['field_names'][$i]];
$return[$i] = $field_value;
$return[$this->cursor_ext[$md5]['field_names'][$i]] = $field_value;
}
}
$this->cursor_ext[$md5]['pos'] ++;
}
}
@@ -1043,7 +1043,7 @@
{
while (list($field_name, $data) = each($return))
{
$temp[$field_name] = $data;
$temp[$field_name] = $data;
}
$this->cursor_ext[$md5][] = $temp;
}
@@ -1073,16 +1073,16 @@
}
// METHOD db_exec
// PARAMS query -> the query, if not given, the query class var will be used
// PARAMS query -> the query, if not given, the query class var will be used
// (if this was not set, method will quit with a 0 (failure)
// pk_name -> optional primary key name, for insert id return if the pk name is very different
// if pk name is table name and _id, pk_name is not needed to be set
// if NULL is given here, no RETURNING will be auto added
// RETURN cursor for this query
// DESC executes the query and returns & sets the internal cursor
// fruthermore this functions also sets varios other vars
// fruthermore this functions also sets varios other vars
// like num_rows, num_fields, etc depending on query
// for INSERT INTO queries it is highly recommended to set the pk_name to avoid an additional
// for INSERT INTO queries it is highly recommended to set the pk_name to avoid an additional
// read from the database for the PK NAME
public function db_exec($query = 0, $pk_name = '')
{
@@ -1105,7 +1105,7 @@
// pk_name -> optional primary key name, only used with insert for returning call
// RETURN true if async query was sent ok, false if error happened
// DESC executres the query async so other methods can be run during this
// for INSERT INTO queries it is highly recommended to set the pk_name to avoid an additional
// for INSERT INTO queries it is highly recommended to set the pk_name to avoid an additional
// read from the database for the PK NAME
// NEEDS db_check_async
public function db_exec_async($query, $pk_name = '')
@@ -1294,7 +1294,7 @@
// PARAMS $stm_name, $query, $pk_name: optional
// RETURN false on error
// DESC prepares a query
// for INSERT INTO queries it is highly recommended to set the pk_name to avoid an additional
// for INSERT INTO queries it is highly recommended to set the pk_name to avoid an additional
// read from the database for the PK NAME
public function db_prepare($stm_name, $query, $pk_name = '')
{
@@ -1469,7 +1469,7 @@ $this->debug('ExecuteData', 'ERROR in STM['.$stm_name.'|'.$this->prepare_cursor[
// RETURN database version as string
// DESC return current database version
public function db_version()
{
{
return $this->db_functions->_db_version();
}
@@ -1479,7 +1479,7 @@ $this->debug('ExecuteData', 'ERROR in STM['.$stm_name.'|'.$this->prepare_cursor[
// RETURN true/false
// DESC returns boolean true or false if the string matches the database version
public function db_compare_version($compare)
{
{
// compare has =, >, < prefix, and gets stripped, if the rest is not X.Y format then error
preg_match("/^([<>=]{1,2})(\d{1,2})\.(\d{1,2})/", $compare, $matches);
$compare = $matches[1];
@@ -1496,7 +1496,7 @@ $this->debug('ExecuteData', 'ERROR in STM['.$stm_name.'|'.$this->prepare_cursor[
$return = false;
// compare
switch ($compare)
{
{
case '=':
if ($to_version == $version)
$return = true;
@@ -1662,7 +1662,7 @@ $this->debug('ExecuteData', 'ERROR in STM['.$stm_name.'|'.$this->prepare_cursor[
$seconds = $matches[4] != '00' ? preg_replace('/^0/', '', $matches[4]) : '';
$milliseconds = $matches[6];
return $prefix.($hour ? $hour.'h ' : '').($minutes ? $minutes.'m ' : '').($seconds ? $seconds.'s' : '').($show_micro && $milliseconds? ' '.$milliseconds.'ms' : '');
return $prefix.($hour ? $hour.'h ' : '').($minutes ? $minutes.'m ' : '').($seconds ? $seconds.'s' : '').($show_micro && $milliseconds? ' '.$milliseconds.'ms' : '');
}
// METHOD: db_array_parse

View File

@@ -34,7 +34,7 @@
* "pk_name" => the pk_name of the table for the drop down
* "input_name" => the text field name in the table for the drop down
* "input_value" => the $name of input_name (must be same)
* "order_by" => "order bY" string for drop_down_db(_input) if no query given but fields set
* "order_by" => "order bY" string for drop_down_db(_input) if no query given but fields set
* "query" => for drop_down_db/array if no outer query given
* "preset" => value to preset when array is unset (available for all types)
* "element_list" => array ( "true", "false") - MUST (!) be set for binary
@@ -44,7 +44,7 @@
* "cols" => "nr" - only available for "textarea"
* "error_check" => "custom/email/date/number/unique" - 1) more will come
* "error_regex" => "regex" - if error_check is custom regex here
* "error_example" => "text" - example input text for error_check (only custom right now)
* "error_example" => "text" - example input text for error_check (only custom right now)
* "empty" => "value/text" - ONLY for view. If no data found, set this value
* --- file:
* "save_dir" => "directory where it should be saved to
@@ -60,7 +60,7 @@
* "output_name" => "Printed out next to multiple select field",
* "mandatory" => 1/0 for must be selected,
* "select_size" => size of multiple select field,
* "query" => "the query to load the multiple select field
* "query" => "the query to load the multiple select field
* (select id, concat_ws(" ",name_a, name_b) from reference_table)",
* "selected" => $var_name for name="xx" in multiple select
* ),
@@ -165,7 +165,7 @@
* delete
* 2003-06-12: adapted class to register_global_vars off
* 2003-06-10: in procedure_delete function I added "protected" variable clause, so if this field exists
* in the DB and is set, you are not able to delete [at the moment used for admin edit user
* in the DB and is set, you are not able to delete [at the moment used for admin edit user
* in DB]
* 2003-05-30: _temp for drop_down_db was added always and not only for same_db
* 2003-05-28: added drop_down_db_same_db for drop down/input combinations going into the same DB.
@@ -201,14 +201,14 @@
* 2003-03-04: drop_down_array value for option was left from array and
* not right
* 2003-02-27: added another check in unset if reference array exists
* 2003-02-26: change form to extend db_array_io and created load, save,
* delete functions removed all reference table functions,
* 2003-02-26: change form to extend db_array_io and created load, save,
* delete functions removed all reference table functions,
* except show function rewrite config array
* re-wrote the class info vars into array
* 2003-02-25: added reference table functions
* 2002-10-22: create this class so creating basic and medium form pages
* 2002-10-22: create this class so creating basic and medium form pages
* can be handled easy.
* with a given config file the class handles error checks,
* with a given config file the class handles error checks,
* save data, loads data, etc
*********************************************************************/
@@ -268,7 +268,7 @@
// start the array_io class which will start db_io ...
parent::__construct($db_config, $config_array["table_array"], $config_array["table_name"], $debug, $db_debug, $echo, $print);
// here should be a check if the config_array is correct ...
//
//
$this->field_array = $config_array["show_fields"];
$this->load_query = $config_array["load_query"];
$this->archive_pk_name = "a_".$this->pk_name;
@@ -281,7 +281,7 @@
{
$this->reference_array[$key] = $value;
}
}
}
if (is_array($config_array["element_list"]))
{
while (list($key, $value) = each($config_array["element_list"]))
@@ -479,7 +479,7 @@
{
$this->form_error_check();
if (!$this->error)
{
{
$this->form_save_table_array();
}
$this->yes = 1;
@@ -602,7 +602,7 @@
{
$pk_ids[] = $res[$this->int_pk_name];
if ($res[$this->int_pk_name] == $this->table_array[$this->int_pk_name]["value"])
{
{
$pk_selected = $res[$this->int_pk_name];
}
unset($t_string);
@@ -635,7 +635,7 @@
if ($this->group_level_user <= $this->security_level["new"])
{
if ($this->yes && !$hide_new_checkbox)
{
{
$show_checkbox = 1;
}
// set type of new name
@@ -658,12 +658,12 @@
if ($this->group_level_user <= $this->security_level["save"])
{
$seclevel_okay = 1;
if (!$this->table_array[$this->int_pk_name]["value"])
{
if (!$this->table_array[$this->int_pk_name]["value"])
{
$save = $this->l->__("Save");
}
else
{
else
{
$save = $this->l->__("Update");
}
// print the old_school hidden if requestet
@@ -714,7 +714,7 @@
$data['output'][] = $this->table_array[$element_name]["element_list"][$i];
$data['name'] = $element_name;
if (($i && $this->table_array[$element_name]["value"]) || (!$i && !$this->table_array[$element_name]["value"]))
$data['checked'] = $this->table_array[$element_name]["value"];
$data['checked'] = $this->table_array[$element_name]["value"];
if ($i)
$data['separator'] = '';
@@ -839,7 +839,7 @@
// for media / not yet implemented
if ($this->table_array[$element_name]["type"] == "media")
{
//media::insert_file($element_name,$this->table_array[$element_name]["value"],$query);
//media::insert_file($element_name,$this->table_array[$element_name]["value"],$query);
}
// order button
if ($this->table_array[$element_name]["type"] == "order")
@@ -886,11 +886,10 @@
{
// each error check can be a piped seperated value, lets split it
//$this->debug('edit', $value["error_check"]);
$error_checks = explode("|", $value["error_check"]);
foreach ($error_checks as $error_check)
foreach (explode('|', $value["error_check"]) as $error_check)
{
switch ($error_check)
{
{
case "number":
if (!preg_match("/^[0-9]+(['\,','.']?[0-9]+)*$/", $this->table_array[$key]["value"]))
$this->msg .= sprintf($this->l->__("Please enter a vailid Number for the <b>%s</b> Field!<br>"), $this->table_array[$key]["output_name"]);
@@ -914,7 +913,7 @@
break;
// check unique, check if field in table is not yet exist
case "unique":
$q = "SELECT ".$key." FROM ".$this->table_name." WHERE ".$key." = '".addslashes($this->table_array[$key]["value"])."'";
$q = "SELECT ".$key." FROM ".$this->table_name." WHERE ".$key." = '".$this->db_escape_string($this->table_array[$key]["value"])."'";
if ($this->table_array[$this->int_pk_name]["value"])
$q .= " AND ".$this->int_pk_name." <> ".$this->table_array[$this->int_pk_name]["value"];
list($$key) = $this->db_return_row($q);
@@ -925,6 +924,11 @@
if (!preg_match($this->table_array[$key]["error_regex"], $this->table_array[$key]["value"]))
$this->msg .= sprintf($this->l->__("Please enter a valid (%s) input for the <b>%s</b> Field!<br>"), $this->table_array[$key]["error_example"], $this->table_array[$key]["output_name"]);
break;
case "alphanumericspace":
//$this->debug('edit', 'IN Alphanumericspace');
if (!preg_match("/^[0-9A-Za-z\ ]+$/", $this->table_array[$key]["value"]))
$this->msg .= sprintf($this->l->__("Please enter a valid alphanumeric (Numbers and Letters, spaces allowed) value for the <b>%s</b> Field!<br>"), $this->table_array[$key]["output_name"]);
break;
case "alphanumeric":
//$this->debug('edit', 'IN Alphanumeric');
if (!preg_match("/^[0-9A-Za-z_\-]+$/", $this->table_array[$key]["value"]))
@@ -932,7 +936,7 @@
break;
// this one also allows @ and .
case "alphanumericextended":
//$this->debug('edit', 'IN Alphanumeric');
//$this->debug('edit', 'IN Alphanumericextended');
if (!preg_match("/^[0-9A-Za-z_\-@\.]+$/", $this->table_array[$key]["value"]))
$this->msg .= sprintf($this->l->__("Please enter a valid alphanumeric extended (Numbers, Letters, -, _, @ and . only, no spaces) value for the <b>%s</b> Field!<br>"), $this->table_array[$key]["output_name"]);
break;
@@ -948,15 +952,15 @@
} // for each error to check
}
// if mandatory && no input
else if ($value["mandatory"] &&
else if ($value["mandatory"] &&
(
// for all "normal" fields
($this->table_array[$key]["type"] != "password" && $this->table_array[$key]["type"] != "drop_down_db_input" && !$this->table_array[$key]["value"]) ||
// for drop_down_db_input check if one of both fields filled
($this->table_array[$key]["type"] == "drop_down_db_input" && !$this->table_array[$key]["input_value"] && !$this->table_array[$key]["value"]) ||
// for password
($this->table_array[$key]["type"] == "password" && !$this->table_array[$key]["value"] && !$this->table_array[$key]["HIDDEN_value"])
)
// for all "normal" fields
($this->table_array[$key]["type"] != "password" && $this->table_array[$key]["type"] != "drop_down_db_input" && !$this->table_array[$key]["value"]) ||
// for drop_down_db_input check if one of both fields filled
($this->table_array[$key]["type"] == "drop_down_db_input" && !$this->table_array[$key]["input_value"] && !$this->table_array[$key]["value"]) ||
// for password
($this->table_array[$key]["type"] == "password" && !$this->table_array[$key]["value"] && !$this->table_array[$key]["HIDDEN_value"])
)
) // main if end
{
//$this->debug('form', "A: ".$this->table_array[$key]["type"]." -- ".$this->table_array[$key]["input_value"]." -- ".$this->table_array[$key]["value"]);
@@ -990,14 +994,22 @@
if ($this->reference_array[$key]["mandatory"] && !$this->reference_array[$key]["selected"][0])
$this->msg .= sprintf($this->l->__("Please select at least one Element from field <b>%s</b>!<br>"), $this->reference_array[$key]["output_name"]);
}
}
}
//$this->debug('edit_error', "QS: <pre>".print_r($_POST, 1)."</pre>");
if (is_array($this->element_list))
if (is_array($this->element_list))
{
// check the mandatory stuff
// if mandatory, check that at least on pk exists or if at least the mandatory field is filled
while (list($table_name, $reference_array) = each($this->element_list))
{
// set pk/fk id for this
foreach ($reference_array['elements'] as $_name => $_data)
{
if ($_data['pk_id'])
$_pk_name = $_name;
if ($_data['fk_id'])
$_fk_name = $_name;
}
// get the leasy of keys from the elements array
$keys = array_keys($reference_array["elements"]);
// prefix
@@ -1025,10 +1037,8 @@
{
$mand_okay = 1;
}
// we found a mandatory field. check now if one is set to satisfy the main mandatory
// also check, if this field is mandatory and its not set, but any other, throw an error
// for ($i = 0; $i < count($_POST[$prfx.$el_name]); $i ++)
// {
// we found a mandatory field. check now if one is set to satisfy the main mandatory
// also check, if this field is mandatory and its not set, but any other, throw an error
//$this->debug('edit_error_chk', "RG error - Data[".$prfx.$el_name.": ".$_POST[$prfx.$el_name][$i]." | ".$_POST[$prfx.$el_name]." - ".$reference_array['enable_name']." - ".$_POST[$reference_array['enable_name']][$_POST[$prfx.$el_name][$i]]);
if ($data_array["mandatory"] && $_POST[$prfx.$el_name][$i])
{
@@ -1053,9 +1063,30 @@
{
$row_okay[$i] = 0;
}
// }
// do optional error checks like for normal fields
// currently active: unique/alphanumeric
if ($data_rray['error_check'])
{
foreach (explode('|', $value["error_check"]) as $error_check)
{
switch ($error_check)
{
// check unique, check if field in table is not yet exist
case "unique":
$q = "SELECT ".$_pk_name." FROM ".$table_name." WHERE ".$el_name." = '".$this->db_escape_string($_POST[$prfx.$el_name][$i])."'";
if ($this->table_array[$this->int_pk_name]["value"])
$q .= " AND ".$this->int_pk_name." <> ".$this->table_array[$this->int_pk_name]["value"];
list($$key) = $this->db_return_row($q);
if ($$key)
$this->msg .= sprintf($this->l->__("The field <b>%s</b> in row <b>%s</b> can be used only once!<br>"), $reference_array["output_name"], $i);
break;
case "alphanumericspace":
if (!preg_match("/^[0-9A-Za-z\ ]+$/", $_POST[$prfx.$el_name][$i]))
$this->msg .= sprintf($this->l->__("Please enter a valid alphanumeric (Numbers and Letters, spaces allowed) value for the <b>%s</b> Field and row <b>%s</b>!<br>"), $reference_array["output_name"], $i);
break;
}
}
}
} // if main mandatory
}
@@ -1128,7 +1159,7 @@
// if preset var present preset
if (isset($this->table_array[$key]["preset"]))
$this->table_array[$key]["value"] = $this->table_array[$key]["preset"];
}
}
if (is_array($this->reference_array))
{
if (!is_array($this->reference_array))
@@ -1180,7 +1211,7 @@
// METHOD form_save_table_array
// PARAMS addslashes - if one, passes 1 to the db_write function
// RETURN none
// RETURN none
// DESC save a table, reference and all input fields
public function form_save_table_array($addslashes = 0)
{
@@ -1198,21 +1229,21 @@
{
//$this->debug('form', "HERE");
// check if this text name already exists (lowercase compare)
$q = "SELECT ".$this->table_array[$key]["pk_name"]." FROM ".$this->table_array[$key]["table_name"]." WHERE LCASE(".$this->table_array[$key]["input_name"].") = '".addslashes(strtolower($this->table_array[$key]["input_value"]))."'";
$q = "SELECT ".$this->table_array[$key]["pk_name"]." FROM ".$this->table_array[$key]["table_name"]." WHERE LCASE(".$this->table_array[$key]["input_name"].") = '".$this->db_escape_string(strtolower($this->table_array[$key]["input_value"]))."'";
// if a where was given, add here
if ($this->table_array[$key]["where"])
$q .= " AND ".$this->table_array[$key]["where"];
$q .= " AND ".$this->table_array[$key]["where"];
list($pk_name_temp) = $this->db_return_row($q);
if ($this->num_rows >= 1)
{
$this->table_array[$key]["value"] = $pk_name_temp;
$this->table_array[$key]["value"] = $pk_name_temp;
}
else
{
// if a where was given, set this key also [dangerous!]
// postgreSQL compatible insert
$q = "INSERT INTO ".$this->table_array[$key]["table_name"]." (".$this->table_array[$key]["input_name"].") VALUES ('".addslashes($this->table_array[$key]["input_value"])."')";
$q = "INSERT INTO ".$this->table_array[$key]["table_name"]." (".$this->table_array[$key]["input_name"].") VALUES ('".$this->db_escape_string($this->table_array[$key]["input_value"])."')";
$this->db_exec($q);
if ($this->table_array[$key]["where"])
{
@@ -1233,7 +1264,7 @@
if ($this->table_array[$key]["input_value"] != $this->table_array[$key]["value"])
{
// check if "right input" is in DB
$q = "SELECT ".$this->table_array[$key]["input_name"]." FROM ".$this->table_array[$key]["table_name"]." WHERE LCASE(".$this->table_array[$key]["input_name"].") = '".strtolower(addslashes($this->table_array[$key]["input_value"]))."'";
$q = "SELECT ".$this->table_array[$key]["input_name"]." FROM ".$this->table_array[$key]["table_name"]." WHERE LCASE(".$this->table_array[$key]["input_name"].") = '".strtolower($this->db_escape_string($this->table_array[$key]["input_value"]))."'";
// if a where was given, add here
if ($this->table_array[$key]["where"])
$q .= " AND ".$this->table_array[$key]["where"];
@@ -1267,7 +1298,7 @@
//if a slash at the end (if not add slash)
if (!preg_match("|/$|", $this->table_array[$key]["save_dir"]))
$this->table_array[$key]["save_dir"] .= "/";
if (move_uploaded_file($GLOBALS["_FILES"][$key."_file"]['tmp_name'], $this->table_array[$key]["save_dir"].$GLOBALS["_FILES"][$key."_file"]['name']))
if (move_uploaded_file($GLOBALS["_FILES"][$key."_file"]['tmp_name'], $this->table_array[$key]["save_dir"].$GLOBALS["_FILES"][$key."_file"]['name']))
{
// make it unique with a unique number at the beginning
$this->table_array[$key]["value"] = uniqid(rand(), 1)."_".$GLOBALS["_FILES"][$key."_file"]['name'];
@@ -1302,7 +1333,7 @@
}
else
{
// $this->table_array[$key]["HIDDEN_value"] =
// $this->table_array[$key]["HIDDEN_value"] =
}
}
} // go through each field
@@ -1352,6 +1383,8 @@
// check if there is a hidden key, update, else insert
while (list($el_name, $data_array) = each($reference_array["elements"]))
{
// this is only for reference_data part, at least one of the text fields need to be set for writing
$blow_write = array ();
//$this->debug('edit_error_query', "QUERY: ".$this->print_ar($_POST));
// go through all submitted data
// for ($i = 0; $i < count($_POST[$el_name]); $i ++)
@@ -1367,6 +1400,16 @@
{
$no_write[$i] = 1;
}
// flag if data is in the text field and we are in a reference data set
if ($reference_array['type'] == 'reference_data' )
{
if ($data_array['type'] == 'text' && $_POST[$prfx.$el_name][$i])
$block_write[$i] = 1;
}
else
{
$block_write[$i] = 1;
}
// set type and boundaries for insert/update
if ($data_array["pk_id"] && $_POST[$prfx.$el_name][$i])
{
@@ -1383,19 +1426,24 @@
}
// write all data (insert/update) because I don't know until all are processed if it is insert or update
// don't write primary key backup for update
$this->debug('edit_error', "I: $i | EL Name: $prfx$el_name | Data: ".$_POST[$prfx.$el_name][$i]." {".$_POST[$prfx.$el_name]."} | Type: ".$type[$i]." | PK: ".$data_array["pk_id"]." ");
if (!$data_array["pk_id"])
// for reference_data type, only write if at least one text type field is set
//$this->debug('edit_error', "I: $i | EL Name: $prfx$el_name | Data: ".$_POST[$prfx.$el_name][$i]." | Type: ".$type[$i]." | PK: ".$data_array["pk_id"].", Block write: ".$block_write[$i]);
// only add elements that are not PK or FK flaged
if (!$data_array['pk_id'] && !$data_array['fk_id'])
{
// update
// update data list
if (strlen($q_data[$i]))
$q_data[$i] .= ", ";
// insert
// insert name part list
if ($q_names[$i])
$q_names[$i] .= ", ";
$q_names[$i] .= $el_name;
// insert value part list
if (strlen($q_values[$i]))
$q_values[$i] .= ", ";
// data part
// insert column name add
$q_names[$i] .= $el_name;
// data part, read from where [POST]
// radio group selections (only one can be active)
if ($data_array['type'] == 'radio_group')
{
if ($i == $_POST[$prfx.$el_name])
@@ -1407,10 +1455,11 @@ $this->debug('edit_error', "I: $i | EL Name: $prfx$el_name | Data: ".$_POST[$prf
{
$_value = $_POST[$prfx.$el_name][$i];
}
// pre write data set. if int value, unset flagged need to be set null or 0 depending on settings
if ($data_array['int'] || $data_array['int_null'])
{
if (!$_value && $data_array['int_null'])
$value = 'NULL';
$_value = 'NULL';
elseif (!isset($_value))
$_value = 0;
$q_data[$i] .= $el_name." = ".$_value;
@@ -1418,34 +1467,38 @@ $this->debug('edit_error', "I: $i | EL Name: $prfx$el_name | Data: ".$_POST[$prf
}
else
{
$q_data[$i] .= $el_name." = '".addslashes($_value)."'";
$q_values[$i] .= "'".addslashes($_value)."'";
// normal data gets escaped
$q_data[$i] .= $el_name." = '".$this->db_escape_string($_value)."'";
$q_values[$i] .= "'".$this->db_escape_string($_value)."'";
}
}
}
} // eche table elements
// finalize the queries, add FK key reference for inserts and run the query
for ($i = 0; $i < count($type); $i ++)
{
$q = '';
if (!$no_write[$i])
{
if ($type[$i] == "update")
{
$q = $q_begin[$i].$q_data[$i].$q_end[$i];
}
else
elseif ($block_write[$i])
{
$q = $q_begin[$i].$q_names[$i].", ".$this->int_pk_name.$q_middle[$i].$q_values[$i].", ".$this->table_array[$this->int_pk_name]["value"].$q_end[$i];
}
//$this->debug('edit', "Q: ".$q."<br>");
$this->debug('edit', "Pos[$i] => ".$type[$i]." Q: ".$q."<br>");
// write the dataset
$this->db_exec($q);
if ($q)
$this->db_exec($q);
}
} // for each created query
} // each element list
}
$this->warning = 1;
$this->msg = $this->l->__("Dataset has been saved!<Br>");
}
}
// METHOD form_delete_table_array
// PARAMS none
@@ -1544,42 +1597,52 @@ $this->debug('edit_error', "I: $i | EL Name: $prfx$el_name | Data: ".$_POST[$prf
// PARAMS show which element list
// RETURN array for output
// DESC create list of elements next to each other for a group of data in an input field
// this currently only works for a list that is filled from a sub table and creates only a connection to this one
// new version will allow a sub list with free input fields to directly fill a sub table to a master table
public function form_create_element_list_table($table_name)
{
// output name for the viewable left table td box, prefixed with * if mandatory
$output_name = $this->element_list[$table_name]["output_name"];
if ($this->element_list[$table_name]["mandatory"])
$output_name .= ' *';
// delete button name, if there is one set
if ($this->element_list[$table_name]["delete_name"])
$data['delete_name'] = $this->element_list[$table_name]["delete_name"];
// set the enable checkbox name if there is one
// set the enable checkbox for delete, if the delete flag is given if there is one
if ($this->element_list[$table_name]["enable_name"])
{
$data['enable_name'] = $this->element_list[$table_name]["enable_name"];
if ($this->element_list[$table_name]["delete"])
$data['delete'] = 1;
}
// prefix for the elements, to not collide with names in the master set
if ($this->element_list[$table_name]["prefix"])
$data["prefix"] = $this->element_list[$table_name]["prefix"]."_";
// the sub data table name
$data['table_name'] = $table_name;
$pos = 0; // position in while for overwrite if needed
// build the select part
if (!is_array($this->element_list[$table_name]["elements"]))
$this->element_list[$table_name]["elements"] = array ();
reset($this->element_list[$table_name]["elements"]);
// generic data read in (counts for all rows)
// visible list data output
while (list($el_name, $data_array) = each($this->element_list[$table_name]["elements"]))
{
$_el_name = $el_name;
$el_name = $data["prefix"].$el_name;
// $this->debug('CFG', 'El: '.$el_name.' -> '.$this->print_ar($data_array));
// if the element name matches the read array, then set the table as a name prefix
$q_select[] = $_el_name; // this is for reading the data
$q_select[] = $el_name; // this is for reading the data
// prefix the name for any further data parts
$el_name = $data["prefix"].$el_name;
$data['output_name'][$el_name] = $data_array["output_name"]; // this are the output names (if given)
$data['type'][$el_name] = $data_array["type"]; /// this is the type of the field
// set the primary key name
if ($data_array['pk_id'])
$data['pk_name'] = $el_name;
// if drop down db read data for element list
if ($data_array['fk_id'])
$data['fk_name'] = $el_name;
// if drop down db read data for element list from the given sub table as from the query
// only two elements are allowed: pos 0 is key, pso 1 is visible output name
if ($data_array['type'] == 'drop_down_db')
{
$md_q = md5($data_array['query']);
@@ -1594,64 +1657,87 @@ $this->debug('edit_error', "I: $i | EL Name: $prfx$el_name | Data: ".$_POST[$prf
$data['output_data'][$el_name][] = $res[1];
}
}
else
elseif ($data_array["element_list"])
{
$data['element_list'][$el_name] = $data_array["element_list"]; // this is for the checkboxes
}
$proto[$el_name] = ($this->error) ? $_POST[$el_name][(count($_POST[$el_name]) - 1)] : ''; // this is for the new line
}
// $this->debug('CFG DATA', 'Data: '.$this->print_ar($data));
// $this->debug('CFG PROTO', 'Proto: '.$this->print_ar($proto));
// $this->debug('CFG SELECT', 'Proto: '.$this->print_ar($q_select));
// query for reading in the data
//$this->debug('edit_error', "ERR: ".$this->error);
// if we got a read data, build the read select for the read, and read out the "selected" data
if ($this->element_list[$table_name]["read_data"])
{
array_unshift($q_select, $this->element_list[$table_name]["read_data"]["name"]);
// we need a second one for the query build only
// prefix all elements with the $table name
foreach ($q_select as $_pos => $element)
{
$_q_select[$_pos] = $table_name.'.'.$element;
}
// add the read names in here, prefix them with the table name
// earch to read part is split by |
if ($this->element_list[$table_name]["read_data"]["name"])
{
foreach (explode('|', $this->element_list[$table_name]["read_data"]["name"]) as $read_name)
{
array_unshift($_q_select, $this->element_list[$table_name]["read_data"]["table_name"].'.'.$read_name);
array_unshift($q_select, $read_name);
}
}
// set the rest of the data so we can print something out
$data['type'][$data["prefix"].$this->element_list[$table_name]["read_data"]["name"]] = 'string';
// build the read query
$q = "SELECT ";
// if (!$this->table_array[$this->int_pk_name]["value"])
// $q .= "DISTINCT ";
// prefix join key with table name
$q .= str_replace($this->element_list[$table_name]["read_data"]["pk_id"], $this->element_list[$table_name]["read_data"]["table_name"].".".$this->element_list[$table_name]["read_data"]["pk_id"], implode(", ", $q_select))." ";
// prefix join key with table name, and implode the query select part
$q .= str_replace($table_name.'.'.$this->element_list[$table_name]["read_data"]["pk_id"], $this->element_list[$table_name]["read_data"]["table_name"].'.'.$this->element_list[$table_name]["read_data"]["pk_id"], implode(', ', $_q_select)).' ';
// if (!$this->table_array[$this->int_pk_name]["value"] && $this->element_list[$table_name]["read_data"]["order"])
// $q .= ", ".$this->element_list[$table_name]["read_data"]["order"]." ";
// read from the read table as main, and left join to the sub table to read the actual data
$q .= "FROM ".$this->element_list[$table_name]["read_data"]["table_name"]." ";
$q .= "LEFT JOIN ".$table_name." ";
$q .= "ON (";
$q .= $this->element_list[$table_name]["read_data"]["table_name"].".".$this->element_list[$table_name]["read_data"]["pk_id"]." = ".$table_name.".".$this->element_list[$table_name]["read_data"]["pk_id"]." ";
// if ($this->table_array[$this->int_pk_name]["value"])
$q .= "AND ".$this->int_pk_name." = ".(($this->table_array[$this->int_pk_name]["value"]) ? $this->table_array[$this->int_pk_name]["value"] : 'NULL')." ";
$q .= "AND ".$table_name.".".$this->int_pk_name." = ".(($this->table_array[$this->int_pk_name]["value"]) ? $this->table_array[$this->int_pk_name]["value"] : 'NULL')." ";
$q .= ") ";
if ($this->element_list[$table_name]["read_data"]["order"])
$q .= " ORDER BY ".$this->element_list[$table_name]["read_data"]["order"];
$q .= " ORDER BY ".$this->element_list[$table_name]["read_data"]["table_name"].'.'.$this->element_list[$table_name]["read_data"]["order"];
}
else
{
// only create query if we have a primary key
// reads directly from the reference table
if ($this->table_array[$this->int_pk_name]["value"])
$q = "SELECT ".implode(", ", $q_select)." FROM ".$table_name." WHERE ".$this->int_pk_name." = ".$this->table_array[$this->int_pk_name]["value"];
}
// $this->debug('CFG QUERY', 'Q: '.$q);
// only run if we have query strnig
if ($q)
{
$pos = 0; // position in while for overwrite if needed
// read out the list and add the selected data if needed
while ($res = $this->db_return($q))
{
$_data = array ();
$prfx = $data["prefix"]; // short
// go through each res
for ($i = 0; $i < count($q_select); $i ++)
{
// query select part, set to the element name
$el_name = $q_select[$i];
//$this->debug('edit_error', "[$i] POS[$prfx$el_name]: ".$_POST[$prfx.$el_name][$pos]." | RES: ".$res[$el_name]);
//$this->debug('edit_error', "[$i] ELNAME: $el_name | POS[$prfx$el_name]: ".$_POST[$prfx.$el_name][$pos]." | RES: ".$res[$el_name]);
// if we have an error, we take what we have in the vars, if not we take the data from the db
if ($this->error)
{
// if we have a radio group, set a bit different
if ($data['element_list'][$prfx.$el_name] == 'radio_group')
$_data[$prfx.$el_name] = ($res[$el_name]) ? ($res[$el_name] - 1) : 0;
else
else
$_data[$prfx.$el_name] = $_POST[$prfx.$el_name][$pos];
}
else
@@ -1669,6 +1755,44 @@ $this->debug('edit_error', "I: $i | EL Name: $prfx$el_name | Data: ".$_POST[$prf
unset($_data);
}
}
// if this is normal single reference data check the content on the element count
// if there is a max_empty is set, then fill up new elements (unfilled) until we reach max empty
if ($this->element_list[$table_name]['type'] == 'reference_data' && is_numeric($this->element_list[$table_name]['max_empty']) && $this->element_list[$table_name]['max_empty'] > 0)
{
// if the max empty is bigger than 10, just cut it to ten at the moment
if ($this->element_list[$table_name]['max_empty'] > 10)
$this->element_list[$table_name]['max_empty'] = 10;
// check if we need to fill fields
$element_count = count($data['content']);
$missing_empty_count = $this->element_list[$table_name]['max_empty'] - count($data['content']);
$this->debug('CFG MAX', 'Max empty: '.$this->element_list[$table_name]['max_empty'].', Missing: '.$missing_empty_count.', Has: '.$element_count);
// set if we need more open entries or if we do not have any entries yet
if (($missing_empty_count < $this->element_list[$table_name]['max_empty']) || $element_count == 0)
{
for ($pos = count($data['content']); $pos <= ($this->element_list[$table_name]['max_empty'] + $element_count); $pos ++)
{
$_data = array ();
// the fields that need to be filled are in data->type array:
// pk fields are unfilled
// fk fields are filled with the fk_id "int_pk_name" value
foreach ($data['type'] as $el_name => $type)
{
$_data[$el_name] = '';
if ($el_name == $data['pk_name'])
{
}
elseif ($el_name == $data['fk_name'])
{
$_data[$el_name] = $this->table_array[$this->int_pk_name]["value"];
}
}
$data['content'][] = $_data;
$data['pos'][] = array(0 => $pos); // this is for the checkboxes
}
}
}
// push in an empty line of this type, but only if we have a delete key
if ($data['delete_name'])
$data['content'][] = $proto;

View File

@@ -80,16 +80,7 @@
private $login_template = array ('strings' => array (), 'password_change' => '', 'template' => '');
// acl vars
public $acl = array (
'acl' => array (
'user' => array (),
'page' => array (),
'edit_access' => array ()
),
'info' => array (
'edit_access' => array ()
)
);
public $acl = array ();
public $default_acl_list = array ();
// METHOD: login
@@ -172,23 +163,23 @@
"class_author" => "cs/gullevek/at"
);
// init default ACL list array
$_SESSION['DEFAULT_ACL_LIST'] = array ();
// read the current edit_access_right list into an array
$q = "SELECT level, type, name FROM edit_access_right WHERE level >= 0 ORDER BY level";
while ($res = $this->db_return($q))
{
// level to description format
// level to description format (numeric)
$this->default_acl_list[$res['level']] = array (
'type' => $res['type'],
'name' => $res['name']
);
// format type (eg read) => acl number (eg 20)
$this->default_acl_list[$res['type']] = $res['level'];
}
// write that into the session
$_SESSION['DEFAULT_ACL_LIST'] = $this->default_acl_list;
// if username & password & !$euid start login
$this->login_login_user();
$this->login_login_user();
// checks if $euid given check if user is okay for that side
$this->login_check_permissions();
// logsout user
@@ -227,7 +218,7 @@
{
parent::__destruct();
}
// METHOD: login_login_user
// PARAMS: none
// RETURN: none
@@ -404,7 +395,7 @@
$_SESSION["PAGES"] = $pages;
$_SESSION["PAGES_ACL_LEVEL"] = $pages_acl;
// load the edit_access user rights
$q = "SELECT ea.edit_access_id, level, type, ea.name, ea.color, edit_default ";
$q = "SELECT ea.edit_access_id, level, type, ea.name, ea.color, ea.uid, edit_default ";
$q .= "FROM edit_access_user eau, edit_access_right ear, edit_access ea ";
$q .= "WHERE eau.edit_access_id = ea.edit_access_id AND eau.edit_access_right_id = ear.edit_access_right_id AND eau.enabled = 1 AND edit_user_id = ".$this->euid." ";
$q .= "ORDER BY ea.name";
@@ -413,16 +404,28 @@
$unit_acl = array();
while ($res = $this->db_return($q))
{
// read edit access data fields and drop them into the unit access array
$q_sub ="SELECT name, value FROM edit_access_data WHERE enabled = 1 edit_access_id = ".$res['edit_access_id'];
$ea_data = array ();
while ($res_sub = $this->db_return($q_sub))
{
$ea_data[$res_sub['name']] = $res_sub['value'];
}
// build master unit array
$unit_access[$res['edit_access_id']] = array (
"id" => $res['edit_access_id'],
"acl_level" => $res["level"],
"acl_type" => $res["type"],
"name" => $res["name"],
"uid" => $res['uid'],
"color" => $res["color"],
"default" => $res["edit_default"]
"default" => $res["edit_default"],
'data' => $ea_data
);
// set the default unit
if ($res['edit_default'])
$_SESSION["UNIT_DEFAULT"] = $res['edit_access_id'];
// sub arrays for simple access
array_push($eauid, $res['edit_access_id']);
$unit_acl[$res['edit_access_id']] = $res['level'];
}
@@ -460,7 +463,7 @@
}
} // if he pressed login at least and is not yet loggined in
}
// METHOD: login_check_permission
// PARAMS: none
// RETUNR none
@@ -482,7 +485,7 @@
$this->permission_okay = 1;
}
else
{
{
$this->login_error = 103;
$this->permission_okay = 0;
}
@@ -526,94 +529,110 @@
// DESC : sets all the basic ACLs
// init set the basic acl the user has, based on the following rules
// * init set from config DEFAULT ACL
// * if group ACL is set, it overrides the default ACL
// * if page ACL is set, it overrides the group ACL
// * if user ACL is set, it overrides the page ACL
// * if page ACL is set, it overrides the default ACL
// * if group ACL is set, it overrides the page ACL
// * if user ACL is set, it overrides the group ACL
// set the page ACL
// * default ACL set
// * set group ACL if not default overrides default ACL
// * set page ACL if not default overrides group ACL
// set edit access ACL an set default edit access group
// set edit access ACL and set default edit access group
// * if an account ACL is set, set this parallel, account ACL overrides user ACL if it applies
// * if edit access ACL level is set, use this, else use page
// set all base ACL levels as a list keyword -> ACL number
public function login_set_acl()
{
// set the mastser user id
$this->acl['info']['euid'] = $_SESSION['EUID'];
// set admin flag, if this is on, all ACLs are set 100
if ($_SESSION['ADMIN'])
$this->acl['info']['admin'] = 1;
else
$this->acl['info']['admin'] = 0;
$this->acl['acl']['admin'] = $this->acl['info']['admin'];
// we start with the default acl
$this->acl['base'] = DEFAULT_ACL_LEVEL;
if (!$this->acl['info']['admin'])
// set admin flag and base to 100
if ($_SESSION['ADMIN'])
{
// this is the base if nothing is set
$this->acl['acl']['user'] = DEFAULT_ACL_LEVEL; // old base ACL
$this->acl['acl']['max'] = DEFAULT_ACL_LEVEL;
$this->acl['admin'] = 1;
$this->acl['base'] = 100;
}
else
{
// now go throw the flow and set the correct ACL
// user > page > group
// group ACL 0
if ($_SESSION['GROUP_ACL_LEVEL'] != -1)
{
$this->acl['acl']['user'] = $_SESSION['GROUP_ACL_LEVEL'];
if ($this->acl['acl']['user'] > $this->acl['acl']['max'])
$this->acl['acl']['max'] = $this->acl['acl']['user'];
$this->acl['base'] = $_SESSION['GROUP_ACL_LEVEL'];
}
// page ACL 2
// page ACL 1
if ($_SESSION['PAGES_ACL_LEVEL'][$this->page_name] != -1)
{
$this->acl['acl']['user'] = $_SESSION['PAGES_ACL_LEVEL'][$this->page_name];
if ($this->acl['acl']['user'] > $this->acl['acl']['max'])
$this->acl['acl']['max'] = $this->acl['acl']['user'];
$this->acl['base'] = $_SESSION['PAGES_ACL_LEVEL'][$this->page_name];
}
// user ACL 1
// user ACL 2
if ($_SESSION['USER_ACL_LEVEL'] != -1)
{
$this->acl['acl']['user'] = $_SESSION['USER_ACL_LEVEL'];
if ($this->acl['acl']['user'] > $this->acl['acl']['max'])
$this->acl['acl']['max'] = $this->acl['acl']['user'];
$this->acl['base'] = $_SESSION['USER_ACL_LEVEL'];
}
}
else
{
// if admin is on, level is 100 (admin)
$this->acl['acl']['user'] = 100;
$this->acl['acl']['max'] = 100;
}
// set the current page acl
// start with default acl
// set group if not -1
// set page if not -1, overrides groug
$this->acl['acl']['page'] = DEFAULT_ACL_LEVEL;
// set group if not -1, overrides default
// set page if not -1, overrides group set
$this->acl['page'] = DEFAULT_ACL_LEVEL;
if ($_SESSION['GROUP_ACL_LEVEL'] != -1)
{
$this->acl['acl']['page'] = $_SESSION['GROUP_ACL_LEVEL'];
$this->acl['page'] = $_SESSION['GROUP_ACL_LEVEL'];
}
if ($_SESSION['PAGES_ACL_LEVEL'][$this->page_name] != -1)
{
$this->acl['acl']['page'] = $_SESSION['PAGES_ACL_LEVEL'][$this->page_name];
$this->acl['page'] = $_SESSION['PAGES_ACL_LEVEL'][$this->page_name];
}
// PER ACCOUNT (UNIT/edit access)->
foreach ($_SESSION['UNIT'] as $unit)
foreach ($_SESSION['UNIT'] as $ea_id => $unit)
{
// set edit access acl, unless admin, then it is default 100
$this->acl['acl']['edit_access'][$unit['id']] = !$this->acl['info']['admin'] ? ($unit['acl_level'] != -1 ? $unit['acl_level'] : $this->acl['acl']['page']) : 100;
$this->acl['info']['edit_access'][$unit['id']] = $unit['name'];
// if admin flag is set, all units are set to 100
if ($this->acl['admin'])
{
$this->acl['unit'][$ea_id] = $this->acl['base'];
}
else
{
if ($unit['acl_level'] != -1)
$this->acl['unit'][$ea_id] = $unit['acl_level'];
else
$this->acl['unit'][$ea_id] = $this->acl['base'];
}
// detail name/level set
$this->acl['unit_detail'][$ea_id] = array (
'name' => $unit['name'],
'uid' => $unit['uid'],
'level' => $this->default_acl_list[$this->acl['unit'][$ea_id]]['name'],
'default' => $unit['default'],
'data' => $unit['data']
);
// set default
if ($unit['default'])
{
$this->acl['unit_id'] = $unit['id'];
$this->acl['unit_name'] = $unit['name'];
$this->acl['unit_uid'] = $unit['uid'];
}
}
// flag if to show extra edit access drop downs (because user has multiple groups assigned)
if (count($_SESSION['UNIT']) > 1)
$this->acl['acl']['show_ea_extra'] = 1;
$this->acl['show_ea_extra'] = 1;
else
$this->acl['acl']['show_ea_extra'] = 0;
$this->acl['show_ea_extra'] = 0;
// set the default edit access
$this->acl['info']['default_edit_access'] = $_SESSION['UNIT_DEFAULT'];
// integrate the default_acl list, but only for the keyword -> level
foreach ($this->default_acl_list as $key => $value)
$this->acl['default_edit_access'] = $_SESSION['UNIT_DEFAULT'];
// integrate the type acl list, but only for the keyword -> level
foreach ($this->default_acl_list as $level => $data)
{
if (!is_numeric($key))
$this->acl['list'][$key] = $value;
$this->acl['min'][$data['type']] = $level;
}
// set the full acl list too
$this->acl['acl_list'] = $_SESSION['DEFAULT_ACL_LIST'];
// debug
// $this->debug('ACL', $this->print_ar($this->acl));
}
// METHOD: login_check_edit_access
@@ -622,7 +641,7 @@
// DESC : checks if this edit access id is valid
public function login_check_edit_access($edit_access_id)
{
if (array_key_exists($edit_access_id, $this->acl['info']['edit_access']))
if (array_key_exists($edit_access_id, $this->acl['unit']))
return true;
else
return false;
@@ -657,7 +676,7 @@
$data = 'User could not be found';
}
}
// check old passwords match -> error
// check old passwords match -> error
if (!$this->login_error)
{
$q = "SELECT edit_user_id FROM edit_user WHERE enabled = 1 AND username = '".$this->db_escape_string($this->pw_username)."' AND password = '".$this->db_escape_string($this->pw_old_password)."'";
@@ -801,11 +820,11 @@
else
{
return true;
}
}
}
// METHOD: login_set_templates
// PARAMS:
// PARAMS:
// RETURN: none
// DESC : checks if there are external templates, if not uses internal fallback ones
private function login_set_templates()
@@ -1011,5 +1030,17 @@ EOM;
return $edit_access_id;
}
// METHOD: login_set_edit_access_data
// PARAMS: edit access id, key value to search for
// RETURN: false for not found or string for found data
// DESC : searchs in the data set for the unit for the data key and returns the value asociated with it
public function login_set_edit_access_data($edit_access_id, $data_key)
{
if (!$_SESSION['UNIT'][$edit_access_id]['data'][$data_key])
return false;
else
return $_SESSION['UNIT'][$edit_access_id]['data'][$data_key];
}
} // close class
?>

View File

@@ -102,7 +102,6 @@ class ProgressBar
$bar = $this->height;
break;
}
// avoid divison through 0
if ($this->max - $this->min == 0)
$this->max ++;
@@ -557,7 +556,6 @@ class ProgressBar
$this->_setStep($step);
$js = '';
$new_position = $this->_calculatePosition($this->step);
if ($new_position['width'] != $this->position['width'] && ($this->direction == 'right' || $this->direction == 'left'))
{
@@ -576,7 +574,6 @@ class ProgressBar
$js .= 'PBposition'.$this->code.'("height",'.$new_position['height'].');';
}
$this->position = $new_position;
foreach($this->label as $name => $data)
{
if (array_key_exists('type', $data))

View File

@@ -10,8 +10,8 @@
// read in the Smarty class for definition
// use smarty BC for backwards compability
// try to include file from LIBS path, or from normal path
_spl_autoload('SmartyBC.class.php');
// try to include file from LIBS path, or from normal path
_spl_autoload('SmartyBC.class.php');
class SmartyML extends SmartyBC
{

View File

@@ -1,7 +1,7 @@
<?
/*********************************************************************
* AUTHOR: Clemens Schwaighofer
* CREATED: 2011/2/8
/*********************************************************************
* AUTHOR: Clemens Schwaighofer
* CREATED: 2011/2/8
* DESCRIPTION: pre function to collect all non critical errors into a log file if possible
* include this file at the very beginning of the script to get the notices, strict, etc messages.
* error etc will still be written to the log/display
@@ -42,7 +42,7 @@
4096 => 'E_RECOVERABLE_ERROR',
8192 => 'E_DEPRICATED',
16384 => 'E_USER_DEPRICATED',
30719 => 'E_ALL'
30719 => 'E_ALL'
);
// get the current page name (strip path)
@@ -94,7 +94,7 @@
}
// if write to log is on
// simplified, remove datetime for log file
if (ini_get('log_errors'))
if (ini_get('log_errors'))
error_log('{'.$page_temp.'} ['.$file.'] <'.$line.'> ['.$error_level[$type].'|'.$type.']: '.$message);
}
// return true, to avoid that php calls its own error stuff

View File

@@ -8,21 +8,21 @@ class qqUploadedFileXhr {
* Save the file to the specified path
* @return boolean TRUE on success
*/
function save($path) {
function save($path) {
$input = fopen("php://input", "r");
$temp = tmpfile();
$realSize = stream_copy_to_stream($input, $temp);
fclose($input);
if ($realSize != $this->getSize()){
if ($realSize != $this->getSize()){
return false;
}
$target = fopen($path, "w");
$target = fopen($path, "w");
fseek($temp, 0, SEEK_SET);
stream_copy_to_stream($temp, $target);
fclose($target);
return true;
}
function getName() {
@@ -30,17 +30,17 @@ class qqUploadedFileXhr {
}
function getSize() {
if (isset($_SERVER["CONTENT_LENGTH"])){
return (int)$_SERVER["CONTENT_LENGTH"];
return (int)$_SERVER["CONTENT_LENGTH"];
} else {
throw new Exception('Getting content length is not supported.');
}
}
}
}
}
/**
* Handle file uploads via regular form post (uses the $_FILES array)
*/
class qqUploadedFileForm {
class qqUploadedFileForm {
/**
* Save the file to the specified path
* @return boolean TRUE on success
@@ -64,44 +64,44 @@ class qqFileUploader {
private $sizeLimit = 10485760;
private $file;
function __construct(array $allowedExtensions = array(), $sizeLimit = 10485760){
function __construct(array $allowedExtensions = array(), $sizeLimit = 10485760){
$allowedExtensions = array_map("strtolower", $allowedExtensions);
$this->allowedExtensions = $allowedExtensions;
$this->allowedExtensions = $allowedExtensions;
$this->sizeLimit = $sizeLimit;
$this->checkServerSettings();
$this->checkServerSettings();
if (isset($_GET['qqfile'])) {
$this->file = new qqUploadedFileXhr();
} elseif (isset($_FILES['qqfile'])) {
$this->file = new qqUploadedFileForm();
} else {
$this->file = false;
$this->file = false;
}
}
private function checkServerSettings(){
private function checkServerSettings(){
$postSize = $this->toBytes(ini_get('post_max_size'));
$uploadSize = $this->toBytes(ini_get('upload_max_filesize'));
$uploadSize = $this->toBytes(ini_get('upload_max_filesize'));
if ($postSize < $this->sizeLimit || $uploadSize < $this->sizeLimit){
$size = max(1, $this->sizeLimit / 1024 / 1024) . 'M';
die("{'error':'increase post_max_size and upload_max_filesize to $size'}");
}
$size = max(1, $this->sizeLimit / 1024 / 1024) . 'M';
die("{'error':'increase post_max_size and upload_max_filesize to $size'}");
}
}
private function toBytes($str){
$val = trim($str);
$last = strtolower($str[strlen($str)-1]);
switch($last) {
case 'g': $val *= 1024;
case 'm': $val *= 1024;
case 'k': $val *= 1024;
case 'k': $val *= 1024;
}
return $val;
}
/**
* Returns array('success'=>true) or array('error'=>'error message')
*/
@@ -109,21 +109,21 @@ class qqFileUploader {
if (!is_writable($uploadDirectory)){
return array('error' => "Server error. Upload directory isn't writable.");
}
if (!$this->file){
return array('error' => 'No files were uploaded.');
}
$size = $this->file->getSize();
if ($size == 0) {
return array('error' => 'File is empty');
}
if ($size > $this->sizeLimit) {
return array('error' => 'File is too large');
}
$pathinfo = pathinfo($this->file->getName());
$filename = $pathinfo['filename'];
//$filename = md5(uniqid());
@@ -133,7 +133,7 @@ class qqFileUploader {
$these = implode(', ', $this->allowedExtensions);
return array('error' => 'File has an invalid extension, it should be one of '. $these . '.');
}
if(!$replaceOldFile){
/// don't overwrite previous files that were uploaded
while (file_exists($uploadDirectory . $filename . '.' . $ext)) {
@@ -141,17 +141,17 @@ class qqFileUploader {
}
}
$this->uploadFileName = $uploadDirectory . $filename . '.' . $ext;
$this->uploadFileExt = $ext;
$this->uploadFileName = $uploadDirectory . $filename . '.' . $ext;
$this->uploadFileExt = $ext;
if ($this->file->save($uploadDirectory . $filename . '.' . $ext)){
return array('success'=>true);
} else {
return array('error'=> 'Could not save uploaded file.' .
'The upload was cancelled, or server error encountered');
}
}
}
}
?>

View File

@@ -16,7 +16,7 @@
* 2004/09/30 (cs) layout cleanup
* /
/* collection of PostgreSQL wrappers
* collection of PostgreSQL wrappers
* REQUIRES 5.x PHP!!!
*
* pg_prepare

View File

@@ -7,7 +7,7 @@
* HISTORY:
* /
/* collection of PostgreSQL wrappers
/* collection of PostgreSQL wrappers
* REQUIRES 5.x PHP with compiled pdo pgsql (--with-pdo-pgsql)
*
*/