class definative命令不同步解决方案

时间:2016-06-29 19:52:53

标签: php nginx mysqli

经过大约一周的搜索,我似乎没有找到确凿/有效/最新/标准的方式来做这件事。

显而易见的解决方案是运行查询将结果输入变量并为下一个查询做好准备 - 为了提高效率而不关闭连接。

这是在一个包装类中完成的,它有select / update / insert,它反过来调用一个查询或查询(对于mysqli multi_query()),理想情况下,最好在查询/查询中清除任何结果确保它运行而不用担心之前发生的事情。 这似乎不可能,因为某些解决方案需要结果集。

目前是select / update / insert调用:

 private function queryclearup($dataresource) {
        //clear up if required
        switch ($this->dbtype) {
             case "mysqli":
                    @mysqli_next_result($this->connection);
                    @mysqli_free_result($dataresource); //clear result to avoid out of sync issues
                    break;
        }
 }

处理结果集后 - 例如,在select的情况下转换为数据数组,或者只是在更新/插入的情况下记录错误。

仍有一些(更新)问题仍然存在,但其他问题(选择/插入)仍然存在。

 public function select($query, $args = array()) {
        $this->loghelper->write("SQL Select\n" . $query);
        $args = _PHP::array_defaults($args, array(
                                "pk" => null
        ));
        $data_table = array();
        $errors = null;
        $query = utf8_decode($query);
        switch ($this->dbtype) {
             case "mysqli":
                    $dbdata = $this->query($query);
                    $data_table = $this->resourceToDataTable($dbdata, $args);
                    break;
        }
        return $data_table;
 }

然后

private function resourceToDataTable($dataresource, $args = array()) {
            $data_table = array();
            if (gettype($dataresource) == "resource" || gettype($dataresource) == "object") {
                 do {
                        switch ($this->dbtype) {
                             case "mysqli":
                                    $row = $dataresource->fetch_assoc();
                                    break;
                        }
                        if ($row) {
                             array_push($data_table, $row);
                        }
                 } while ($row);
                 if (!empty($args["pk"])) {
                        $pktable = array();
                        foreach ($data_table as $d) {
                             if (!array_key_exists($args["pk"], $pktable)) {
                                    $pktable[$d[$args["pk"]]] = $d;
                             }
                        }
                        $data_table = $pktable;
                 }
            }
            $this->queryclearup($dataresource);
            return $data_table;
     }

1 个答案:

答案 0 :(得分:0)

这似乎是必需的

  private function queryclearup($dataresource) {
    //clear up if required
    switch ($this->db["contype"]) {
      case "mysqli":
        while ($dump = @mysqli_next_result($this->connection)) {
          $donothing = 1;
        }
        @mysqli_free_result($dataresource); //clear result to avoid out of sync issues
        break;
    }
  }