0

アプリケーションを書き直して、MYSQLI または PDO クエリを使用できるようにしています。これは、'mysqli' または 'pdo' のいずれかをフラグとして保持する $connection_type 変数によって制御できます。

既存のコードには、特定のクエリの行数を必要とするクエリが多数あります。クエリによって返される実際の行数を取得することは、Stackoverflow の他の場所でさまざまな方法で質問され、回答されていますが、MYSQLI または PDO のいずれかで機能する鉄壁の方法にヒットしたと思います。結果オブジェクトは、これらの形式のいずれかのバリエーションを持つクエリからのものです (3 番目の例に注意してください。クエリで COUNT() が使用されているかどうかに関係なく機能するように関数を考案しました)。

select count(*) from table
select count(distinct column) from table
select column1, column2, column3 from table

MYSQLI の場合、私の解決策は fetch_field_direct() に依存しています。これは明らかに確立された信頼性の高いものです。ただし、PDO の場合、私の解決策は対応する関数 getColumnMeta() に依存しており、PHP.NET ドキュメントで次のようにフラグが付けられています。

警告 この機能は実験的です。この関数の動作、その名前、および関連するドキュメントは、PHP の将来のリリースで予告なしに変更される可能性があります。この機能は、自己責任で使用してください。

だから、私は2つの質問があります:

1) この方法で私が見落としていたものを誰かが見ることができますか?

2) getColumnMeta() が (a) 今後の PHP 7 に存在するかどうか、(b) ファイナライズされているかどうか、それが何を返すか、どの演算子によって返されるかを知っている人はいますか? 関数の名前が同じになり、以下のように「名前」列を返す場合、私のコード (PHP 5.6.12 で正常に動作している) は、PHP 7 でも動作するはずです。リリースされました。

したがって、これが私の関数の現在の状態です。これは、MYSQLI と PDO の両方について、上記のクエリの種類で正常に動作しています (しかし、何か見落としていませんか?):

function returnRowcount($result_object, $connection_type){
    if ($connection_type == 'mysqli') {
        $name_field = strtoupper($result_object->fetch_field_direct(0)->name);
        if (substr($name_field, 0, 6) == "COUNT(") {
            $row = $result_object->fetch_row();
            return $row[0];
        } else {
            return mysqli_num_rows($result_object);
        }       
    } elseif ($connection_type == 'pdo') {
        // WARNING: THE PHP DOCUMENTATION STATES THAT getColumnMeta MAY CHANGE IN FUTURE:
        $name_field = strtoupper($result_object->getColumnMeta(0)["name"]);
        if (substr($name_field, 0, 6) == "COUNT(") {
            return $result_object->fetchColumn();
        } else {
            return $result_object->rowcount();
        }
    }
}
4

1 に答える 1