我想使用PHP OOP创建一个简单的CRUD而不需要任何框架
下面是我编写的执行简单SQL更新查询的代码
function Update_data($table_name,$new_columns_values,$where,$new_value){
try{
$columns ='';
$columns_updatadata='';
foreach($new_columns_values as $key => $values){
$columns_updatadata .= $key . "=" ."'" .$values."'". ",";
}
$columns_updatadata =rtrim($columns_updatadata, ",");
$Statement = $this->pdo->prepare("UPDATE $table_name SET $columns_updatadata WHERE $where = '$new_value'");
return $Statement->execute();
}
catch(Exception $e) {
echo 'Exception -> ';
var_dump($e->getMessage());
}
}
呼叫更新功能
Update_data("Member_Table", array("Name"=>"Peter", "Gender"=>"M"),"id","33");
//equal to
$this->pdo->prepare("UPDATE Member_Table SET Name = 'Peter',Gender = 'M' WHERE id = '33'");
但是你知道如何在oop更新查询中处理和
吗?
如
$this->pdo->prepare("UPDATE Member_Table SET Name = 'Peter',Gender = 'M' WHERE id = '33' AND Something ='22'");
还是多个添加和
?
..... WHERE id = '33' AND Something2 ='22' AND Something3 ='33'.....AND Something9999='value'");
请看一下我的代码注释,了解一下我的头绪在哪里。
如果有人能用简单的术语解释这一点,我需要做什么来改变它??
这会帮我的忙。
非常感谢
正如在注释中提到的,我建议使用composer使用Docition包,而不是尝试为QueryBuilder重新设计轮子。然而,这是一个有趣的查询构建器问题,所以我正在进行我的尝试。
$Where
需要是多个AND条件的数组数组,由OR分隔。每个单独的子数组都需要有列名作为键和值作为要更新的实际值。
如果提供给您的$where
恰好是空数组,您可以/需要引发异常,因为您不应该允许没有wheres的更新。
因此,您的函数定义将更改为:
function Update_data($table_name,$new_columns_values,$where = array());
下面是我们构建where条件和put占位符?
的片段,其中需要插入值,并在execute()
期间提供这些值。
<?php
function Update_data($table_name,$new_columns_values,$where = array()){
try{
if(count($where) == 0){
throw new \Exception('Missing where condition for UPDATE statement.');// to make it more secure
}
$columns = '';
$columns_updatadata = '';
foreach($new_columns_values as $key => $values){
$columns_updatadata .= $key . "=" ."'" .$values."'". ",";
}
$columns_updatadata = rtrim($columns_updatadata, ",");
/* build the where condition. */
$where_sql = [];
$placeholder_values = [];
foreach($where as $conditions){
$conds = [];
foreach($conditions as $column => $column_value){
$conds[] = "$column = ?";
$placeholder_values[] = $column_value;
}
$where_sql[] = implode(" and ",$conds);
}
$where_sql = "(" . implode(" ) OR ( ",$where_sql) . ")";
/* building the where condition ends. */
$Statement = $this->pdo->prepare("UPDATE $table_name SET $columns_updatadata WHERE $where_sql");
return $Statement->execute($placeholder_values);
}catch(\Exception $e) {
echo 'Exception -> ';
var_dump($e->getMessage());
}
}
您可以稍后调用该方法,如下所示:
Update_data("Member_Table", array("Name"=>"Peter", "Gender"=>"M"),[['id' => '33'],['name' => 'David','username' => 'nice_dev']]);
上面数组中表示的where
条件如下:
[
[
'id' => '33'
],
[
'name' => 'David',
'username' => 'nice_dev'
]
]
它将原始SQL形成为(id=?)或(name=?和username=?)
注意:最好也为要更新的列添加占位符,但我将此留给您作为练习。