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

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

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

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

1. Используйте ключевое слово global

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

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

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

  • Быстрый поиск Google, чтобы вы начали
  • Doctrine ORM – полная библиотека доступа к базе данных с полным ORM (Object Mapping)
  • ADODB – библиотека доступа к базам данных агностической базы данных
  • Pear MDB2 – Другая библиотека доступа к базе данных

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

  • Zend Framework
  • Литиевая основа
  • Код зажигания
  • (действительно, есть намного больше, я больше не собираюсь перечислять листинг, так как это еще один вопрос …)

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

Удачи!

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

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

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

Это просто. $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()); } 

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

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