2016-04-23 8 views
0

私はPHPクラスを呼び出して、特定のユーザーIDのグループ数を数える関数get_group_countを実行しようとしています。 mysqliクエリはMySQL Workbenchで動作するストアドプロシージャを使用しますが、PHPのmysqliでは動作しません。MySQLクエリは、ワークベンチを介して動作しますが、mysqliは使用しません。

公開機能:

public function get_group_count($userID) { 
    if($this->status()) { 
     $db = Database::getInstance(); 
     $con = $db->getConnection(); 

     $pull = $con->prepare("CALL get_group_count(?)"); 
     $pull->bind_param('i', $userID); // line 19 

     if(!$pull->execute()) { 
      $pull->close(); 
      return false; 
     }; 

     $pull->store_result(); 
     $pull->bind_result($count); 
     $pull->fetch(); 
     $pull->close(); 

     return $count; 
    }; 
    return false; 
} 

エラー:

Call to a member function bind_param() on a non-object in ... on line 19 

ストアドプロシージャ:

DELIMITER // 
CREATE PROCEDURE get_group_count(IN userID int) 
BEGIN 
    SELECT (SELECT count(*) FROM groups WHERE adminID = userID) + (SELECT count(*) FROM members WHERE userID = userID) AS count; 
END // 
DELIMITER ; 

のMySQL Workbenchを経由プロシージャを呼び出すとき、それはgroupsからの行の合計数を返します。テーブルとmembersテーブル。

注:ストアドプロシージャではなくmysqliを使用してクエリを実行しようとすると、同じエラーが発生します。

どうすればこの問題を解決できますか?

EDIT:

$conのvar_dump:

object(mysqli)#4 (19) { 
    ["affected_rows"]=> 
    int(1) 
    ["client_info"]=> 
    string(6) "5.5.45" 
    ["client_version"]=> 
    int(50545) 
    ["connect_errno"]=> 
    int(0) 
    ["connect_error"]=> 
    NULL 
    ["errno"]=> 
    int(2014) 
    ["error"]=> 
    string(52) "Commands out of sync; you can't run this command now" 
    ["error_list"]=> 
    array(1) { 
    [0]=> 
    array(3) { 
     ["errno"]=> 
     int(2014) 
     ["sqlstate"]=> 
     string(5) "HY000" 
     ["error"]=> 
     string(52) "Commands out of sync; you can't run this command now" 
    } 
    } 
    ["field_count"]=> 
    int(1) 
    ["host_info"]=> 
    string(25) "Localhost via UNIX socket" 
    ["info"]=> 
    NULL 
    ["insert_id"]=> 
    int(0) 
    ["server_info"]=> 
    string(14) "5.5.45-cll-lve" 
    ["server_version"]=> 
    int(50545) 
    ["stat"]=> 
    string(52) "Commands out of sync; you can't run this command now" 
    ["sqlstate"]=> 
    string(5) "HY000" 
    ["protocol_version"]=> 
    int(10) 
    ["thread_id"]=> 
    int(36623197) 
    ["warning_count"]=> 
    int(0) 
} 

$pullのvar_dump:

bool(false) 
NULL 

EDIT2:PDOに切り替えることになった、すべてが動作するようになりました。

+0

あなたは '$ con'と' $ pull'の 'var_dump'を投稿できますか?問題は、あなたの 'mysqli'の設定ではなく、そのプロシージャコールの実際の実行であるように見えます。 –

+0

私は 'CALL get_group_count(?)'の代わりに 'select get_group_count(?)'にその呼び出しを変更するべきだと思います。 'Call'はmysqlドライバではなくクライアント固有のものです。 –

+0

@JacobSeeダンプを追加しました。私はそれがいずれかの方法で動作するはずだと思います。 – howtoad

答えて

1

ダンプを確認した後、この接続で実行している最後のクエリではその結果が使用されていないように見えます。$conmysqliはデフォルトでバッファリングされていないクエリを使用するため、バッファに手動で実行された前のクエリの結果を手動でフェッチするか、新しいクエリのために空きメモリを解放するかのいずれかをそれぞれstore_result()またはfree_result()にする必要があります。

+0

えええええええええええええええええええええええええええええええええええええええと、ほとんどの場合、ほとんどの場合、 'store_result()'と 'close()'があります。 – howtoad

+0

'get_group_count'の前に使われたすべてのクエリは、同じ構造体' $ pull-> store_result(); $ pull-> bind_result(...); $ pull-> fetch(); $ pull-> close(); '。だから私はそれらが間違った順序であるか、それ以外の何かが間違っているかどうかはわかりません。 – howtoad

関連する問題