Я пытаюсь написать функцию 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();
Каждый раз, когда я вызываю функцию, я получаю эту ошибку. Кто-то может помочь?
Это ошибка определения области видимости. Вы делаете $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. Используйте предварительно построенный класс / фреймворк
Это лучший вариант, так как вам не нужно беспокоиться о том, чтобы сделать это самостоятельно.
Классы доступа к базам данных:
Полные рамки:
Действительно, выбор бесконечен. Найдите то, что вам нравится, и придерживайтесь его. Это действительно облегчит вашу жизнь …
Удачи!
$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..."; }