【问题标题】:php class to insert array of values to oracle DB将值数组插入到 oracle DB 的 php 类
【发布时间】:2013-12-17 01:49:04
【问题描述】:

我正在尝试构建一个将值数组插入到 oracle 数据库中的类,我也在尝试使该类可扩展(适用于所有形式的应用程序)。

这样做的原因是为了减少正在处理的应用程序的代码重复,因为它有很多表单,其中一些有很多变量 (50+)..因此我需要创建一个能够将值插入到表中的类,其中值的数量是动态的(取决于表单)。

到目前为止,我所做的是:

class ArrayQuery {

    public $conn;
    public $table;


    public function __construct($conn){

        $this->conn = $conn;
    }

    public function setTableName($table)
    {
        $this->table = $table;
    }

    public function InsertArray(array $args){

        $keys = array_keys($args);
        $values = array_values($args);

             // need help here //

    }
}
  • 构造函数将通过调用 db_connection 类中的 $conn 对象来获取数据库连接(例如 $conn = new db_connection(); $query = new ArrayQuery($conn);)

  • setTableName 显然是用来定义想要的表的。

  • 现在是 ArrayQuery,我在表单页面中所做的,我将数组的键命名为与表中列的名称相同,例如数组 args['id']= $_post['id']。所以基本上 array_key = 列名。我这样做是为了在不手动设置列的情况下获取列名。

现在我有 2 个数组:$keys(保存列名)和 $values(保存要插入的数据)。

我不知道如何将变量绑定到键中?知道变量的数量是动态的吗?

任何帮助将不胜感激

更新:

这是 $args 数组的设置方式

$args = array(
          'id' => $_POST['id'],
          'firstname' => $_POST['firstname'],
          'lastname' => $_POST['lastname'],
          'email' => $_POsT['email'],
)

回答:

感谢@calculon 让我走上了正确的道路,在我的场景中几乎没有修改,以供将来参考,我的案例的答案是:

$i=0; $col=''; $val='';
        foreach ($args as $key => $value) {
               if($i==0){
                 $col .= $key;
                 $val .= ':'.$key;
               }
               else{
               $col .= ', '.$key;
               $val .= ', :'.$key;
               }
               $i++;
         }

        $sql = 'INSERT INTO '.$table.' ('.$col.') VALUES ('.$val.') ';
        $stmt = oci_parse($this->conn, $sql);
        foreach ($args as $key => $value) {
              oci_bind_by_name($stmt, $key, $args[$key]) ;
            }
        oci_execute($stmt);

希望对您有所帮助,再次感谢calculon。

【问题讨论】:

    标签: php arrays oracle


    【解决方案1】:

    在我的项目中使用的用于插入具有未知列数的一行的算法,对于多行应该再添加一个循环

    $i=0; $keys=''; $vals='';
    foreach ($args as $key => $value) {
           if($i==0){
             $keys .= ''.$key;
             $vals .= ':'.$key;
           }
           $keys .= ', '.$key;
           $vals .= ', :'.$key;
           $i++;
     }
    $sql = 'INSERT INTO '.$table.' ('.$keys.') VALUES ('.$vals.') ';
    $stmt = oci_parse($conn, $sql);
    foreach ($args as $key => $value) {
          oci_bind_by_name($stmt, $key, $args[$key]) ;
        }
    oci_execute($stmt);
    

    【讨论】:

    • 你好calculon,谢谢你的回答。如果你愿意,你能解释一下吗?我认为这里有一些打字错误,不应该 $val .= ':'.$key;是 $val .= ':'.$val;反而?你用 ($==0) 是什么意思?谢谢。
    • $val .= ':'.$key; 这一行只是变量绑定函数的位置,然后oci_bind_by_name 将放置所需的值。 $==0 应该是 ($i==0)
    • 嗨,它不工作的伙伴,我得到错误: - 非法变量名/编号 - 重复的列名 - oci_num_rows() 期望参数 1 是资源,null gi
    • 既然 $args 数组键等于列名,那么 $key 和 $val 不应该是数组吗?因此我们在循环中说 $key[i] 而不是 $key?
    • 我写了一个算法,只插入一个字符串数组,输入必须有以下结构('column name'=>'current cell value', e.t.c)。你的数组 'args' 的结构是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    相关资源
    最近更新 更多