programing

DB에서 설정을 가져오는 함수에서 오류가 발생했습니다.

luckcodes 2022. 10. 8. 10:10

DB에서 설정을 가져오는 함수에서 오류가 발생했습니다.

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가 정확하다는 증거입니다.

IMG

문제는 다음과 같습니다.

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

메서드는 반환할 수 있습니다.false확인해 보세요.되는 false의 경우)이 될 수 있습니다SELECT ★★★★★★★★★★★★★★★★★」WHERE항이이 이이 ????? ???

또한 SQL 구문 분석에서 발생한 오류를 검사하기 위해 사용하는 것을 고려하십시오(가끔 실제 SQL 문 문자열을 에코하고 테스트하기 위해 phpMyAdmin에도 붙여넣습니다만, 거기에는 분명히 문제가 있습니다).

언제 어디서든...

"치명적 오류: 부울에서 멤버 함수 bind_param()을 호출합니다."

의 쿼리에 가 있기 일 수 .당신의 쿼리에 문제가 있기 때문일 수 있습니다.prepare()도 모르다FALSE(Boolean) 단, 이 일반적인 실패 메시지는 많은 단서를 남기지 않습니다.질문의 문제점을 어떻게 발견합니까?당신이 물어봐요!

으로 되어.「 」 「 」 「 」 「 」 「 」를 연 이 2 합니다.아, 네, 네, 네, 네.<?php 삭제:

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

되어 있는 php.ini에 대해 걱정할 필요가 없습니다.사용자에게 문제의 진정한 원인을 밝히지 않고 오류를 적절하게 처리하도록 하십시오.당신의 사이트와 서버에 해를 끼치고 싶은 사람들에게 진정한 원인을 대중에게 공개하는 것은 금으로 새겨진 초대장이 될 수 있습니다.브라우저에 오류를 전송하지 않으려면 웹 서버 오류 로그를 항상 모니터링할 수 있습니다.예를 들어 는 「에러 로그」에 .예를 들어 Ubuntu에서는 일반적으로 에러 로그는 다음 위치에 있습니다./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표의 열에서 문제를 해결하는 것은 사소한 일입니다.

선택할 경우 이 체크를 함수 또는 클래스에 포함시키고 앞서 설명한 것처럼 오류를 적절하게 처리하여 확장할 수 있습니다.

쿼리 구문이 올바른 경우에도 이전 문이 있고 닫히지 않은 경우 prepare는 false를 반환할 수 있습니다.항상 다음 내용으로 이전 문장을 종료합니다.

$statement->close();

구문이 올바르면 다음 쿼리도 정상적으로 실행됩니다.

prepare에만 부울을 한다.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);
}

준비문의 테이블 이름이나 열 이름잘못되어 있는 경우도 있습니다.

이것 좀 봐.

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

것처럼 , 저는 이 .tablenameTablename의 실제 하고 있는지 확인합니다 쿼리를 체크하고 테이블 내의 컬럼의 실제 이름과 동일한 대소문자를 사용하고 있는지 확인합니다.

항상 가능한 한 자신의 진술을 항상 시도 캐치 블록에 넣도록 노력해야 합니다.이런 상황에서 항상 도움이 될 것이고 무엇이 잘못되었는지 알려줄 것이다.테이블 이름 또는 열 이름이 잘못되었을 수 있습니다.

이 문제의 가장 가능성이 높은 원인은 다음과 같습니다.

  1. 열 이름 또는 테이블 이름의 맞춤법 오류
  2. 기정전표가마감되지않습니다.미리 준비한 진술을 하기 전에 닫기만 하면 됩니다.

$stmt->close(); // <<<-----This fixed the issue for me

$stmt = $conn->prepare("Insert statement");

에러는 테이블 필드명을 변수로 전달했기 때문에 발생합니다.송신:

$stmt = $this->con->prepare("INSERT INTO tester ($test1, $test2) VALUES (?, ?)");

다음 대신:

$stmt = $this->con->prepare("INSERT INTO tester (test1, test2) VALUES (?, ?)");

에는 "" " " " " " 가 포함되어 .$이치노은 거기에 는 안 .$field1should be field1.

제 경험상으로는bind_param괜찮았는데 데이터베이스 이름을 잘못 알고 접속 파라미터에서 데이터베이스 이름만 변경했는데 완벽하게 작동했어요.

루트 폴더를 나타내는 루트 경로, 폴더를 포함하는 경로, 웹사이트의 홈 URL을 포함하는 기본 URL을 정의했습니다.이것은, 필요한 장소에의 콜에 사용됩니다.

테이블 열 이름(특히 삽입 쿼리에서)을 명시적으로 언급하면 도움이 될 수 있습니다.예를 들어 다음과 같은 쿼리입니다.

INSERT INTO tableName(param1, param2, param3) VALUES(?, ?, ?)

다음과 같은 경우보다 더 잘 작동합니다.

INSERT INTO tableName VALUES(?, ?, ?)

이 특정 오류는 실제 오류와 거의 관련이 없습니다.여기 저의 비슷한 경험과 해결 방법이 있습니다.

는 .|database-name|.login했다.난난이 、 문제가지을줄 。말말문문문문다다로 묶어서 했다.[|database-name|].[login]그래서 문제는 MySQL의 단어(그 반대)가 보존되어 있다는 것입니다.열도 이러한 유형의 오류 시나리오에 실패하지 마십시오.

언급URL : https://stackoverflow.com/questions/27394710/on-a-function-that-gets-settings-from-a-db-i-ran-into-the-error