【问题标题】:php insert sql functionphp插入sql函数
【发布时间】:2009-12-17 19:50:44
【问题描述】:

我想在php中创建一个插入函数,我将用它来将数据插入数据库。

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

我现在在会员注册的网页上,现在不想让大家注册,我想让管理员批准哪些会员会被批准,哪些不会,所以我设置了一个隐藏字段0 并在批准后变为 1。

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

这样做的方法是什么,全局/通用插入函数是个好主意,我几乎知道如何对所有这些进行编程,但最近我对数据/效率和诸如此类的事情变得更加小心了可以使您的网站更好/更差,所以我想要一个好的开始。谢谢

【问题讨论】:

    标签: php sql codeigniter


    【解决方案1】:

    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】:

      好吧,如果您要在抽象上走得那么远,那么您也应该将编写查询的整个过程抽象到一个类中(参见 Zend_Db_Select、Doctrine_Query、Propel Criteria 等)。

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

      【讨论】:

        【解决方案3】:

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

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

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

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

        现在您的代码具有被抽象化(甚至有些非数据库特定)的优势,而且您可以随心所欲地更改表结构,而不必更改一行代码。当然请记住,要遵循这种设计思路,您需要创建一个 EmployeeGet() 和一个 EmployeeUpdate() 函数,并且有多个版本是正常的,例如:EmployeeGetByID()EmployeeGetByJobID()

        请特别注意语法,因为在为整个数据库编写这些函数后,请务必使用 Data + Action + How,如果您将它们称为 GetEmployeeByID(),那么您将列出数十个 SP , 所有的 Gets 在一起,这导致组织很差。

        【讨论】:

        • 但是该逻辑不会包含在 Model/ActiveRecord/Mapper 类/包中(取决于您如何设计应用程序),因此您只需对单个类/包进行更改 - 您就是无论如何都必须更改以实际使用存储在数据库中此列中的任何数据(访问器/突变器/等)?
        • @prodigitalson:我没有使用过codeigniter,我没有意识到他正在使用任何一种MVC思维方式,我的错误。尽管如此,我仍然喜欢将代码从数据库结构中分离出来,因为我曾在许多不断发展的应用程序中工作,但这是一个错误。
        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2013-05-21
          • 2017-10-24
          • 2023-03-16
          • 2015-12-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-14
          相关资源
          最近更新 更多