diff options
-rw-r--r-- | it_db.class | 250 | ||||
-rw-r--r-- | it_db_record.class | 520 | ||||
-rw-r--r-- | it_db_table.class | 328 | ||||
-rw-r--r-- | itools.lib | 3 |
4 files changed, 0 insertions, 1101 deletions
diff --git a/it_db.class b/it_db.class deleted file mode 100644 index 781432c..0000000 --- a/it_db.class +++ /dev/null @@ -1,250 +0,0 @@ -<?php -/* -** $Id$ -** -** ITools - the Internet Tools Library -** -** Copyright (C) 1995-2003 by the ITools Authors. -** This program is free software; you can redistribute it and/or -** modify it under the terms of either the GNU General Public License -** or the GNU Lesser General Public License, as published by the Free -** Software Foundation. See http://www.gnu.org/licenses/ for details. -** -** it_db.class - Generic Database class, currently using mysql. -** -** This tries to be as efficient as possible by maintaining -** persistent database connections. -*/ - - -/** - * Functions to handle SQL databases - * @see it_db_table, it_db_record - */ -class it_db -{ - /* public */ - var $host; /* Database host */ - var $host_update=''; /* Optional database host for updates */ - var $name; /* Name of database */ - var $numtables; /* Number of tables in databasee or 0 if not known */ - var $tablenames = array(); /* Array(0..$numtables) of table names */ - - /* private */ - var $link; /* MySQL Link Identifier */ - var $username; /* MySQL username (if $updatehost) */ - var $password; /* MySQL password (if $updatehost) */ - -/** - * Constructor: connect to MySQL server and select database - * @param $databasename name of the database to select or empty for default - * @param $username username to connect with - * @param $password password to connect with - * @param $host Optional name of the host to connect to - * @param $host_update Optional name of the host for updates (writes) - */ -function it_db($databasename, $username, $password, $host='localhost', $host_update='') -{ - if (empty($databasename)) - $databasename = strtr(ereg_replace('^www.', '', strtolower(ereg_replace(':.*$', '', getenv('HTTP_HOST')))), '.', '_'); - - if ($this->link = @mysql_connect($host, $username, $password, true)) - { - if (mysql_select_db($databasename, $this->link)) - { - $this->host = $host; - $this->name = $databasename; - } - else - it::fatal("Can't select database \"$databasename\" on host \"$host\"."); - } - else - it::fatal("Can't connect to database server \"$host\" as user \"$username\"."); - - if ($host_update) - { - $this->host_update = $host_update; - $this->username = $username; - $this->password = $password; - } -} - - -/** - * Perform an SQL query. - * @see ::safe_sql_query, mysql_query - * @param $sql SQL query - * @return SQL handle or false in case of failure - */ -function sql_query($sql) -{ - debug("it_db::sql_query($sql) on {$this->host}", 5); - - /* - ** If we have a special update host, and an update operation is to be - ** performed, we switch to this host. And we stay forever and ever and ever... - */ - if ($this->host_update && eregi('^(UPDATE|INSERT|REPLACE|DELETE|ALTER) ', $sql)) - { - /*debug('it_db::sql_query(): switching to update host "'.$this->host_update.'"', 3); */ - if ($this->link = @mysql_connect($this->host_update, $this->username, $this->password, true)) - { - if (mysql_select_db($this->name, $this->link)) - $this->host = $this->host_update; - else - it::fatal('Error selecting update database "'.$this->name.'" on host "'.$this->host_update.'".'); - - $this->host_update=''; - } - else - it::fatal('Error connecting to update database server "'.$this->host_update.'" as user "'.$this->username.'".'); - } - - return mysql_query($sql, $this->link); -} - - -/** - * Perform an SQL query. If the query fails, issue an error message - * and terminate program execution. No matching rows does not mean failure. - * @see ::sql_query, mysql_query - * @param $sql SQL query - * @return SQL handle - */ -function safe_sql_query($sql) -{ - /* debug("it_db::safe_sql_query($sql)", 4); */ - if ($result = $this->sql_query($sql)) - return $result; - else - { - if ($this->errno() == 1062) /* Duplicate entry */ - return 0; - - fail('SQL-Query db "'.$this->name.'" host "'.$this->host."\" failed: \"$sql\":<br>".$this->error().' ('.$this->errno().')'); - } -} - - -/** - * Free resources used by SQL handle - * @see mysql_free_result - * @param $handle SQL handle - * @return - */ -function free($handle) -{ - return mysql_free_result($handle); -} - - -/** - * Fetch a row as an array - * @see mysql_fetch_array - * @param $handle SQL handle - * @return numeric & associative array with contents of table row - */ -function fetch_array($handle) -{ - return mysql_fetch_array($handle); -} - - -/** - * Fetch a row as an associative array - * @see mysql_fetch_array - * @param $handle SQL handle - * @return associative array with contents of table row - */ -function fetch_assoc($handle) -{ - return mysql_fetch_assoc($handle); -} - - -/** - * Return number of rows of a query - * @see mysql_num_rows - * @param $handle SQL handle - * @return number of rows the query returned - */ -function num_rows($handle) -{ - return mysql_num_rows($handle); -} - - -/** - * Return number of found rows of a limited query that had SQL_COUNT_FOUND_ROWS set - * @return number of rows the query would have returned without LIMIT - */ -function found_rows() -{ - list($count) = mysql_fetch_row($this->safe_sql_query('SELECT FOUND_ROWS()')); - return intval($count); -} - - -/* Internal: get information about tables */ -function _get_table_info() -{ - if ($this->numtables > 0) /* Already done! */ - return; - - if(($tables = mysql_list_tables($this->name,$this->link)) >= 0) - { - $this->numtables = mysql_numrows($tables); - for ($i=0; $i < $this->numtables; ++$i) - { - $name = mysql_tablename($tables, $i); - $this->tablenames[$i] = $name; - } - } - else it::fatal("mysql_list_tables($this->name,$this->link) failed."); -} - - -/** - * Return a list of all table names of this database - * @return array with tablenames of this Database - */ -function table_names() -{ - $this->_get_table_info(); - return $this->tablenames; -} - - -/** - * Return number of tables in this database - */ -function num_tables() -{ - $this->_get_table_info(); - return $this->numtables; -} - - -/** - * Return last error number - * @see ::sql_query, ::safe_sql_query, mysql_errno - * @return last mySQL error number - */ -function errno() -{ - return mysql_errno($this->link); -} - - -/** - * Return last error string - * @see ::sql_query, ::safe_sql_query, mysql_error - * @return last mySQL error message - */ -function error() -{ - return mysql_error($this->link); -} - -} /* End class it_db */ -?> diff --git a/it_db_record.class b/it_db_record.class deleted file mode 100644 index a716117..0000000 --- a/it_db_record.class +++ /dev/null @@ -1,520 +0,0 @@ -<?php -/* -** $Id$ -** -** it_db_record.class - A database record based on it_db_table and it_db -** -** ITools - the Internet Tools Library -** -** Copyright (C) 1995-2003 by the ITools Authors. -** This program is free software; you can redistribute it and/or -** modify it under the terms of either the GNU General Public License -** or the GNU Lesser General Public License, as published by the Free -** Software Foundation. See http://www.gnu.org/licenses/ for details. -*/ - -/** - * Functions to handle MySQL records - * @see it_db, it_db_table - */ -class it_db_record -{ - var $table; /* Table object */ - var $handle; /* SQL handle for select() / fetch_next() */ - var $keyfieldname; /* Name of primary key field */ - var $key; /* Key of loaded record or empty if no record is loaded */ - var $data = array(); /* Data fields */ - - -/** - * Initialize internal data (table object and name of key field) - * @param $table Underlying table object (class it_db_table) - * @param $keyfieldname Optional name of primary key field, defaults to 'ID' - */ -function it_db_record(&$table, $keyfieldname='ID') -{ - $this->table = &$table; - $this->keyfieldname = $keyfieldname; -} - - -/** - * Change active key field - * @param $keyfieldname Optional name of primary key field, defaults to 'ID' - */ -function set_key_field($keyfieldname='ID') -{ - $this->keyfieldname = $keyfieldname; - $this->key = isset($this->data[$keyfieldname]) ? $this->data[$keyfieldname] : ''; -} - - -/** - * Select a set of records of this table according to an array of selection - * and sorting criteria. - * Use fetch_next() to iterate through the result set<br> - * Example:<br> - * $record->select(array('Type' => 'bar', 'Date >=' => '1999-01-01', - * '-Date <' => 'NOW()', 'User NI' => 'chris'), 'ORDER BY Date'); - * - * @param $params optional array of fieldname => value tupels. - * These are ANDed to form a WHERE clause. - * fieldname can contain an operator (separated by space), the - * default operator is '='. The special operator 'NI' specifies - * that the argument must be contained in a comma-separated list. - * - * @param $sql Optional SQL addendum added after $params (ORDER BY etc.) - * @param $fields Optional field list to select (defaults to '*') - * @return Number of rows that matched this query - * @see it_db_record::fetch_next, it_db_table::construct_sql_clause - * - */ -function select($params='', $sql='', $fields='*') -{ - $this->handle = $this->table->safe_sql_select($this->table->construct_sql_clause($params, $sql), $fields); - return $this->table->db->num_rows($this->handle); -} - - -/** - * Post-process data after reading a record. - * This is a stub-function that can be overloaded. - */ -function _read_post_process() -{ -} - - -/** - * Pre-process data before writing a record. - * This is a stub-function that can be overloaded. - * @param $tags Reference to update/create tags, can be modified as needed - */ -function _write_pre_process(&$tags) -{ -} - - -/** - * Fetch the next record of a select() query - * @return true if a record was successfully fetched, false otherwise - * @see it_db_record::select - */ -function fetch_next() -{ - return $this->fetch($this->handle); -} - - -/** - * Fetch the next record from an SQL result into this object. - * If no more records are pending, clear the object's data. - * @param $sqlresult Result of table::sql_select() or similar - * @return 1 if a record was successfully fetched, 0 otherwise - */ -function fetch(&$sqlresult) -{ - $result = 0; - - if ($this->data = $this->table->db->fetch_assoc($sqlresult)) - { - $this->key = $this->data[$this->keyfieldname]; - $result = 1; - } - else - { - $this->key = ""; /* "No record is loaded" */ - $this->data = array(); /* Clear local record data */ - } - - $this->_read_post_process(); - - return $result; -} - - -/** - * Read a record from table - * @param $key key field value of the desired row - * @return 1 on success, 0 otherwise - */ -function read($key) -{ - $result = 0; - - if ($key != "") - { - $result = $this->fetch($this->table->safe_sql_select("WHERE $this->keyfieldname='" . mysql_real_escape_string($key) . "'")); - } - else - { - $this->key = ""; /* "No record is loaded" */ - $this->data = array(); /* Clear local record data */ - } - - $this->_read_post_process(); - - return $result; -} - - -/** - * Create a new record in the table - * @see it_db_record::record_create, it_db_record::safe_create - * @param $tags array of Fieldname/Value pairs - * @param $replace use REPLACE (1) instead of INSERT (otherwise) - * @return MySQL result (0 means failure) - */ -function create($tags, $replace=0) -{ - /* Pre-processing, $tags is passed by reference and may be modified here */ - $this->_write_pre_process($tags); - - $sql = $replace ? "REPLACE" : "INSERT"; - $sql .= " INTO " . $this->table->name . " ("; - $sql2 = ''; - - unset($this->data); - for ($sep=""; $ti = each($tags); $sep=",") - { - /* If the field name starts with '-', the value is taken as raw, no escaping - is done and no quotes are put around it. */ - if (substr($ti[0], 0, 1) == '-') - { - $ti[0] = substr($ti[0], 1); /* Strip that '-' sign */ - $val = $ti[1]; - } - else - $val = isset($ti[1]) ? "'".mysql_real_escape_string($ti[1])."'" : 'NULL'; - - $this->data[$ti[0]] = $ti[1]; /* Store data for later use */ - - $sql .= $sep . $ti[0]; - $sql2 .= "$sep$val"; - } - - $sql .= ") VALUES ($sql2)"; - - if ($result = $this->table->db->sql_query($sql)) - { - /* If the key element was not given, it means it's an AUTO_INCREMENT thingy. */ - if (($this->key = $this->data[$this->keyfieldname]) == "") - { - $result = $this->table->db->safe_sql_query("SELECT LAST_INSERT_ID()"); - $this->key = mysql_result($result, 0, 0); - } - - /* We need all fields from record, not only those we initialised */ - $this->read($this->key); - } - - return $result; -} - - -/** - * Safe version of create (doesn't return in case of failure) - * @see it_db_record::create, it_db_record::record_create - * @param $tags array of Fieldname/Value pairs - * @param $replace use REPLACE (1) instead of INSERT (otherwise) - * @return MySQL result (0 means failure) - */ -function safe_create($tags, $replace=0) -{ - if ($result = $this->create($tags, $replace)) - return $result; - else - fail("it_db_record::safe_create() failed: " . $this->table->db->error()); -} - - -/** - * Update a record in the table - * @param $tags array of Fieldname/Value pairs - * @return MySQL result (0 means failure) - */ -function update($tags) -{ - /* Pre-processing, $tags is passed by reference and may be modified here */ - $this->_write_pre_process($tags); - - if ($this->key == "") - it::fatal("it_db_record::update(): can't update undefined record"); - - /* If we have nothing to do, return instead of performing an invalid SQL query */ - if (!count($tags)) - return true; - - $sql = "UPDATE " . $this->table->name . " SET "; - - for ($sep="", $raw=0; $ti = each($tags); $sep=",") - { - /* If the field name starts with '-', the value is taken as raw, no escaping - is done and no quotes are put around it. */ - if (substr($ti[0], 0, 1) == '-') - { - $ti[0] = substr($ti[0], 1); /* Strip that '-' sign */ - $val = $ti[1]; - $raw++; - } - else - $val = "'".mysql_real_escape_string($ti[1])."'"; - - $sql .= $sep.$ti[0].'='.$val; - - if ($ti[0] == $this->key) - { - if ($this->data[$this->keyfieldname] != $ti[0]) - it::fatal("$sql: trying to change key from $this->key."); - } - - $this->data[$ti[0]] = $ti[1]; - } - - $sql .= " WHERE " . $this->keyfieldname . "='" . mysql_real_escape_string($this->key) . "'"; - - /* debug("it_db_record::update(): $sql"); */ - $ret = $this->table->db->safe_sql_query($sql); - - /* Only re-read record if necessary (for performance), but always do post-processing. */ - if ($raw) - $this->read($this->key); - else - $this->_read_post_process(); - - return $ret; -} - - -/** - * Delete the current record from the database - * @param $key keyfield value of the record to be deleted. If this is missing, the current record is deleted. - * @return MySQL result (0 means failure) - */ -function delete($key="") -{ - if (!$key) $key = $this->key; - - if (($this->table->name == "") || ($this->keyfieldname == "") || ($key == "")) - it::fatal("it_db_record::delete(): no record\n"); - - $sql = "DELETE FROM " . $this->table->name . " WHERE ". $this->keyfieldname . "='" . mysql_real_escape_string($key) . "'"; - if ($result = $this->table->db->sql_query($sql)) - { - $this->key = ""; - $this->data = array(); - } - return $result; -} - - -/** - * Return a field of a record. - * @param $field field name - * @return field value. If the field does not exists, issue an - * error message and terminate program execution. - */ -function safe_get_field($field) -{ - if ($field) - { - if (isset($this->data[$field])) - return $this->data[$field]; - else it::fatal("it_db_record::safe_get_field(): field \"$field\" not present in record."); - } - else it::fatal("it_db_record::safe_get_field(): empty field name"); -} - - -/** - * Output all fields of a record in (ugly) html format - */ -function dump_html() -{ - echo "<br>Dump of table " . $this->table->name . ", record " . $this->keyfieldname . " = \"" . $this->key . "\":<br><pre>\n"; - reset($this->data); next($this->data); - while(list($key, $value) = each($this->data)) - { - if ($key > 0) continue; /* $$$ ugly */ - echo $key . " = \"" . htmlspecialchars($value) . "\"\n"; - } - echo "</pre><br>\n"; -} - - -/** - * Edit a record of a table. Create a new record if necessary.<br> - * Example:<br> - * $record->edit($id, array('ID' => $id)); - * - * @param $key key value of the row to edit - * @param $fixfields Array of fields not editable (with fixed values) - * @return 1=changed, 2=created, -1=deleted, 0=nothing changed - */ -function edit($key, $fixfields = array()) -{ - $returnresult = 0; - $numfields = $this->table->num_fields(); - - if ($_REQUEST['_COMMAND']) - { - /* - ** If the key field is changed, $key will carry a wrong value, so we - ** take the correct one from $_RECORD_KEY_VALUE - */ - $key = $_REQUEST['_RECORD_KEY_VALUE']; - - switch($_REQUEST['_COMMAND']) - { - case "EDIT": - $this->read($key); - $newdata = array(); - $changes = 0; - for ($i=0; $i < $numfields; ++$i) - { - $fieldname = $this->table->fieldnames[$i]; - - /* Assumes field order is fixed */ - if (isset($fixfields[$fieldname])) - $newvalue = $fixfields[$fieldname]; - else if (is_array($_REQUEST["_RECORD_$fieldname"])) - $newvalue = join(',', $_REQUEST["_RECORD_$fieldname"]); - else - $newvalue = $_REQUEST["_RECORD_$fieldname"]; - - if ($this->data[$fieldname] != $newvalue) - { - $newdata[$fieldname] = $newvalue; - $changes = 1; - } - } - - if ($changes) - { - if ($this->update($newdata)) - { - echo "<b>Änderung erfolgreich durchgeführt.</b><br>\n"; - $returnresult = 1; - } - else - fail("Update failed."); - } - else echo "<b>Keine Änderungen.</b><br>\n"; - break; - - case "CREATE": - $newdata = array(); - for ($i=0; $i < $numfields; ++$i) - { - $fieldname = $this->table->fieldnames[$i]; - - if (isset($fixfields[$fieldname])) - $newvalue = $fixfields[$fieldname]; - else if (is_array($_REQUEST["_RECORD_$fieldname"])) - $newvalue = join(',', $_REQUEST["_RECORD_$fieldname"]); - else - $newvalue = $_REQUEST["_RECORD_$fieldname"]; - - $newdata[$fieldname] = $newvalue; - } - - if ($this->create($newdata)) - { - $key = $this->key; - echo "<b>Datensatz erzeugt.</b><br>\n"; - $returnresult = 2; - } - else - fail("Datensatz konnte nicht erzeugt werden."); - break; - - case "DELETE": - if ($this->delete($key)) - { - echo "<b>Datensatz gelöscht.</b><br>\n"; - $returnresult = -1; - } - else - fail("Datensatz konnte nicht gelöscht werden."); - break; - - default: - fail("Unknown _COMMAND \"{$_REQUEST['_COMMAND']}\""); - /* NOT REACHED */ - } - } - - if ($key != "") - { - $this->read($key); - $cmd = "EDIT"; - $buttontext = "Änderungen übernehmen"; - } - else - { - $cmd = "CREATE"; - $buttontext = "Datensatz erzeugen"; - } - - echo "<form action=\"\" method=\"post\"><input type=\"hidden\" name=\"_COMMAND\" value=\"$cmd\"><input type=\"hidden\" name=\"_RECORD_KEY_NAME\" value=\"$this->keyfieldname\"><input type=\"hidden\" name=\"_RECORD_KEY_VALUE\" value=\"$this->key\">\n"; - echo "<table border=1 cellspacing=0 cellpadding=4>\n"; - for ($i=0; $i < $numfields; ++$i) - { - $fieldname = $this->table->fieldnames[$i]; - - /* Do not display fix fields */ - if (isset($fixfields[$fieldname])) - continue; - - $fieldflags = $this->table->fieldflags[$i]; - $fieldlen = $this->table->fieldlengths[$i]; - $size = min($fieldlen, 65); - - if ($fieldname == $this->keyfieldname) - echo "<tr><th align=right>$fieldname</th>"; - else - echo "<tr><td align=right>$fieldname</td>"; - - if (strstr($fieldflags, "blob")) - { - if (strlen($this->data["$fieldname"]) < 256) - echo "<td><textarea name=\"_RECORD_$fieldname\" rows=4 cols=56 wrap=\"physical\">" . htmlspecialchars($this->data["$fieldname"]) . "</textarea></td></tr>\n"; - else - echo "<td><textarea name=\"_RECORD_$fieldname\" rows=10 cols=75 wrap=\"physical\">" . htmlspecialchars($this->data["$fieldname"]) . "</textarea></td></tr>\n"; - } - else if (strstr($fieldflags, "enum")) - { - $result = $this->table->db->safe_sql_query("SHOW columns FROM ". $this->table->name . " LIKE '$fieldname'"); - $options = split("'", mysql_result($result, 0, 1)); - - $vals = explode(',', $this->data[$fieldname]); - - for ($j = 0; $j < count($vals); $j++) - $values[$vals[$j]] = 1; - - if (strstr($options[0], 'set')) - $attr = 'multiple'; - else - $attr = 'set="1"'; - - echo "<td><select name=\"_RECORD_${fieldname}[]\" $attr>"; - for ($j=1; $options[$j]; $j+=2) - { - $selected = $values[$options[$j]] ? " selected" : ""; - echo "<option$selected>", $options[$j], "</option>"; - } - echo "</select></td></tr>\n"; - } - else - echo "<td><input type=\"text\" size=$size name=\"_RECORD_$fieldname\" maxlength=\"$fieldlen\" value=\"" . htmlspecialchars($this->data["$fieldname"]) . "\"></td></tr>\n"; - } - echo "</table><br><input type=\"submit\" value=\"$buttontext\"></form>\n"; - - if ($this->key != "") - echo "<form action=\"\" method=\"post\"><input type=\"hidden\" name=\"_COMMAND\" value=\"DELETE\"><input type=\"hidden\" name=\"_RECORD_KEY_NAME\" value=\"$this->keyfieldname\"><input type=\"hidden\" name=\"_RECORD_KEY_VALUE\" value=\"$this->key\"><input type=\"submit\" value=\"Datensatz löschen\"></form>\n"; - - return $returnresult; -} - -} /* End class it_db_record */ -?> diff --git a/it_db_table.class b/it_db_table.class deleted file mode 100644 index 455cf2e..0000000 --- a/it_db_table.class +++ /dev/null @@ -1,328 +0,0 @@ -<?php -/* -** $Id$ -** -** ITools - the Internet Tools Library -** -** Copyright (C) 1995-2003 by the ITools Authors. -** This program is free software; you can redistribute it and/or -** modify it under the terms of either the GNU General Public License -** or the GNU Lesser General Public License, as published by the Free -** Software Foundation. See http://www.gnu.org/licenses/ for details. -** -** it_db_table.class - A database table based on it_db.class -*/ - -/** - * Functions to handle SQL database tables - * @see it_db, it_db_record - */ -class it_db_table -{ - var $db; /* Underlying Database */ - var $name; /* Tabellenname */ - - var $numfields = 0; /* Number of fields in table or 0 if not known */ - var $fieldnames = array(); /* Array(0..$numfields) of field names */ - var $fieldtypes = array(); /* Array(0..$numfields) or (fieldnames) of field types */ - var $fieldlengths = array(); /* Array(0..$numfields) or (fieldnames) of field lengths */ - var $fieldflags = array(); /* Array(0..$numfields) or (fieldnames) of field flags */ - -/** - * Initialize object data - * @param $db it_db object of the database to be used - * @param $name name of the table to be used - */ -function it_db_table(&$db, $name) -{ - $this->db = &$db; - $this->name = $name; -} - - -/** - * Perform a safe SQL SELECT query on this table - * @see it_db::safe_sql_query - * @param $query additional query string, appended at the end of the generated query - * @param $fields comma seperated list of the columns to be returned - */ -function safe_sql_select($query, $fields="*") -{ - return $this->db->safe_sql_query("SELECT $fields FROM " . $this->name . " $query"); -} - - -/** - * Create an SQL query (the stuff after 'WHERE'). - * @see it_dbi::_where() for more details. - * @param $sql Optional SQL addendum (added after $params), for ORDER BY etc. - * @param $omit_where (optional) Do not add 'WHERE ' at beginning of result (default: false) - */ -function construct_sql_clause($params='', $sql='', $omit_where=false) -{ - return trim(it_dbi::_where($params, null, $omit_where) . " $sql"); -} - - -/** - * Return the count of rows on this table with optional WHERE clause - * @param $where Optional WHERE clause to narrow the set of rows to count - * @return Number of rows matching the WHERE clause - */ -function count($where='') -{ - $result = $this->safe_sql_select($where, 'COUNT(*)'); - $row = $this->db->fetch_assoc($result); - return $row['COUNT(*)']; -} - - -/* Internal: get information about fields */ -function _get_field_info() -{ - if ($this->numfields > 0) /* Already done! */ - return; - - if(($fields = mysql_list_fields($this->db->name, $this->name, $this->db->link)) >= 0) - { - $this->numfields = mysql_num_fields($fields); - for ($i=0; $i < $this->numfields; ++$i) - { - $name = mysql_field_name($fields, $i); - $this->fieldnames[$i] = $name; - $this->fieldtypes[$i] = $this->fieldtypes[$name] = mysql_field_type($fields, $i); - $this->fieldlengths[$i] = $this->fieldlengths[$name] = mysql_field_len($fields, $i); - $this->fieldflags[$i] = $this->fieldflags[$name] = mysql_field_flags($fields, $i); - /* debug("name='" . $this->fieldnames[$i] . "', len=" . $this->fieldlengths[$i] . ", type='" . $this->fieldtypes[$i] . "', flags='" . $this->fieldflags[$i] . "'\n", 6); */ - } - } - else it::fatal("mysql_list_fields($this->db->name, $this->name, $this->db->link) failed."); -} - - -/** - * Return a comma separated list of all field names of this table - */ -function field_names() -{ - $result = ''; - $this->_get_field_info(); - for ($i=0; $i < $this->numfields; ++$i) - { - if ($i > 0) $result .= ","; - $result .= $this->fieldnames[$i]; - } - return $result; -} - - -/** - * Return the length of a field - * @param $fieldname Name of the field - */ -function get_field_length($name) -{ - $this->_get_field_info(); - return $this->fieldlengths[$name]; -} - - -/** - * Return number of fields of a record of this table - */ -function num_fields() -{ - $this->_get_field_info(); - return $this->numfields; -} - - -/** - * Variable name used to propagate sort criteria - */ -function get_sort_variable_name() -{ - return "Sort" . md5($this->db->name . $this->name); -} - - -/** - * Print an SQL table as an HTML table. Supports user-sorting by column, - * limited WHERE clause, lists of fields to display and header texts, and - * a list of links for each field. - * @param $tableargs format string for the table or "" for default - * @param $sqlwhere SQL WHERE clause to restrict elements - * @param $c_fields comma seperated list of the fields to print - * @param $c_descriptions comma seperated list of the header labels to print - * @param $c_links dito with links to the respective elements - * @param $default_order default sort order: "fieldname" or "fieldname DESC" - * @param $rows_limit limit and position: "10" or "20,5" - */ -function dump_html($tableargs="", $sqlwhere="", $c_fields="", $c_descriptions="", $c_links="", $default_order="", $rows_limit="", $thispage="", $strip_tags=0) -{ - /* Unique identifier of this table */ - $table_sort = $this->get_sort_variable_name(); - - /* Default HTML table */ - if ($tableargs=="") - $tableargs="border=1 cellspacing=0 cellpadding=5"; - - /* Default field list: show them all */ - if ($c_fields == "") - $c_fields = $this->field_names(); - - /* Default list title: Field names */ - if ($c_descriptions == "") - $c_descriptions = $c_fields; - - $fields = split(",", $c_fields); - $descriptions = split(",", $c_descriptions); - $links = split(",", $c_links); - $numfields = count($fields); - - /* Default sort criterium: Ascending sort by first column */ - if ($default_order == "") - $default_order = $fields[0]; - - if (!in_array(it::replace(array(' DESC$' => ""), $_REQUEST[$table_sort]), $fields)) - $_REQUEST[$table_sort] = $default_order; - - $sql = "SELECT $c_fields FROM $this->name"; - - if ($sqlwhere) - $sql .= " WHERE $sqlwhere"; - - $sql .= " ORDER BY $_REQUEST[$table_sort]"; - - if ($rows_limit != "") - $sql .= " LIMIT $rows_limit"; - - $result = $this->db->safe_sql_query($sql); - - if ($this->db->num_rows($result) == 0) - { - if (is_object($GLOBALS['it_text'])) - echo T("db_NoObjectsFound"). "<br>\n"; - return; - } - - echo "<table $tableargs>\n"; - - /* Wenn man keine Titelzeile will, für c_descriptions einfach "," angeben */ - if ($descriptions[0]) - { - echo '<tr>'; - for ($i=0; $i < $numfields; ++$i) - { - if ($_REQUEST[$table_sort] == $fields[$i]) - { - $newsort = "$_REQUEST[$table_sort] DESC"; - $sortimg = '<img src="/icons/down.gif" border="0" width="10" height="11" alt="">'; - } - else if ($_REQUEST[$table_sort] == "$fields[$i] DESC") - { - $newsort = $fields[$i]; - $sortimg = '<img src="/icons/up.gif" border="0" width="10" height="11" alt="">'; - } - else - { - $newsort = $fields[$i]; - $sortimg = ''; - } - - echo "<th align=\"left\">\n"; - echo "<table border=\"0\">\n<tr valign=\"middle\">\n"; - echo '<td><a href="'. it_html::U($thispage, array($table_sort => $newsort) + $_GET) .'">'. $descriptions[$i] .'</a></td>'; - echo '<td><a href="'. it_html::U($thispage, array($table_sort => $newsort) + $_GET) .'">'. $sortimg .'</a></td>'; - echo "</tr>\n</table>\n"; - echo "</th>\n"; - } - echo "</tr>\n"; - } - - while ($f = $this->db->fetch_array($result)) - { - echo "<tr>"; - for ($i=0; $i<$numfields; ++$i) - { - $fieldspec = $f[$fields[$i]]; - if (!$fieldspec) $fieldspec = " "; - if ($fieldspec == "0.00") $fieldspec = "-"; - /*if (strlen($fieldspec) > 80) $fieldspec = substr($fieldspec, 0, 80) . "..."; */ - - if (isset($links[$i])) - { - if (strstr($links[$i], "?")) $ch = "&"; else $ch = "?"; - $anchor="<a href=\"" . $links[$i] . $ch . $fields[$i] . "=" . urlencode($f[$fields[$i]]) . "\">"; - $anchor2="</a>"; - } - else - $anchor = $anchor2 = ""; - - if ($strip_tags) - $fieldspec = strip_tags($fieldspec); - echo "<td>$anchor" . $fieldspec . "$anchor2</td>"; - } - echo "</tr>\n"; - } - echo "</table>\n"; -} - - -/** - * Make a 'select form field' ("Select-Form-Feld") from a table and pre-select an entry - * @param $name Name of FORM object to generate - * @param $selected Selected record - * @param $globaloption Option to add as first value, syntax: key,text - * @param $optionfield Table field to use for option keys - * @param $descriptionfield Table field to display - * @param $query SQL Query after "FROM ...", defaults to "ORDER BY $descriptionfield" - */ -function make_select($name, $selected, $globaloption, $optionfield, $descriptionfield, $query="") -{ - $globalopt = split(",", $globaloption); - - if (empty($query)) - $query = "ORDER BY $descriptionfield"; - $query = "SELECT * FROM $this->name $query"; - - echo "<select name=\"$name\">"; - - if ($globaloption != "") - echo "<option value=\"", $globalopt[0], "\">", $globalopt[1], "</option>"; - - $result = $this->db->safe_sql_query($query); - - while ($row = $this->db->fetch_array($result)) - { - $tag = ($row[$optionfield] == $selected) ? " selected" : ""; - echo "<option value=\"", $row[$optionfield], "\"$tag>", $row[$descriptionfield], "</option>"; - } - echo "</select>\n"; -} - - -/** - * Drops the current table from the database - * @return MySQL result (0 means failure) - */ -function drop() -{ - if ($this->name == '') - it::fatal("it_db_table::drop(): no table\n"); - - if ($result = $this->db->sql_query('DROP TABLE IF EXISTS '.$this->name)) - { - $this->name = ''; - $numfields = 0; - $fieldnames = array(); - $fieldtypes = array(); - $fieldlengths = array(); - $fieldflags = array(); - } - - return $result; -} - -} /* End class it_db_table */ -?> @@ -21,9 +21,6 @@ require_once 'itools/auto_prepend.php'; require_once 'itools/it.class'; require_once 'itools/it_browser.class'; -require_once 'itools/it_db.class'; -require_once 'itools/it_db_record.class'; -require_once 'itools/it_db_table.class'; require_once 'itools/it_dbi.class'; require_once 'itools/it_debug.class'; require_once 'itools/it_html.class'; |