当前位置: 首页 > 知识库问答 >
问题:

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

吴高峰
2023-03-14

我想使用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个答案

丁学
2023-03-14

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

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

 类似资料:
  • 问题内容: 谁能帮助我了解为什么此更新查询未更新数据库中的字段?我在我的php页面中有这个来从数据库中检索当前值: 这是我的HTML表单: 这是我的“ editblogscript”: 我不明白为什么它不起作用。 问题答案: 您必须在查询中的所有VARCHAR内容周围加上单引号。因此,您的更新查询应为: 同样,用POST中的内容直接更新数据库是一种不好的形式。您应该使用mysql_real_esc

  • 基础Spring Data repository内置的查询生成器机制对于创建实体仓库的约束查询是有用的,它会从方法名中去掉find…By,read…By,query…By,count…By和get…By这些前缀并解析剩下的内容.这些前缀还能包含更多的表达式例如Distinct,设置一个distinct标志并在查询中创建它,然后第一个By的动作就像一个分隔符来表明查询实际标准的开始。最基本的方式你可

  • 问题内容: 我有一个html表,可将mySQL数据库表中的所有内容加载。我有与该mySQL表的列相关的下拉菜单-当用户选择下拉菜单之一时,它将使用AJAX查询数据库。 我需要弄清楚如何动态构建查询,因为有时下拉列表将为空(即,它们不想按该列进行过滤)。 做这个的最好方式是什么? 目前我有这样的事情: 您可以想象这是行不通的,因为如果这些字段中的任何一个为空,查询都会失败(或者不返回任何内容)。 显

  • 问题内容: 我正在尝试根据用户输入创建动态搜索查询。 用户可以不填写任何,部分或全部字段。 该查询在表中搜索符合所有要求的记录。 现在,我已经完成了研究,并且发现了执行此操作的多种方法。但是它们都不起作用,如果起作用了,那么它们就不可行了。 试图: 目前,我正在创建这样的查询: 该查询有效,但前提是您填写了所有字段。 我是从stackoverflow文章中得到的,我再也找不到了,它说: 如果用户已

  • 问题内容: 我必须更新一个值,该值由3个表的联接返回。 例子: 我想用其他在上述条件下加入的值来更新表的字段值。 如何在MS SQL Server中执行此操作? 问题答案: 为了清楚起见…该子句可以引用该子句中指定的表别名。所以在这种情况下是有效的 通用示例

  • 问题内容: 我正在使用 Elasticsearch 2.3 和 官方php驱动程序 。该 updateByQuery 是给我的烦恼在PHP中使用。对于如何使用它的一些帮助将不胜感激。 基本上我想更新几个与某个查询匹配的 文档 字段(名称,价格) 谢谢。 问题答案: 因此,借助CURL api的工作原理,我设法提出了一种方法。 首先,您需要编辑您的脚本以允许脚本。最后添加以下几行。 之后,您可以开始