RE: Good SQL builder class

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Multi-dimensional arrays generally indicate some kind of glue/hanging table, so you'll have to special case them for your needs...
But here is a generic insert and update functions that may be a groundwork for you....


/**
* Insert a single row into a $database.$table from an array hash of column => value pairs
*
* Usually these are the form field names corresponding to the equivallent SQL database column/field name.
* Use the string 'null' to insert a true NULL.
*
* @access 	public
* @return 	mixed inserted ID on success or result on failure
* @param 	string $database the database to connect to (agis_core) is the default
* @param 	string $table the name of the table to insert into
* @param 	hash $rows hash of column => value pairs (optionally columns validated against $validate_columns)
* @param 	array $valid_columns array of column/field names. Also useful to limit SQL to certain forced columns to prevent
unwanted tampering with 'default' columns for example.
* @author  Daevid Vincent
* @date    	11/23/09
* @see 		sql_update(), sql_insert_id()
*/
function sql_insert($database, $table, $rows, $valid_columns=null)
{
	ksort($rows); //not required, just easier to debug and find appropriate keys.

	$validate_columns = (is_array($valid_columns)) ? true : false;

	$temp = array();
	$arrays = array();
	foreach ($rows as $column => $val)
	{
		if (is_array($val))
		{
			$arrays[$column] = $val;
			unset($rows[$column]);
			continue;
		}

		if ($validate_columns && !in_array($column, $valid_columns))
		{
			unset($rows[$column]);
			continue;
		}

		$val = trim($val);
		if (!$val)
		{
			unset($rows[$column]);
			continue;
		}

		if (strtolower($val) == 'null')
			$temp[$column] = 'NULL';
		else
			$temp[$column] = "'".mysql_escape_string($val)."'";
	}

	$values = implode(', ',$temp);
	$columns = "`".implode("`, `", array_keys($rows))."`";
	$sql = "INSERT INTO `".$table."` (".$columns.") VALUES (".$values.")";
	//echo $sql;

	if (count($arrays))
		echo "\n<br/>sql_insert() has arrays that need to be handled still: ".implode(', ', array_keys($arrays));

	$result = sql_query($database, $sql, null, false);
    if ($result)
    {
    	$iid = sql_insert_id();
    	if ($iid) return $iid;
    }

    return $result;
}


/**
* Update rows in $database.$table from an array hash of column => value pairs
*
* Usually these are the form field names corresponding to the equivallent SQL database column/field name.
* Use the string 'null' to insert a true NULL.
*
* @access 	public
* @return 	mixed 	affected rows on success or result on failure
* @param 	string 	$database the database to connect to (agis_core) is the default
* @param 	string 	$table the name of the table to insert into
* @param 	hash 	$rows hash of column => value pairs (optionally columns validated against $validate_columns)
* @param 	mixed	hash of ID column/field name and record ID value [such as array('id_foo' => 69)] OR string to craft custom
WHERE clause
* @param 	array 	$valid_columns array of column/field names. Also useful to limit SQL to certain forced columns to prevent
unwanted tampering with 'default' columns for example.
* @author  Daevid Vincent
* @date    	11/23/09
* @see 		sql_insert()
*/
function sql_update($database, $table, $rows, $where, $single=true, $valid_columns=null)
{
	ksort($rows); //not required, just easier to debug and find appropriate keys.

	$validate_columns = (is_array($valid_columns)) ? true : false;

	$temp = array();
	$arrays = array();
	foreach ($rows as $column => $val)
	{
		if (is_array($val))
		{
			$arrays[$column] = $val;
			unset($rows[$column]);
			continue;
		}

		if ($validate_columns && !in_array($column, $valid_columns))
		{
			unset($rows[$column]);
			continue;
		}

		$val = trim($val);
		if (!$val)
		{
			unset($rows[$column]);
			continue;
		}

		if (strtolower($val) == 'null')
			$temp[$column] = '`'.$column."` = NULL";
		else
			$temp[$column] = '`'.$column."` = '".mysql_escape_string($val)."'";
	}

	$sql = "UPDATE `".$table."` SET ".implode(', ', $temp);

	if (is_array($where))
	{
		foreach ($where as $c => $v)
		$w[] = '`'.$c."` = '".mysql_escape_string($v)."'";
		$sql .= " WHERE ".implode(' AND ', $w);
	}
	else $sql .= ' '.$where;

	if ($single) $sql .= ' LIMIT 1';
	//echo $sql;

	if (count($arrays))
		echo "\n<br/>sql_update() has arrays that need to be handled still: ".implode(', ', array_keys($arrays));

	$result = sql_query($database, $sql, null, false);
    if ($result)
    {
    	$ar = sql_affected_rows($database);
    	if ($ar) return $ar;
    }

    return $result;
} 

> -----Original Message-----
> From: Anton Heuschen [mailto:antonfh@xxxxxxxxx] 
> Sent: Friday, December 04, 2009 5:10 AM
> To: PHP General List
> Subject:  Good SQL builder class
> 
> Good day.
> 
> I'm looking for a good class to handle building dynamically from and
> array (and if it is good it will automatically determine / or even
> have different methods) to handle mutli-dimensional arrays or simple
> associative arrays ... and build the SQL statement :
> 
> for example I have an array :
> 
> $home[$suburb]["street"] = test1;
> $home[$suburb]["housenr"] =2;
> 
> 
> Ok to keep it simple to 2, then I want to build the SQL like
> 
> insert into homes (STREET, HOUSENR) VALUES ($val1,$val2);
> 
> 
> something like that, but I could also pass some array like :
> 
> $home["street"] = test2;
> $home["housenr"] = 2;
> 
> 
> but the idea stays the same = the index is the name of the DB fields
> and the assigned value the element
> 
> 
> 
> I have looked on hotscripts and phpclasses but I have no idea how good
> the solutions are that I have found thus far - therefor need some
> recommendation from someone else past experience of this
> 
> -- 
> PHP General Mailing List (http://www.php.net/)
> To unsubscribe, visit: http://www.php.net/unsub.php
> 


-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux