16

CodeIgniter に次のクエリがあります。

$query = $this->db->query("
      SELECT u.id
           , u.first_name, u.last_name
           , u.email_address
           , g.id AS group_id
           , g.name AS group_name
           , g.human_readable_name AS human_readable_group_name
        FROM users AS u
        JOIN groups AS g
          ON u.group_id = g.id
    ORDER BY u.last_name
");

return $query->result();

行するとvar_dump、次のようになります。

object(stdClass)#22 (4) {
  ["id"]=>
  string(2) "19"
  ["first_name"]=>
  string(9) "rightfold"
  // etc
}

idgroup_idはどちらもintegerPostgreSQL では s ですが$query->result()、文字列として返します。textCodeIgniter に正しいデータ型 (文字列としてintegerの s、整数としてtimestampの s、DateTimeオブジェクトとしての s など)を使用してフィールドを返すように指示するにはどうすればよいですか?

PHP 5.3.15 で CodeIgniter 2.1.4 を使用しています。

4

10 に答える 10

5

システム ドライバーを変更したくない場合は、application/Core/MY_Controller.php を変更できます。

KalaivananとFirzeの回答を混在させますが、PDO ではなく mysqli を使用します。

注: 10 進数は、pdo および mysqli でも引き続き文字列に変換されるため、代わりに Double を使用してください。

次のように application/Core/MY_Controller.php を作成/変更します。

class MY_Controller extends CI_Controller
{ 
    public function __construct()
    {
        parent::__construct();        
        $this->db->conn_id->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, true);
    }
}

警告: BIT 列を使用すると、それらは機能せず、常にゼロが返されます。ドライバーのバグのため。参照: MYSQLI_OPT_INT_AND_FLOAT_NATIVE を指定した mysqlnd がビット列の解釈に失敗する。

于 2020-01-02T14:08:46.743 に答える
2

これは私にとってはうまくいきました。任意のキャストが必要な場合は、配列の変数を変換してデータセットを反復処理する必要があります。この関数をコントローラーに追加します。

<?php 
/**
 * Runs a query and returns an array of array, with correct types (as Code
 * Igniter returns everything as string) 
 * @param string $sql
 * @return array Array of array, 1st index is the row number, 2nd is column name
 */
public function queryWithProperTypes($sql) {

  $query = $this->db->query($sql);
  $fields = $query->field_data();
  $result = $query->result_array();

  foreach ($result as $r => $row) {
    $c = 0;
    foreach ($row as $header => $value) {

      // fix variables types according to what is expected from
      // the database, as CodeIgniter get all as string.

      // $c = column index (starting from 0)
      // $r = row index (starting from 0)
      // $header = column name
      // $result[$r][$header] = that's the value to fix. Must
      //                        reference like this because settype
      //                        uses a pointer as param

      $field = $fields[$c];

      switch ($field->type) {

        case MYSQLI_TYPE_LONGLONG: // 8 = bigint
        case MYSQLI_TYPE_LONG: // 3 = int
        case MYSQLI_TYPE_TINY: // 1 = tinyint
        case MYSQLI_TYPE_SHORT: // 2 = smallint
        case MYSQLI_TYPE_INT24: // 9 = mediumint
        case MYSQLI_TYPE_YEAR: // 13 = year
          settype($result[$r][$header], 'integer');
          break;

        case MYSQLI_TYPE_DECIMAL: // 0 = decimal
        case MYSQLI_TYPE_NEWDECIMAL: // 246 = decimal
        case MYSQLI_TYPE_FLOAT: // 4 = float
        case MYSQLI_TYPE_DOUBLE: // 5 = double
          settype($result[$r][$header], 'float');
          break;

        case MYSQLI_TYPE_BIT: // 16 = bit
          settype($result[$r][$header], 'boolean');
          break;

      }

      $c = $c + 1;
    }
  }

  return $result;
}

次のように使用します。

$sql = "SELECT * FROM whatever_table";
$result = $this->queryWithProperTypes($sql);
var_dump($result); // check that all types are correctly cast

