복붙노트

치명적인 오류 : 멤버 함수 bind_param () 호출 부울

PHP

치명적인 오류 : 멤버 함수 bind_param () 호출 부울

내가 DB에서 설정을 가져 오는 함수에 바쁘다, 갑자기, 나는이 오류가 만났다 :

Fatal error: Call to a member function bind_param() on boolean in C:\xampp2\htdocs\application\classes\class.functions.php on line 16

일반적으로 이것은 내가 눈에 띄지 않는 테이블과 물건에서 물건을 선택한다는 것을 의미합니다. 하지만이 경우에는 ...

다음은 getSetting 함수입니다.

public function getSetting($setting)
{
    $query = $this->db->conn->prepare('SELECT value, param FROM ws_settings WHERE name = ?');
    $query->bind_param('s', $setting);
    $query->execute();
    $query->bind_result($value, $param);
    $query->store_result();
    if ($query->num_rows() > 0)
    {
        while ($query->fetch()) 
        {
            return $value;
            if ($param === '1')
            {
                $this->tpl->createParameter($setting, $value);
            }
        }
    }
    else
    {
        __('invalid.setting.request', $setting);
    }
}

$ this-> db 변수는 생성자를 통해 전달됩니다. 필요한 경우 여기에 있습니다.

public function __construct($db, $data, $tpl)
{
    $this->db = $db;
    $this->tpl = $tpl;
    $this->data = $data;
    $this->data->setData('global', 'theme', $this->getSetting('theme'));
}

또한 데이터베이스를 사용하고 있으므로 데이터베이스 연결 :

class Database
{
    private $data;

    public function __construct($data)
    {
    $this->data = $data;
    $this->conn = new MySQLi(
      $this->data->getData('database', 'hostname'), 
      $this->data->getData('database', 'username'), 
      $this->data->getData('database', 'password'), 
      $this->data->getData('database', 'database')
    );
    if ($this->conn->errno)
    {
        __('failed.db.connection', $this->conn->errno);
    }
    date_default_timezone_set('Europe/Amsterdam');
}

이미 연결을 테스트했는데 100 % 긍정적 인 반응을 보였습니다. 구성 파일에서 DB 연결 설정 중입니다.

'database' => array(
    'hostname' => '127.0.0.1',
    'username' => 'root',
    'password' => ******,
    'database' => 'wscript'
)

이제 이상한 일이 있습니다. 테이블이 존재하고 요청 된 설정이 존재하지만 DB가 존재하지만 여전히 그 오류는 남기지 않습니다. 다음은 DB가 올바른지 확인하는 것입니다.

해결법

  1. ==============================

    1.

    문제는 다음과 같습니다.

    $query = $this->db->conn->prepare('SELECT value, param FROM ws_settings WHERE name = ?');
    $query->bind_param('s', $setting);
    

    prepare () 메서드는 false를 반환 할 수 있으므로 확인해야합니다. 왜 그것이 false를 리턴하는지에 관해서는, SELECT 나 WHERE 절의 테이블 이름이나 컬럼 이름이 올바르지 않은 것일까?

    또한 SQL 구문 분석에서 발생한 오류를 검사하려면 $ this-> db-> conn-> error_list와 같은 것을 사용하는 것이 좋습니다. (가끔씩 실제 SQL 문 문자열을 에코하여 phpMyAdmin에 붙여 테스트 할 수도 있지만, 거기에는 분명히 실패한 것이 있습니다.)

  2. ==============================

    2.

    언제든지 당신은 ...

    ... 쿼리에 문제가있어 가능성이 있습니다. prepare ()는 FALSE (Boolean)를 반환 할 수 있지만이 일반적인 실패 메시지는 단서를 많이 남기지 않습니다. 당신의 질문에 무엇이 잘못되었는지 어떻게 알 수 있습니까? 물어!

    먼저 오류보고가 켜져 있고 표시되는지 확인하십시오. 여는

    error_reporting(E_ALL);
    ini_set('display_errors', 1);
    

    오류보고가 php.ini에서 설정 되었다면 걱정할 필요가 없습니다. 오류를 정상적으로 처리하고 모든 문제의 진정한 원인을 사용자에게 공개하지 마십시오. 진정한 대중을 공개하는 것은 사이트와 서버에 해를 끼치고 자하는 사람들을 위해 황금으로 새겨진 초대장이 될 수 있습니다. 브라우저에 오류를 보내지 않으려면 웹 서버 오류 로그를 항상 모니터 할 수 있습니다. 로그 위치는 서버마다 다를 수 있습니다. 예를 들어 우분투에서는 오류 로그가 일반적으로 /var/log/apache2/error.log에 있습니다. Linux 환경에서 오류 로그를 검사하는 중이면 콘솔 창에서 tail -f / path / to / log를 사용하여 실시간으로 발생하는 오류를 볼 수 있습니다.

