내 코드는 다음과 같습니다.
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 호스팅 서버에서 활성화하는 단계-
- cpanel에 로그인합니다.
- “PHP 버전 선택”을 클릭하십시오. .
- 최신 구성의 스냅 샷이 제공된대로 “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 버전 선택 옵션을 통해 액세스 합니다.)