[php] 정의되지 않은 메서드 mysqli_stmt :: get_result 호출

내 코드는 다음과 같습니다.

include 'conn.php';
$conn = new Connection();
$query = 'SELECT EmailVerified, Blocked FROM users WHERE Email = ? AND SLA = ? AND `Password` = ?';
$stmt = $conn->mysqli->prepare($query);
$stmt->bind_param('sss', $_POST['EmailID'], $_POST['SLA'], $_POST['Password']);
$stmt->execute();
$result = $stmt->get_result();

마지막 줄에 다음과 같이 오류가 발생 합니다. 정의되지 않은 메서드 mysqli_stmt :: get_result () 호출

conn.php의 코드는 다음과 같습니다.

define('SERVER', 'localhost');
define('USER', 'root');
define('PASS', 'xxxx');
define('DB', 'xxxx');
class Connection{
    /**
     * @var Resource
     */
    var $mysqli = null;

    function __construct(){
        try{
            if(!$this->mysqli){
                $this->mysqli = new MySQLi(SERVER, USER, PASS, DB);
                if(!$this->mysqli)
                    throw new Exception('Could not create connection using MySQLi', 'NO_CONNECTION');
            }
        }
        catch(Exception $ex){
            echo "ERROR: ".$e->getMessage();
        }
    }
}

이 줄을 쓰면 :

if(!stmt) echo 'Statement prepared'; else echo 'Statement NOT prepared';

‘Statement NOT ready’를 인쇄합니다 . IDE에서 직접 쿼리를 실행하면? 값으로 표시하면 제대로 작동합니다. $ conn 개체는 프로젝트의 다른 쿼리에서 잘 작동합니다.

도와주세요 …….



답변

이 방법에 대한 사용자 참고 사항을 읽으십시오.

http://php.net/manual/en/mysqli-stmt.get-result.php

mysqlnd 드라이버가 필요합니다. 웹 공간에 설치되어 있지 않으면 BIND_RESULT & FETCH로 작업해야합니다!

https://secure.php.net/manual/en/mysqli-stmt.bind-result.php

https://secure.php.net/manual/en/mysqli-stmt.fetch.php


답변

MySQL의 기본 드라이버 (mysqlnd) 드라이버를 사용할 수 있으므로 사용하지 않는 경우에 따라서 bind_result을 하고 가져 오는 대신 get_result , 코드가된다 :

include 'conn.php';
$conn = new Connection();
$query = 'SELECT EmailVerified, Blocked FROM users WHERE Email = ? AND SLA = ? AND `Password` = ?';
$stmt = $conn->mysqli->prepare($query);
$stmt->bind_param('sss', $_POST['EmailID'], $_POST['SLA'], $_POST['Password']);
$stmt->execute();
$stmt->bind_result($EmailVerified, $Blocked);
while ($stmt->fetch())
{
   /* Use $EmailVerified and $Blocked */
}
$stmt->close();
$conn->mysqli->close();


답변

시스템에 mysqlnd 드라이버가 없습니다!

(Debian / Ubuntu 기반) 서버에 새 패키지를 설치할 수 있으면 드라이버를 설치합니다.

sudo apt-get install php5-mysqlnd

그런 다음 웹 서버를 다시 시작하십시오.

sudo /etc/init.d/apache2 restart


답변

대안을 찾는 사람들 $result = $stmt->get_result()을 위해 $result->fetch_assoc()stmt 객체를 직접 사용하여 모방 할 수있는이 기능을 만들었습니다 .

function fetchAssocStatement($stmt)
{
    if($stmt->num_rows>0)
    {
        $result = array();
        $md = $stmt->result_metadata();
        $params = array();
        while($field = $md->fetch_field()) {
            $params[] = &$result[$field->name];
        }
        call_user_func_array(array($stmt, 'bind_result'), $params);
        if($stmt->fetch())
            return $result;
    }

    return null;
}

보시다시피 배열을 만들고 행 데이터와 함께 가져옵니다. $stmt->fetch()내부적으로 사용하기 때문에 호출하는 것처럼 호출 할 수 있습니다 mysqli_result::fetch_assoc( $stmt객체가 열려 있고 결과가 저장되어 있는지 확인하십시오 ).

//mysqliConnection is your mysqli connection object
if($stmt = $mysqli_connection->prepare($query))
{
    $stmt->execute();
    $stmt->store_result();

    while($assoc_array = fetchAssocStatement($stmt))
    {
        //do your magic
    }

    $stmt->close();
}


답변

PHP 버전 7.2 에서는 mysqli 대신 nd_mysqli 를 사용 했습니다. 했으며 예상대로 작동했습니다.

GoDaddy 호스팅 서버에서 활성화하는 단계-

  1. cpanel에 로그인합니다.
  2. “PHP 버전 선택”을 클릭하십시오. .
  3. 최신 구성의 스냅 샷이 제공된대로 “mysqli”를 선택 취소 하고 “nd_mysqli”를 활성화 합니다.

여기에 이미지 설명 입력


답변

나는 이것이 실제 문제에 대해 이미 답변을 받았음을 알고 있지만 간단한 해결 방법을 제공하고 싶습니다.

get_results () 메서드를 사용하고 싶었지만 드라이버가 없었고 추가 할 수있는 곳이 아닙니다. 그래서 내가 전화하기 전에

$stmt->bind_results($var1,$var2,$var3,$var4...etc);

빈 배열을 만든 다음 결과를 해당 배열의 키로 바인딩했습니다.

$result = array();
$stmt->bind_results($result['var1'],$result['var2'],$result['var3'],$result['var4']...etc);

따라서 이러한 결과를 쉽게 메서드로 전달하거나 나중에 사용하기 위해 객체로 캐스팅 할 수 있습니다.

이것이 비슷한 일을하려는 사람에게 도움이되기를 바랍니다.


답변

mysqlnd 확장이 이미 활성화 된 PHP 7.0- 내 서버에서 동일한 오류가 발생했습니다 .

해결책은 ( 이 페이지 덕분에 ) mysqli 확장 을 선택 취소하고 대신 nd_mysqli 를 선택하는 것이 습니다.

주의-cPanel에서 확장 선택기에 액세스 할 수 있습니다. ( PHP 버전 선택 옵션을 통해 액세스 합니다.)