2009-12-17 66 views
3

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

当然,所有的插入是不一样的,有些使用一个表别人使用其他,表有不同的列数等等。什么是最好的办法做到这一点?

我目前在会员注册的网页上,现在我不想让所有人都注册,我想让管理员批准哪些会员会获得批准,哪些会不会,所以我设置了一个隐藏字段为0,并在批准后成为一个。

CASE:有人来到网站,并改变输入字段值1萤火并提交注册,自动获得批准,我没有尝试这个,我只是考虑的可能性。现在,如果我将member_active放入插入函数中,那么对于其他数据库列行数少的插入查询,它将不起作用。

这样做的方法是什么,全局/通用插入功能是一个好主意,我非常了解如何对所有这些进行编程,但最近我对数据/效率以及此类事情变得更加小心这可以让你的网站变得更好/更糟糕,所以我想要一个好的开始。谢谢

回答

3

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()功能反勾数据库实体分别逃离值。

+0

谢谢小伙子。 Spot on answer – ant 2009-12-17 21:04:09

0

只要不使用表单域直接插入它们,如果你这样做的话(这就是我读到这个问题时得到的结果)。在CI中,将隐藏的字段值作为0传递给插入函数,并且该可能性消失。

2

那么,如果你打算在抽象中走得那么远,那么你也应该抽象写一个查询到一个类的整个过程(参见Zend_Db_Select,Doctrine_Query,Propel Criteria等)。

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

1

取代在代码中抽象SQL,最好使用数据库的构建功能:存储过程(SP)或某些数据库仅使用DB功能。

把数据库工作抽象到代码中是不对的,因为你假设表结构永远不会改变(应用程序的一个主要错误是不断变化和改进)。

通过创建的SP您拨打一个SQL调用,比如:

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

现在你的代码已经被抽象出来(甚至特定有些非数据库),再加上你可以改变一时兴起,而不是你的表结构的好处必须更改一行代码。当然要记住要遵循这种设计思维,您需要创建一个EmployeeGet()和一个EmployeeUpdate()函数,并且这些函数有多个版本是正常的,例如:EmployeeGetByID()EmployeesGetByJobID()

语法,因为它很重要,你去Data + Action +如果你为你的整个数据库编写这些函数,如果你打电话给他们GetEmployeeByID(),那么你将有几十个SP列出来,所有的GET都在一起,这使得组织很差。

+0

但是这种逻辑不包含在Model/ActiveRecord/Mapper类/包中(取决于你是如何构图你的应用程序的),所以你只会对这个单一的类/包进行更改 - 你将不得不无论如何改变,以实际上使用任何数据存储在db(accessors/mutators/etc)这个列中? – prodigitalson 2009-12-17 20:33:26

+0

@prodigitalson:我没有使用codeigniter,我没有意识到他正在使用任何类型的MVC思维模式,我的错误。尽管如此,我还是将代码从数据库结构中分离出来的粉丝,因为我曾在许多不断发展的应用程序中工作,但这是一个错误。 – TravisO 2009-12-17 20:56:04