提问者:小点点

使用OOP创建PHP更新查询的方法


我想使用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'");

请看一下我的代码注释,了解一下我的头绪在哪里。

如果有人能用简单的术语解释这一点,我需要做什么来改变它??

这会帮我的忙。

非常感谢


共1个答案

匿名用户

正如在注释中提到的,我建议使用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=?)

注意:最好也为要更新的列添加占位符,但我将此留给您作为练习。