객체가 아닌 객체에서 prepare () 함수를 호출하십시오 PHP Help
PHP객체가 아닌 객체에서 prepare () 함수를 호출하십시오 PHP Help
PHP 함수를 작성하려고합니다. 그것은 매우 간단합니다. 그것은 데이터베이스를 쿼리하는 준비된 문장 일 뿐이지 만 이것을 작동시킬 수는 없습니다. 난 개체가 아닌 개체에 대한 prepare () 함수를 호출하여 오류를 계속 받는다. 코드는 다음과 같습니다.
$DBH = new mysqli("host", "test", "123456", "dbname");
function selectInfo($limit, $offset){
$stmt = $DBH->prepare("SELECT * FROM information LIMIT ?,?");
$stmt->bind_param("ii", $limit, $offset);
$stmt->execute();
}
selectInfo();
언제든지 함수를 호출하면 오류가 발생합니다. 누군가 제발 도와 줄 수 있니?
해결법
-
==============================
1.범위 오류입니다. $ DBH를 전역 변수로 만들고 있습니다. 따라서 함수를 입력 할 때 전역 변수를 사용할 수 없습니다. 5 가지 실제 옵션이 있습니다.
범위 오류입니다. $ DBH를 전역 변수로 만들고 있습니다. 따라서 함수를 입력 할 때 전역 변수를 사용할 수 없습니다. 5 가지 실제 옵션이 있습니다.
1. global 키워드 사용
function doSomething() { global $DBH; //...
이것은 PITA의 유지 보수 및 테스트를하기 때문에 좋은 생각이 아닙니다. 해당 함수 호출을 디버그하려고한다고 상상해보십시오. 이제 $ DBH가 정의 된 곳을 찾아 내서 무슨 일이 일어나는지 알아 내려고합니다.
2. $ DBH를 함수의 매개 변수로 만듭니다.
function doSomething(MySQLi $DBH) {
그것은 명백한 장점이 있습니다. 하지만 호출 코드가 전역 변수를 추적해야하기 때문에 여전히 좋지 않습니다.
3. $ DBH 객체를 "가져 오는"함수를 만듭니다.
function getDBH() { static $DBH = null; if (is_null($DBH)) { $DBH = new mysqli(...); } return $DBH; } function doSomething() { $DBH = getDBH(); }
이것은 전역 변수 문제를 완전히 해결할 수 있다는 장점이 있습니다. 그러나 여러 연결을 사용하거나 다른 연결에 대한 코드를 다시 사용하는 것도 어렵습니다.
4. 데이터베이스 액세스를 래핑하는 클래스를 만듭니다.
class Database { public function __construct($host, $user, $pass) { $this->DBH = new MySQli($host, $user, $pass); } public function doSOmething() { $this->DBH->foo(); } }
이것은 당신을 위해 모든 것을 요약합니다. 모든 데이터베이스 액세스는 단일 클래스를 거치므로 전역 변수 액세스 또는 다른 것에 대해 걱정할 필요가 없습니다.
5. 사전 빌드 된 클래스 / 프레임 워크 사용
이것은 자신에게 최선을 다하는 것에 대해 걱정할 필요가 없기 때문에 최선의 선택입니다.
데이터베이스 액세스 클래스 :
전체 프레임 워크 :
정말로 선택은 끝이 없습니다. 당신이 좋아하는 것을 찾아서 붙잡아 라. 정말 네 인생을 더 쉽게 만들거야.
행운을 빕니다!
-
==============================
2.$ DBH가 범위에 없습니다. 함수에서 $ DBH를 전역 변수로 정의하려고합니다.
$ DBH가 범위에 없습니다. 함수에서 $ DBH를 전역 변수로 정의하려고합니다.
$DBH = new mysqli("host", "test", "123456", "dbname"); function selectInfo($limit, $offset){ global $DBH; $stmt = $DBH->prepare("SELECT * FROM information LIMIT ?,?"); $stmt->bind_param("ii", $limit, $offset); $stmt->execute(); }
또는 그의 훌륭한 대답에서 지적한 ircmaxell은 $ DBH의 정적 인스턴스를 반환하는 함수를 가지고 있습니다.
-
==============================
3.전역 $ DBH를 추가하십시오. 함수에 추가하거나 함수의 매개 변수에 추가하십시오.
전역 $ DBH를 추가하십시오. 함수에 추가하거나 함수의 매개 변수에 추가하십시오.
-
==============================
4.
selectInfo($DBH); function selectInfo($DBH,$limit, $offset){ $stmt = $DBH->prepare("SELECT * FROM information LIMIT ?,?"); $stmt->bind_param("ii", $limit, $offset); $stmt->execute(); }
-
==============================
5.간단합니다. $ DBH는 selectInfo () 함수 내에 존재하지 않습니다. 전역 범위에 정의 된 변수는 함수 내에서 보이지 않으며 그 반대도 마찬가지입니다. 매뉴얼 페이지의 변수 범위에 대해 자세히 읽어보십시오.
간단합니다. $ DBH는 selectInfo () 함수 내에 존재하지 않습니다. 전역 범위에 정의 된 변수는 함수 내에서 보이지 않으며 그 반대도 마찬가지입니다. 매뉴얼 페이지의 변수 범위에 대해 자세히 읽어보십시오.
그것을 해결하는 방법? 변수를 함수의 인수로 전달하십시오.
$dbh = new MySQLi(...); function selectInfo(MySQLi $dbh, $limit, $offset) { $stmt = $dbh->prepare(...); ... }
-
==============================
6.연결이 성공적인지 확인하십시오.
연결이 성공적인지 확인하십시오.
$DBH = @new mysqli("host", "test", "123456", "dbname"); if ($DBH->connect_errno) { die('Connect Error: ' . $DBH->connect_errno); }
또는
$DBH = @mysqli_connect("host", "test", "123456", "dbname"); if (!$DBH ) { die('Connect Error: ' . mysqli_connect_errno()); }
-
==============================
7.$ DBH를 글로벌하게 만드는 것은 건강하지 않습니다 ... 단, $ DBH를 클래스로 보호하고 null로 설정할 수 있습니다. 그것을 사용하십시오 ..
$ DBH를 글로벌하게 만드는 것은 건강하지 않습니다 ... 단, $ DBH를 클래스로 보호하고 null로 설정할 수 있습니다. 그것을 사용하십시오 ..
-
==============================
8.
class PDOconnect extends PDO{
protected $ con = null;
public function __construct(){ try { $this->con= new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD ); //our new PDO Object $this->con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT ); $this->con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING ); $this->con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); echo "hi.. you are connected succcessfully..."; }
from https://stackoverflow.com/questions/4463441/call-to-a-member-function-prepare-on-a-non-object-php-help by cc-by-sa and MIT license
'PHP' 카테고리의 다른 글
이중 콜론 (:)으로 비 정적 메서드 호출 (0) | 2018.09.17 |
---|---|
PHP에서 동적으로 mysqli bind_param 인수를 바인딩하는 방법? (0) | 2018.09.17 |
PHP의 오류 로그는 어디에서 XAMPP에 있습니까? (0) | 2018.09.17 |
PHP의 preg_match 및 UTF-8 (0) | 2018.09.17 |
PHP 문자열에서 모든 html 태그를 제거하십시오. (0) | 2018.09.17 |