1

私はこのデータベースMySQLiラッパーを使用しています:

Class dbWrapper {
    protected $_mysqli;
    protected $_debug;

    public function __construct($host, $username, $password, $database, $debug) {
        $this->_mysqli = new mysqli($host, $username, $password, $database);
        $this->_mysqli->set_charset("utf8");
        $this->_debug = (bool) $debug;
        if (mysqli_connect_errno()) {
            if ($this->_debug) {
                echo mysqli_connect_error();
                debug_print_backtrace();
            }
            return false;
        }
        return true;
    }

    public function q($query) {
        if ($query = $this->_mysqli->prepare($query)) {
            if (func_num_args() > 1) {
                $x = func_get_args();
                $args = array_merge(array(func_get_arg(1)),
                    array_slice($x, 2));
                $args_ref = array();
                foreach($args as $k => &$arg) {
                    $args_ref[$k] = &$arg; 
                }
                call_user_func_array(array($query, 'bind_param'), $args_ref);
            }
            $query->execute();

            if ($query->errno) {
              if ($this->_debug) {
                echo mysqli_error($this->_mysqli);
                debug_print_backtrace();
              }
              return false;
            }

            if ($query->affected_rows > -1) {
                return $query->affected_rows;
            }
            $params = array();
            $meta = $query->result_metadata();
            while ($field = $meta->fetch_field()) {
                $params[] = &$row[$field->name];
            }
            call_user_func_array(array($query, 'bind_result'), $params);

            $result = array();
            while ($query->fetch()) {
                $r = array();
                foreach ($row as $key => $val) {
                    $r[$key] = $val;
                }
                $result[] = $r;
            }
            $query->close(); 
            return $result;
        } else {
            if ($this->_debug) {
                echo $this->_mysqli->error;
                debug_print_backtrace();
            }
            return false;
        }
    }

    public function handle() {
        return $this->_mysqli;
    }
}

しかし、SELECT This FROM Database などのクエリを作成し、結果を表示したい場合は、$result[0]['This'] をエコーする必要があります。どうして?$result['This'] ではないのはなぜですか? 私はこれを変更しました:

$result = array();
    while ($query->fetch()) {
        $r = array();
        foreach ($row as $key => $val) {
            $r[$key] = $val;
        }
        $result[] = $r;
    }
    $query->close(); 
    return $result;

これに:

$result = array();
            while ($query->fetch()) {
                foreach ($row as $key => $val) {
                    $result[$key] = $val;
                }
                $result[] = $r;
            }
            $query->close(); 
            return $result;

しかし、私が見るすべてのラッパーが多次元配列を返すのはなぜですか?

あなたが私を理解してくれることを望むよ。ありがとうございました!

4

3 に答える 3

1

通常、DB クエリから結果を収集する場合、複数の行があります。

  --------------
  - 1 --- This -
  - 2 --- That -
  --------------

したがって、1 つのオブジェクトですべての行を処理するために、多次元配列を取得します。

……ここはそうじゃない?

編集:

  $result = array();
      while ($query->fetch()) {
          $r = array();
          foreach ($row as $key => $val) {
              $r[$key] = $val;
          }
          $result[] = $r;
      }
      $query->close(); 
      return $result;

上記のコードでは、個々の行を $results 配列のインデックスに割り当てています。それらにアクセスするには、$results[ROW_NUMBER][KEY_NAME] を提供する必要があります。

それは理にかなっていますか?

于 2013-07-22T15:18:19.277 に答える
1

これらが多次元配列を返す理由は、複数の結果が得られる可能性があるためです。

そう:

$data[0]['name'] is the first returned records name.

$data[1]['name'] is the second returned records name.

fetchRow()1行しか期待できない場合に常に最初のレコードを返す関数を作成できます

return $data[0]

また

fetchOne()

return $data[0]['name']

1 つのフィールドのみを期待する場合

于 2013-07-22T15:19:40.640 に答える