    일단 표준 오류보고에 제곱되어 데이터베이스 연결 및 오류에 대한 오류 검사를 추가하면 진행되는 문제에 대한 자세한 정보를 얻을 수 있습니다. 열 이름이 잘못된이 예제를 살펴보십시오. 첫째, 일반적인 치명적인 오류 메시지를 반환하는 코드는 다음과 같습니다.

    $sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
    $query = $mysqli->prepare($sql)); // assuming $mysqli is the connection
    $query->bind_param('s', $definition);
    $query->execute();
    

    오류는 일반적이며 진행 상황을 해결하는 데 도움이되지 않습니다.

    몇 줄의 코드를 사용하면 문제를 즉시 해결하는 데 사용할 수있는 매우 자세한 정보를 얻을 수 있습니다. 진실성을 위해 prepare () 문을 확인하십시오. 좋은 경우 바인딩 및 실행을 계속할 수 있습니다.

    $sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
    if($query = $mysqli->prepare($sql)) { // assuming $mysqli is the connection
        $query->bind_param('s', $definition);
        $query->execute();
        // any additional code you need would go here.
    } else {
        $error = $mysqli->errno . ' ' . $mysqli->error;
        echo $error; // 1054 Unknown column 'foo' in 'field list'
    }
    

    문제가 발생하면 직접 오류 메시지를 표시하는 오류 메시지를 낼 수 있습니다. 이 경우 테이블에 foo 열이 없으므로 문제를 해결하는 것이 간단합니다.

    선택하면 함수 또는 클래스에이 검사를 포함시키고 오류를 정상적으로 처리하여 확장 할 수 있습니다.

  3. ==============================

    3.

    에러가 발생했을 때만 boolean을 반환합니다. 따라서 에러가 발생하지 않도록하려면 FALSE를 반환합니다. 실행 전에 True인지 확인해야합니다.

    $sql = 'SELECT value, param FROM ws_settings WHERE name = ?';
    if($query = $this->db->conn->prepare($sql)){
        $query->bind_param('s', $setting);
        $query->execute();
        //rest of code here
    }else{
       //error !! don't go further
       var_dump($this->db->error);
    }
    
  4. ==============================

    4.

    질의 구문이 정확할지라도, 이전 명령문이 있고 닫히지 않은 경우 prepare는 false를 반환 할 수 있습니다. 항상 이전 진술을 닫으십시오.

    $statement->close();
    

    구문이 올 바르면 다음 쿼리도 잘 실행됩니다.

  5. ==============================

    5.

    이 문제를 일으킬 수있는 또 다른 상황은 쿼리에서 잘못된 캐스팅입니다.

    나는 그것이 명백하게 들리 겠지만, Tablename 대신에 tablename을 사용하여 이것을 실행했다. 검색어를 확인하고 표의 실제 열 이름과 동일한 대소 문자를 사용하고 있는지 확인하십시오.

  6. ==============================

    6.

    경우에 따라 prepare.에서 잘못된 테이블 이름 또는 컬럼 이름이 있기 때.입니다.

    이것 좀 봐:

    https://www.youtube.com/watch?v=LGHdQ1bBho8

  7. ==============================

    7.

    항상 try catch 블록에 진술을 넣으려면 가능한 한 많이 시도해야합니다 ... 항상 이와 같은 상황에서 도움이 될 것이고 무엇이 잘못되었는지 알려 줄 것입니다. 테이블 이름 또는 열 이름이 잘못되었을 수 있습니다.

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

    8.

    이 특정 오류는 실제 오류와 거의 관련이 없습니다. 여기 내 비슷한 경험과 솔루션입니다 ... 내 성명에서 "| database-name | .login"합성 이름을 사용하는 테이블이 있습니다. 나는 이것이 문제가되지 않을 것이라고 생각했다. 참으로 문제였습니다. 대괄호 안에 그것을 묶어 내 문제를 해결했습니다 ( "[| database-name |]. [login]"). 그래서, 문제는 MySQL 보존 단어 (다른 방법;)) ... 너무 열이 오류 scdenario이 유형에 실패하지 않도록 ...

  9. ==============================

    9.

    다음 두 가지가이 문제의 가장 큰 원인입니다.

    $stmt->close(); // <<<-----This fixed the issue for me
    
    $stmt = $conn->prepare("Insert statement");
    
  10. ==============================

    10.

    때로 명시 적으로 테이블 열 이름을 명시하면 (특히 삽입 쿼리에서) 도움이 될 수 있습니다. 예를 들어, 쿼리는 다음과 같습니다. INSERT INTO tableName (param1, param2, param3) VALUES (?,?,?)는 다음과 반대로 더 잘 작동합니다. INSERT INTO tableName VALUES (?,?,?)

  11. from https://stackoverflow.com/questions/27394710/fatal-error-call-to-a-member-function-bind-param-on-boolean by cc-by-sa and MIT lisence