私は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に切り替えることになった、すべてが動作するようになりました。
あなたは '$ con'と' $ pull'の 'var_dump'を投稿できますか?問題は、あなたの 'mysqli'の設定ではなく、そのプロシージャコールの実際の実行であるように見えます。 –
私は 'CALL get_group_count(?)'の代わりに 'select get_group_count(?)'にその呼び出しを変更するべきだと思います。 'Call'はmysqlドライバではなくクライアント固有のものです。 –
@JacobSeeダンプを追加しました。私はそれがいずれかの方法で動作するはずだと思います。 – howtoad