我想在php中创建一个插入函数,我将用它将数据插入数据库。
当然所有插入都不一样,有些使用其他表使用的表,表有不同的列号等。最好的方法是什么?
我目前正在网页上进行会员注册,现在我不想让每个人都注册,我希望管理员批准哪些会员将获得批准,哪些会不会,所以我设置了一个隐藏字段0,批准后成为一个。
CASE:有人来到网站并使用firebug将输入字段值更改为1并提交注册,自动获得批准,我没有尝试这个我只是考虑可能性。现在,如果我将member_active放在insert函数中,那么它将不适用于具有少量/少数据库列行的其他插入查询。
这样做的方法是,全局/通用插入函数是一个好主意,我几乎知道如何编程所有这些,但最近我对数据/效率和这样的事情变得更加谨慎可以让你的网站更好/更糟,所以我想要一个良好的开端。谢谢
答案 0 :(得分: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()
函数,以分别回溯数据库实体和转义值。
答案 1 :(得分:2)
如果你要在抽象方面走得那么远,那么你也应该抽象地将查询写入类的整个过程(参见Zend_Db_Select,Doctrine_Query,Propel Criteria等)。
但更多的是你指出,正如Jimmie所说,如果有人注册,你知道他们总是会等待批准...所以甚至不使用表单中的值,在提交后将其添加到表单值数组中但在传递给你的插入功能之前。
答案 2 :(得分:1)
不要在代码中抽象SQL,最好使用数据库的内置功能:存储过程(SP)或某些数据库仅使用数据库函数。
将DB工作抽象到代码中是不合理的,因为您假设表结构永远不会改变(应用程序上的一个重大错误,它会得到不断变化和改进)。
通过创建SP,您可以进行如下的SQL调用:
$query = "EmployeeAdd('joe','smith','1970-12-22')";
现在您的代码具有抽象的优势(甚至有些非特定于数据库),您可以随心所欲地更改表结构,而不必更改单行代码。当然要记住要遵循这种设计思维方式,你需要创建一个EmployeeGet()和一个EmployeeUpdate()函数,这些函数的多个版本是正常的,例如:EmployeeGetByID()EmployeesGetByJobID()
特别注意语法,因为重要的是你要通过数据+动作+如何在为整个数据库编写这些函数之后,如果你要将它们称为GetEmployeeByID(),那么你将会列出数十个SP ,所有的聚会,这使得组织不善。
答案 3 :(得分:0)
如果您正在这样做,请不要使用表单字段直接插入它们(这是我在阅读问题时得到的)。在CI中,将隐藏字段值作为0传递给插入函数,这种可能性消失了。