代码之家  ›  专栏  ›  技术社区  ›  ant

php插入sql函数

  •  3
  • ant  · 技术社区  · 15 年前

    我想在PHP中创建一个插入函数,用于将数据插入数据库。

    当然,所有的插入都不相同,有些使用一个表,另一些使用其他表,表有不同的列号等。最好的方法是什么?

    我现在正在网页上注册成员,现在我不想让所有人注册,我想让管理员批准哪些成员将获得批准,哪些成员将不获得批准,所以我将一个隐藏字段设置为0,批准后该字段变为1。

    案例: 有人来到网站,用firebug将输入字段值更改为1并提交注册,自动获得批准,我没有尝试这个,我只是在考虑可能性。现在,如果我将member_active放在insert函数中,那么它将不适用于具有很少/更少数据库列行的其他insert查询。

    做这件事的方法是什么,全球/一般插入功能是一个好主意,我几乎知道如何对所有这些进行编程,但是最近我对数据/效率以及能使你的网站变得更好/更糟的事情更加小心,所以我希望有一个好的开始。谢谢你

    4 回复  |  直到 15 年前
        1
  •  3
  •   Alix Axel    15 年前

    CodeIgniter also does this ,但这里是:

    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
  •  2
  •   prodigitalson    15 年前

    好吧,如果你要在抽象中走得那么远,那么你也应该把写一个查询到类的整个过程抽象出来(见zend_db_select,district_query,pulse criteria,等等)。

    但更重要的是,正如吉米建议的,如果有新的人注册,你知道他们总是等待批准…因此,甚至不要使用表单中的valu,在提交后传递到插入功能之前将其添加到表单值数组中。

        3
  •  1
  •   TravisO    15 年前

    与其在代码中抽象SQL,不如使用数据库的内置功能:存储过程(sp)或某些数据库只使用db函数。

    将DB工作抽象到代码中是不合理的,因为您假设表结构永远不会改变(对于一个不断变化和改进的应用程序来说,这是一个重大错误)。

    通过创建SP,您可以进行如下SQL调用:

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

    现在,您的代码有被抽象(甚至有点不特定于数据库)的好处,而且您可以随意更改表结构,而不必更改一行代码。当然,请记住,要遵循这种设计理念,您需要创建EmployeeGet()和EmployeeUpdate()函数,通常会有多个版本,例如:EmployeeGetByID()EmployeesGetByJobID()。

    请特别注意语法,因为在为整个数据库编写这些函数之后,按data+action+how进行操作是很重要的,如果要调用它们getEmployeeByID(),那么将列出几十个SP,所有这些SP组合在一起,这会导致组织不好。

        4
  •  0
  •   Jimmie Lin    15 年前

    如果要直接插入表单域,请不要使用表单域(这是我阅读问题时得到的结果)。在CI中,将隐藏字段值作为0传递给insert函数,这种可能性就消失了。