php вставить функцию sql

Я хочу создать одну функцию вставки в php, которую я буду использовать для вставки данных в базу данных.

Конечно, все вставки не одинаковы, некоторые используют одну таблицу, другие используют другую, таблицы имеют разные номера столбцов и т. д. Как лучше всего это сделать?

В настоящее время я нахожусь на веб-странице для регистрации участников, теперь я не хочу разрешать всем регистрироваться, я хочу, чтобы администратор утверждал, какие участники будут одобрены, а какие нет, поэтому я установил одно скрытое поле на 0 и после одобрение становится одним.

СЛУЧАЙ: кто-то заходит на веб-сайт и изменяет значение поля ввода на 1 с помощью firebug и отправляет регистрацию, автоматически получает одобрение, я не пробовал, я просто рассматриваю возможность. Теперь, если я помещу member_active внутрь функции вставки, она не будет работать для других запросов на вставку с несколькими или меньшими строками столбцов базы данных.

Как это сделать, является ли глобальная/общая функция вставки хорошей идеей, я довольно хорошо знаю, как программировать все это, но в последнее время я стал более осторожным с данными/эффективностью и такими вещами, которые могут сделать ваш веб-сайт лучше/хуже, поэтому я хочу хорошего начала. Спасибо


person ant    schedule 17.12.2009    source источник


Ответы (4)


CodeIgniter также делает это, но вот оно:

function Insert($table, $data, $ignore = false)
{
    $sql = array();

    if (is_array($sql) === true)
    {
        $sql['query'] = 'INSERT ';

        if ($ignore === true)
        {
            $sql['query'] .= 'IGNORE ';
        }

        foreach ($data as $key => $value)
        {
            $data[$key] = Tick($key) . ' = ' . Quote($value);
        }

        $sql['query'] .= 'INTO ' . Tick($table) . ' SET ' . implode(', ', $data);
    }

    return implode('', $sql);
}

Очевидно, вам нужно определить свои собственные функции Tick() и Quote(), чтобы возвращать объекты базы данных и escape-значения соответственно.

person Alix Axel    schedule 17.12.2009

Что ж, если вы собираетесь зайти так далеко в абстракции, вам следует также абстрагировать весь процесс написания запроса к классу (см. Zend_Db_Select, Doctrine_Query, критерии Propel и т. д.).

Но больше, чтобы вы указали, как Джимми предлагает, если кто-то новый подписывается, вы знаете, что они всегда будут ожидать одобрения... поэтому даже не используйте значение из формы, добавьте его в массив значений формы после отправки, но перед передачей к вашей функции вставки.

person prodigitalson    schedule 17.12.2009

Вместо того, чтобы абстрагировать свой SQL в коде, лучше использовать встроенные функции базы данных: хранит процедуры (SP) или некоторые базы данных используют только функции БД.

Неразумно абстрагировать работу БД в коде, потому что вы делаете предположение, что структура таблицы никогда не изменится (серьезная ошибка в приложении, которое получает постоянные изменения и улучшения).

Создавая SP, вы делаете вызов SQL, например:

$query = "EmployeeAdd('joe','smith','1970-12-22')";

Теперь ваш код имеет то преимущество, что он абстрагирован (и даже несколько не специфичен для базы данных), плюс вы можете изменить структуру своей таблицы по прихоти, и вам не нужно менять ни одной строки кода. Конечно, имейте в виду, что для того, чтобы следовать этому подходу к проектированию, вам необходимо создать функции EmployeeGet() и EmployeeUpdate(), и вполне нормально иметь несколько их версий, например: EmployeeGetByID() EmployeesGetByJobID()

Обратите особое внимание на синтаксис, так как важно, чтобы вы использовали Data + Action + How, потому что после того, как вы напишете эти функции для всей вашей базы данных, если вы вызовете их GetEmployeeByID(), тогда у вас будут перечислены десятки SP, все Собирается вместе, что приводит к плохой организации.

person TravisO    schedule 17.12.2009
comment
Но не будет ли эта логика содержаться в классе/пакете Model/ActiveRecord/Mapper (в зависимости от того, как вы создали шаблон своего приложения), поэтому вы будете вносить изменения только в этот единственный класс/пакет, который вам все равно придется изменить на самом деле использовать любые данные, хранящиеся в этом столбце в базе данных (аксессоры/мутаторы/и т. д.)? - person prodigitalson; 17.12.2009
comment
@prodigitalson: я не использовал codeigniter, я не осознавал, что он использует какое-либо мышление MVC, моя ошибка. Несмотря на это, я по-прежнему сторонник отделения своего кода от структуры БД, поскольку я работал над многими развивающимися приложениями, где это было ошибкой. - person TravisO; 17.12.2009

Просто не используйте поля формы для их прямой вставки, если вы это делаете (это то, что я получил, когда прочитал вопрос). В CI передайте значение скрытого поля как 0 функции вставки, и эта возможность исчезнет.

person Jimmie Lin    schedule 17.12.2009