パラメータをサポートするように微調整したい場合もありますが、基本的$query->field_data()には、データセット フィールドのメタデータを提供するという考え方です。これにより、 settype関数$query->result_array()を使用して返される値を「修正」できます。

データセットのサイズによってはかなりのオーバーヘッドになる可能性があることに注意してください。戻り値が任意の場合にのみ実行する必要があります。事前にタイプがわかっている場合は、それに応じてキャストすることをお勧めします。

PDO を試してみましたが、すべての値が文字列として返されます。

以下も参照してください。

于 2017-02-24T17:30:10.167 に答える
1

PDO は正しいデータ型の値を返します。CodeIgniter のデータベース ライブラリの代わりに使用します。

于 2014-07-17T07:24:40.753 に答える
0
This is return sql object 

$query = $this->db->query("
      SELECT u.id
           , u.first_name, u.last_name
           , u.email_address
           , g.id AS group_id
           , g.name AS group_name
           , g.human_readable_name AS human_readable_group_name
        FROM users AS u
        JOIN groups AS g
          ON u.group_id = g.id
    ORDER BY u.last_name
");
return $query->result();

This query return multidimensional array as result
$query = $this->db->query("
      SELECT u.id
           , u.first_name, u.last_name
           , u.email_address
           , g.id AS group_id
           , g.name AS group_name
           , g.human_readable_name AS human_readable_group_name
        FROM users AS u
        JOIN groups AS g
          ON u.group_id = g.id
    ORDER BY u.last_name
");
return $query->result_array();

This query return single row as result
$query = $this->db->query("
      SELECT u.id
           , u.first_name, u.last_name
           , u.email_address
           , g.id AS group_id
           , g.name AS group_name
           , g.human_readable_name AS human_readable_group_name
        FROM users AS u
        JOIN groups AS g
          ON u.group_id = g.id
    ORDER BY u.last_name
");
return $query->row_array();
于 2014-07-29T13:31:25.587 に答える
0

いいえ、データ型では取得できません。

これは codeignter とは関係ありません。

MySQL は、NULL を除くすべてを文字列として返します。

1 : PHP mysql_fetch_object、すべてのプロパティは文字列ですか?

2 : MySQL クエリ結果をネイティブ データ型として取得しますか?

于 2013-08-06T09:42:11.700 に答える
0

私が CodeIgnitor のドキュメント ( http://ellislab.com/codeigniter/user-guide/database/fields.htmlを参照) を読んだところ、フィールド データをループしてから、何をすべきかを自分で決定したいということです。データで行います。

私の推測では、これをシームレスに行うには、データベースやクエリ クラスをサブクラス化して、必要なことを実行できるようにする必要があるでしょう。

始めるのにそれほど悪くはないかもしれませんが、これは小さな仕事だとは思いません。

于 2013-11-04T04:11:38.197 に答える
-2

このクエリをオブジェクトとして取得したい場合は、

$query->row();
return $query;

ビューファイルで

foreach($row as $query)
print $row->object_name;

PS: PHP は常に「文字列」として出力します。任意のデータ型にキャストしたい場合、たとえば string から integer にキャストするには、 (int) $value を使用します

于 2013-08-05T22:14:37.250 に答える
-3

これを試してください、私にとって役に立ちます。

$query = $this->db->query("
  SELECT u.id
       , u.first_name, u.last_name
       , u.email_address
       , g.id AS group_id
       , g.name AS group_name
       , g.human_readable_name AS human_readable_group_name
    FROM users AS u
    JOIN groups AS g
      ON u.group_id = g.id
ORDER BY u.last_name ");

 // use return $query->result_array();
 // use like this

  $data = $query->result_array();
  foreach ($data as $key => $value) {
      $data['group_id'] = intval($value['group_id']);
      $data['dateField'] = date_create($value['dateField']);
    }

   var_dump($data);
   //or return $data
于 2015-06-04T07:04:29.607 に答える