1) fixed not working inserts, if primary key (not auto-increment) where given

2) allow 0 to be written and not treated as null
3) added join feature for search
This commit is contained in:
Ralf Becker 2005-04-08 18:30:32 +00:00
parent 4439adc46a
commit 20cacc2f1d

View File

@ -23,7 +23,7 @@
* @package etemplate
* @subpackage contrib
* @author RalfBecker-AT-outdoor-training.de
* @license GPL
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
*/
class so_sql
{
@ -155,6 +155,8 @@ class so_sql
*/
function data_merge($new)
{
if ($this->debug) echo "<p>so_sql::data_merge(".print_r($new).")</p>\n";
if (!is_array($new) || !count($new))
{
return;
@ -173,6 +175,7 @@ class so_sql
$this->data[$col] = $new[$col];
}
}
if ($this->debug) _debug_array($this->data);
}
/**
@ -307,13 +310,15 @@ class so_sql
$this->data2db();
//echo "so_sql::save(".print_r($keys,true).") autoinc_id='$this->autoinc_id', data="; _debug_array($this->data);
if ($this->autoinc_id && !$this->data[$this->db_key_cols[$this->autoinc_id]]) // insert
{
foreach($this->db_cols as $db_col => $col)
{
if (!$this->autoinc_id || $db_col != $this->autoinc_id) // not write auto-inc-id
{
$data[$db_col] = $this->data[$col] == '' && $this->empty_on_write == 'NULL' ? null : $this->data[$col];
$data[$db_col] = (string) $this->data[$col] === '' && $this->empty_on_write == 'NULL' ? null : $this->data[$col];
}
}
$this->db->insert($this->table_name,$data,false,__LINE__,__FILE__);
@ -327,18 +332,25 @@ class so_sql
{
foreach($this->db_data_cols as $db_col => $col)
{
$data[$db_col] = $this->data[$col] == '' && $this->empty_on_write == 'NULL' ? null : $this->data[$col];
$data[$db_col] = (string) $this->data[$col] === '' && $this->empty_on_write == 'NULL' ? null : $this->data[$col];
}
$keys = '';
foreach($this->db_key_cols as $db_col => $col)
{
$keys[$db_col] = $this->data[$col];
}
$this->db->update($this->table_name,$data,$keys,__LINE__,__FILE__);
if (!$this->autoinc_id) // always try an insert if we have no autoinc_id, as we dont know if the data exists
{
$this->db->insert($this->table_name,$data,$keys,__LINE__,__FILE__);
}
else
{
$this->db->update($this->table_name,$data,$keys,__LINE__,__FILE__);
}
}
$this->db2data();
return $this->db->errno;
return $this->db->Errno;
}
/**
@ -390,9 +402,11 @@ class so_sql
* @param string $op defaults to 'AND', can be set to 'OR' too, then criteria's are OR'ed together
* @param int/boolean $start if != false, return only maxmatch rows begining with start
* @param array $filter if set (!=null) col-data pairs, to be and-ed (!) into the query without wildcards
* @param string $join='' sql to do a join, added as is after the table-name, eg. ", table2 WHERE x=y" or
* "LEFT JOIN table2 ON (x=y)", Note: there's no quoting done on $join!
* @return array of matching rows (the row is an array of the cols) or False
*/
function search($criteria,$only_keys=True,$order_by='',$extra_cols='',$wildcard='',$empty=False,$op='AND',$start=false,$filter=null)
function search($criteria,$only_keys=True,$order_by='',$extra_cols='',$wildcard='',$empty=False,$op='AND',$start=false,$filter=null,$join='')
{
if (!is_array($criteria))
{
@ -403,17 +417,23 @@ class so_sql
$criteria = $this->data2db($criteria);
foreach($this->db_cols as $db_col => $col)
{ //echo "testing col='$col', criteria[$col]='".$criteria[$col]."'<br>";
{
//echo "testing col='$col', criteria[$col]='".print_r($criteria[$col],true)."'<br>";
if (isset($filter[$col]) && $filter[$col]) continue; // added later
if (isset($criteria[$col]) && ($empty || $criteria[$col] != ''))
{
$query .= ($query ? " $op " : '') . $db_col .
($wildcard || strstr($criteria[$col],'*') || strstr($criteria[$col],'?') ?
' LIKE '.$this->db->quote($wildcard.strtr(str_replace('_','\\_',$criteria[$col]),'*?','%_').$wildcard) :
"=".$this->db->quote($criteria[$col]));
if ($wildcard || strstr($criteria[$col],'*') || strstr($criteria[$col],'?'))
{
$query[] = $db_col.' LIKE '.$this->db->quote($wildcard.str_replace(array('%','_','*','?'),array('\\%','\\_','%','_'),$criteria[$col]).$wildcard);
}
else
{
$query[$db_col] = $criteria[$col];
}
}
}
if (is_array($query) && $op != 'AND') $query = $this->db->column_data_implode(' '.$op.' ',$query);
}
if (is_array($filter))
{
@ -428,28 +448,49 @@ class so_sql
{
if ($val !== '') $db_filter[array_search($col,$this->db_cols)] = $val;
}
if ($query) $db_filter[] = '('.$query.')';
if ($query)
{
if ($op != 'AND')
{
$db_filter[] = '('.$this->db->column_data_implode(' '.$op.' ',$query).')';
}
else
{
$db_filter = array_merge($db_filter,$query);
}
}
$query = $db_filter;
}
if ($start !== false) // need to get the total too, saved in $this->total
{
$this->db->select($this->table_name,'COUNT(*)',$query,__LINE__,__FILE__);
$this->db->select($this->table_name,'COUNT(*)',$query,__LINE__,__FILE__,0,'',false,0,$join);
$this->total = $this->db->next_record() ? (int) $this->db->f(0) : false;
}
$cols = $only_keys === true ? $this->db_key_cols : (!$only_keys ? $this->db_cols : explode(',',str_replace('DISTINCT ','',$only_keys)));
$this->db->select($this->table_name,($only_keys === true ? implode(',',$this->db_key_cols) : (!$only_keys ? '*' : $only_keys)).
($extra_cols ? ','.(is_array($extra_cols) ? implode(',',$extra_cols) : $extra_cols) : ''),
$query,__LINE__,__FILE__,$start,$order_by ? 'ORDER BY '.$order_by : '');
$query,__LINE__,__FILE__,$start,$order_by ? 'ORDER BY '.$order_by : '',false,0,$join);
if ($this->debug)
{
echo "<p>so_sql::search(,only_keys=$only_keys,order_by='$order_by',wildcard='$wildcard',empty=$empty,$op,start='$start',".print_r($filter,true).") query=".print_r($query,true).", total='$this->total'</p>\n";
echo "<br>criteria = "; _debug_array($criteria);
}
$arr = array();
$cols = $only_keys === true ? $this->db_key_cols : (!$only_keys ? $this->db_cols : explode(',',str_replace('DISTINCT ','',$only_keys)));
if ($extra_cols)
if ($only_keys == true) // only primary key
{
$cols = $this->db_key_cols;
}
elseif (!$only_keys) // all columns
{
$cols = $this->db_cols;
}
else // only the specified columns
{
foreach(explode(',',str_replace('DISTINCT ','',$only_keys)) as $col)
{
$cols[$col] = $col;
}
}
if ($extra_cols) // extra columns to report
{
foreach(is_array($extra_cols) ? $extra_cols : array($extra_cols) as $col)
{
@ -457,14 +498,15 @@ class so_sql
$cols[$col] = $col;
}
}
for ($n = 0; $this->db->next_record(); ++$n)
$arr = array();
for ($n = 0; ($row = $this->db->row(true)); ++$n)
{
$row = array();
$data = array();
foreach($cols as $db_col => $col)
{
$row[$col] = $this->db->f($db_col);
$data[$col] = $row[$db_col];
}
$arr[] = $this->db2data($row);
$arr[] = $this->db2data($data);
}
return $n ? $arr : False;
}
@ -516,7 +558,7 @@ class so_sql
{
foreach($this->db_key_cols as $db_key_col => $key_col)
{
if ($data[$key_col] != $other[$key_col])
if ($data[$key_col] != $other[$key_col])
{
if ($this->debug)
{