Вызов функции-члена prepare() для не-объекта PHP Help

Я пытаюсь написать PHP-функцию. Это очень просто. Это просто подготовленный оператор, который запрашивает базу данных, но я не могу заставить это работать. Я продолжаю получать сообщение об ошибке для вызова функции-члена() для не-объекта. вот код:

$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();

Каждый раз, когда я вызываю функцию, я получаю эту ошибку. Кто-нибудь может помочь?

8 ответов

Это ошибка определения области видимости. Вы делаете $DBH глобальную переменную. Поэтому, когда вы вводите функцию, глобальная переменная недоступна. У вас есть 5 реальных опций.

1. Используйте глобальное ключевое слово

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. Используйте предварительно построенный класс/фреймворк

Это лучший вариант, так как вам не нужно беспокоиться о том, чтобы сделать это самостоятельно.

Классы доступа к базам данных:

Полные рамки:

Действительно, выбор бесконечен. Найдите то, что вам нравится, и придерживайтесь его. Это действительно облегчит вашу жизнь...

Удачи!


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


Это просто. $DBH не существует в функции selectInfo(). Переменная, определенная в глобальной области видимости, не будет видна внутри функции и наоборот. Подробнее о области переменных на страницах руководства.

Как его решить? Передайте эту переменную в качестве аргумента функции:

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


Убедитесь, что соединение выполнено успешно.

$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());
}


Попробуйте добавить global $DBH; в функцию или добавить ее к параметрам функции.


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


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


Создание глобальной базы данных DBH не является здоровым... за исключением того, что вы можете сделать свой $DBH защищенным в классе и установить его на null.. и использовать его.

licensed under cc by-sa 3.0 with attribution.