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가 정확하다는 증거입니다.
문제는 다음과 같습니다.
$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);
}
준비문의 테이블 이름이나 열 이름이 잘못되어 있는 경우도 있습니다.
이것 좀 봐.
이 문제를 일으킬 수 있는 또 다른 상황은 쿼리에 잘못된 캐스팅을 하는 것입니다.
것처럼 , 저는 이 .tablename
Tablename
의 실제 하고 있는지 확인합니다 쿼리를 체크하고 테이블 내의 컬럼의 실제 이름과 동일한 대소문자를 사용하고 있는지 확인합니다.
항상 가능한 한 자신의 진술을 항상 시도 캐치 블록에 넣도록 노력해야 합니다.이런 상황에서 항상 도움이 될 것이고 무엇이 잘못되었는지 알려줄 것이다.테이블 이름 또는 열 이름이 잘못되었을 수 있습니다.
이 문제의 가장 가능성이 높은 원인은 다음과 같습니다.
- 열 이름 또는 테이블 이름의 맞춤법 오류
- 기정전표가마감되지않습니다.미리 준비한 진술을 하기 전에 닫기만 하면 됩니다.
$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 (?, ?)");
에는 "" " " " " " 가 포함되어 .$
이치노은 거기에 는 안 .$field1
should 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
'programing' 카테고리의 다른 글
javascript에서 배열 인덱스의 존재 여부를 확인하는 방법 (0) | 2022.10.08 |
---|---|
MySQL에서 sqlalchemy 연결을 닫는 방법 (0) | 2022.10.08 |
포틀렛과 서블릿의 차이점은 무엇입니까? (0) | 2022.10.08 |
TDD용 JavaScript 유닛 테스트 도구 (0) | 2022.10.08 |
Symfony 3.4.6 - 10.1.37-MariaDB-0+deb9u1 - 인덱스 열 크기가 너무 큼 (0) | 2022.10.08 |