Подтвердить что ты не робот

Вызов функции-члена 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();

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

4b9b3361

Ответ 1

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

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

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

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

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

Удачи!

Ответ 2

$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

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

Ответ 4

selectInfo($DBH);

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

Ответ 5

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

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

$dbh = new MySQLi(...);

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

Ответ 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

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

Ответ 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...";
                  }