Динамическое создание sql запроса

sasha_ua

Постоялец
Регистрация
22 Июн 2010
Сообщения
66
Реакции
0
Здравствуйте.
Написал функцию для создания sql-запроса из ассоциативного массива. Вроде работает.
Хотел чтобы более опытные люди ее покритиковали и возможно предложили бы изменения..
PHP:
<?php
function sql_insert($table,$connect,$data)
{
	global $conn,$netcon;
	$in_array = $data;
	$col = "";
	$val = "";
	$counter = 0;
	$dim = count($in_array);
	$query = "INSERT INTO `$table`";
	$col .= "(";
	foreach($in_array as $key=>$value)
	{
		$key = mysql_real_escape_string(cp1251_to_utf8_recursive($key));
		$value = mysql_real_escape_string(cp1251_to_utf8_recursive($value));
		$counter++;
		$col .= $key;
		if($counter<$dim)	// Не ставим запятую после последнего элемента
		{
			$col .= ",";
		}
		$val .= "\"$value\"";
		if($counter<$dim)
		{
			$val .= ",";
		}	
	}
	$col .= ")";
	$query .= $col." value"."(".$val.")";
	$sql = "$query";
	mysql_query($sql,$connect);
	echo $query;
}
$category_name = "Фотоаппараты";
$category_level = 1;
$path = "/foto/";
$category_parent_id = 0;
$list_order	= 1;
$category_publish = "Y";
$data = array("category_name"=>"$category_name", "category_level"=>"$category_level", "path"=>"$path","category_parent_id"=>"$category_parent_id", "list_order"=>"$list_order", "category_publish"=>"$category_publish");
sql_insert("parts_tmp",$conn,$data);
?>
 
sasha_ua попробуй такое вариант .. - работать будет быстрее ... ну ток доработай чуть под себя, к примеру удали генерацию исключений или еще что-то
ну и здесь нет особой зашиты от SQL иньекций т.к. использовался PDO
PHP:
function changeTable($table, array $set, $condition = "")
{        
 global $conn;
    if(empty($table)) {
        throw new Exception("Неверное имя ");
    }
    if(empty($set)){
        throw new Exception("пустые данные");
    }
    array_walk($set, create_function('&$a', 'if(isset($a)): $a = "\'".AddSlashes($a)."\'"; else: $a = "NULL"; endif;'));
    if(!empty($condition))
    {
        array_walk($set, create_function('&$val, $key', '$val = "$key = $val";'));
        $sql = "UPDATE `$table` SET " . implode(", ", $set) . " WHERE $condition";                       
    }
    else
    {
        $sql = "INSERT INTO `$table` (" . implode(", ", array_keys($set)) . ") VALUES (" . implode(", ", $set) . ")";            
    }
    mysql_query($sql, $conn);
}
$array =array (
            'name'=> "myName",
            'sex'=>1,
            'status'=>3,
            'qwe' => null,
            );
changeTable('table1', $array); // INSERT 
changeTable('table2', $array, '`id`=3'); // UPDATE
 
Окончательный вариант функции, кто покритикует?
(Тут академический интерес, так что пишу на чистом PHP)

PHP:
/**
 * Функция формирует INSERT/UPDATE запрос
 * Описание:
 * sql_query ( string table_name, resource connection_name, array key->data [ string condition ] )
 * Примеры:
 * sql_query("table",$conn,$data);				[ INSERT ]
 * sql_query("table",$conn,$data,'`id`=1'); 	[ UPDATE ]
 * table - имя таблицы
 * $conn - идентификатор соединения
 * $data - ассоциативный массив - ключ(поле)/значение
 * '`id`=1' - логическое условие WHERE
 */

function sql_query($table,$connect,$data,$condition="")
{
	global $conn,$netcon;
	
	if(empty($table))
	{
		throw new Exception("Неверное имя таблицы<br />\n");
	}
	if(empty($data))
	{
		throw new Exception("Отсутствуют данные<br />\n");
	}

	array_walk($data, create_function('&$a', 'if(isset($a)): $a = "\'".mysql_real_escape_string($a)."\'"; else: $a = "NULL"; endif;'));

	if(!empty($condition))
    {
        array_walk($data, create_function('&$val, $key', '$val = "`$key` = $val";'));
        $sql = "UPDATE `$table` SET ".implode(", ",$data). " WHERE $condition";     	
    }
    else
    {
        $sql = "INSERT INTO `$table` ("."`".implode("`, `",array_keys($data))."`".") VALUES (".implode(", ",$data).")";
    }
    mysql_query($sql, $conn);
}

			// Заносим в БД
			$data = array("category"=>"$category", "level"=>"$level", "path"=>"$path");
			sql_query("table",$conn,$data);
 
Назад
Сверху