복붙노트

객체가 아닌 객체에서 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. ==============================

    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. ==============================

    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. ==============================

    3.전역 $ DBH를 추가하십시오. 함수에 추가하거나 함수의 매개 변수에 추가하십시오.

    전역 $ DBH를 추가하십시오. 함수에 추가하거나 함수의 매개 변수에 추가하십시오.

  4. ==============================

    4.

    selectInfo($DBH);
    
    function selectInfo($DBH,$limit, $offset){
        $stmt = $DBH->prepare("SELECT * FROM information LIMIT ?,?");
        $stmt->bind_param("ii", $limit, $offset);
        $stmt->execute();
        }
    
  5. ==============================

    5.간단합니다. $ DBH는 selectInfo () 함수 내에 존재하지 않습니다. 전역 범위에 정의 된 변수는 함수 내에서 보이지 않으며 그 반대도 마찬가지입니다. 매뉴얼 페이지의 변수 범위에 대해 자세히 읽어보십시오.

    간단합니다. $ DBH는 selectInfo () 함수 내에 존재하지 않습니다. 전역 범위에 정의 된 변수는 함수 내에서 보이지 않으며 그 반대도 마찬가지입니다. 매뉴얼 페이지의 변수 범위에 대해 자세히 읽어보십시오.

    그것을 해결하는 방법? 변수를 함수의 인수로 전달하십시오.

    $dbh = new MySQLi(...);
    
    function selectInfo(MySQLi $dbh, $limit, $offset) {
        $stmt = $dbh->prepare(...);
        ...
    }
    
  6. ==============================

    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. ==============================

    7.$ DBH를 글로벌하게 만드는 것은 건강하지 않습니다 ... 단, $ DBH를 클래스로 보호하고 null로 설정할 수 있습니다. 그것을 사용하십시오 ..

    $ DBH를 글로벌하게 만드는 것은 건강하지 않습니다 ... 단, $ DBH를 클래스로 보호하고 null로 설정할 수 있습니다. 그것을 사용하십시오 ..

  8. ==============================

    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...";
                      }
    
  9. 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