PHP вставка SQL функция - PullRequest
       5

PHP вставка SQL функция

3 голосов
/ 17 декабря 2009

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

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

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

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

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

Ответы [ 4 ]

3 голосов
/ 17 декабря 2009

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() для поддержки тиковых сущностей базы данных и экранирующих значений соответственно.

2 голосов
/ 17 декабря 2009

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

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

1 голос
/ 17 декабря 2009

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

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

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

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

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

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

0 голосов
/ 17 декабря 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...