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

Тема в разделе "PHP", создана пользователем sasha_ua, 31 янв 2011.

Модераторы: latteo
  1. sasha_ua

    sasha_ua Постоялец

    Регистр.:
    23 июн 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);
    ?>
     
  2. chang

    chang

    Регистр.:
    20 ноя 2009
    Сообщения:
    364
    Симпатии:
    117
    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($setcreate_function('&$a''if(isset($a)): $a = "\'".AddSlashes($a)."\'"; else: $a = "NULL"; endif;'));
        if(!empty(
    $condition))
        {
            
    array_walk($setcreate_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
     
    sasha_ua нравится это.
  3. sasha_ua

    sasha_ua Постоялец

    Регистр.:
    23 июн 2010
    Сообщения:
    66
    Симпатии:
    0
    Окончательный вариант функции, кто покритикует?
    (Тут академический интерес, так что пишу на чистом 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($datacreate_function('&$a''if(isset($a)): $a = "\'".mysql_real_escape_string($a)."\'"; else: $a = "NULL"; endif;'));

        if(!empty(
    $condition))
        {
            
    array_walk($datacreate_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);