2016-12-22 2 views
3

最近MySQLiプリペアドステートメントを使用し始めました。私は単純なselect文のために必要だったコードの行の数が好きではありませんでした。そこで私はラッパー関数を作成しました。以下の質問の下のコードを見てください。 注:get_results()またはPDOは私のオプションではありません。MySQLi Prepared statements - SELECTのラッパー関数

私の質問は以下のとおりです。

  1. それは著しくパフォーマンスが低下するのでしょうか?

  2. 結果配列を使用するため、メモリがより多く消費されますか?

  3. 戻り前に$ stmt-> close()を実行すると問題が発生しますか?たとえば、結果の配列データもメモリから解放されているとしますか?
  4. DB接続を閉じる以外は何かを閉じるか解放する必要がありますか?
  5. この機能に関するその他の問題はありますか、それとも改善する可能性がありますか?

コード:例えばこのように使用

class DatabaseHelper{ 

static function select($con, $query, $formats, $params){ 
    $a_params = array(); 

    $param_type = ''; 
    $n = count($formats); 
    for($i = 0; $i < $n; $i++) { 
     $param_type .= $formats[$i]; 
    } 

    $a_params[] = & $param_type; 

    for($i = 0; $i < $n; $i++) { 
     $a_params[] = & $params[$i]; 
    } 

    $stmt = $con->prepare($query); 
    call_user_func_array(array($stmt, 'bind_param'), $a_params); 
    $stmt->execute(); 

    $meta = $stmt->result_metadata(); 
    while ($field = $meta->fetch_field()) { 
     $columns[] = &$row[$field->name]; 
    } 

    call_user_func_array(array($stmt, 'bind_result'), $columns); 

    while ($stmt->fetch()) { 
     foreach($row as $key => $val) { 
      $x[$key] = $val; 
     } 
     $results[] = $x; 
    } 
    $stmt->close(); 
    return $results; 
} 

} 

$users = DatabaseHelper::select($conn, "SELECT name,username FROM users WHERE id > ?", "i", array(30)); 
foreach ($users as $row){ 
    echo $row['username'] . " ". $row['name'] . "<br />"; 
} 
+0

あなたのPHPのバージョンは何ですか? –

+0

PHPバージョン5.6.27 – Danie

答えて

0

それは著しくパフォーマンスが低下するのでしょうか?

それがあるため、結果のアレイの使用のより多くのメモリ集約型のでしょうか?

いいえ、相当量のデータを選択している限り、いいえ。最新のアプリケーションでは、ビジネスロジックを表示ロジックから分離する必要があるため、すべてのデータを最初に選択する必要があります。

戻り前に$ stmt-> close()を実行すると問題が発生しますか?たとえば、結果の配列データもメモリから解放されているとしますか?

なぜ試してみることはありませんか?

(db接続を終了しない限り)何かを閉じるか解放する必要がありますか?

あなたはむしろステートメントを閉じる必要はありません。

他の機能に問題があるか、改善することはできますか?

  • まず第一に、あなたが書いているクラスであり、関数ではないので、パラメータを介して接続を渡すことは絶対にありません。静的なプロパティにします。
  • また、タイプをデフォルト値で最後のパラメータにすることをお勧めします。ほとんどの場合、タイプをニックピックスする必要はありません。デフォルトの文字列で行います。
  • さらに、PHPのバージョンが5.6であるため、コードの量を減らすためにsplat演算子を使用することができます。あなたは詳細についてはthis answer of mineをチェックすることができます
  • 私はあなたの機能をいくつかの方法に分割することをお勧めします.1つはクエリを実行する方法、もう1つは結果を得る方法です。それはあなたが再使用するクエリ
  • のすべての種類の同じコードは、あなたがそうwatching for mysqli errors as explained here

であることを確認するために、理想的にはあなたがこのよう

$users = DatabaseHelper::getAll("SELECT name,username FROM users WHERE id > ?", [30]); 
foreach ($users as $row){ 
    echo $row['username'] . " ". $row['name'] . "<br />"; 
} 

のgetAllクエリを呼びたいようになります()メソッドは内部的にquery()メソッドを使用してクエリを実行し、次にすべての結果をフェッチします。同様に、getRow()メソッドとgetOne()メソッドを記述することができます

+0

ありがとうございました! :) – Danie

関連する問題