Передача MySQL-соединения в функцию - PullRequest
1 голос
/ 13 июля 2010

Я пытаюсь установить соединение MySQL в основном скрипте, а затем вызывать различные функции в зависимости от того, что я хочу сделать.У меня возникают проблемы при передаче информации о соединении в функцию.

У меня есть класс «query», который содержит различные функции, которые возвращают массив.Вот как выглядит код в моем основном скрипте (вызывая функцию normal)

$mysqli = new mysqli($db_host, $db_user, $db_pass, $db_name) or die (mysql_error());
$stats = $queries->normal($mysqli);

И затем внутри ресурса запросов у меня есть этот код:

class queries {
    function normal($mysqli) {
        $query = "SELECT number, first, last FROM roster";
        $roster = $mysqli->query($query);

Затем я продолжаюделать то, что мне нужно.Я не могу заставить это работать хотя.Я получаю сообщение об ошибке

Call to a member function normal() on a non-object

в строке, в которой я вызываю функцию, в моем основном файле.

Это похоже на эти вопросы, но я не могу понять это. Передача соединения с базой данных по ссылке в PHP Обеспечение работы MySQL-соединения в функции PHP

Спасибо

Ответы [ 5 ]

5 голосов
/ 13 июля 2010

$queries - это не объект, а тем более объект queries.Выясни, что ты назначил ему вместо этого, и назначь ему правильную вещь:)

Ах, я думаю, я понял это сейчас.queries это класс, а не объект.Вам нужно создать объект, который является экземпляром класса.

$queries_obj = new queries;
$queries_obj->normal($mysqli);
2 голосов
/ 13 июля 2010

«Вызов функции-члена normal () для необъекта» означает, что вы пытаетесь вызвать normal() для переменной, которая не является объектом. Возможно, вы хотели это сделать:

$queries = new queries();
$stats = $queries->normal($mysqli);
1 голос
/ 13 июля 2010

Думайте о своем определении класса как о рецепте, а объекте - как о реальном блюде, которое вы приготовили, используя этот рецепт.

Как утверждают другие, вы, вероятно, не создали (не создали) объект этого класса.

0 голосов
/ 13 июля 2010

Хотя я мог бы согласиться с тем, что передача обработчиков базы данных в методах / функциях, вероятно, не лучшая идея, но не грязно передавать объекты базы данных классам через конструктор, особенно если у вас несколько соединений.

0 голосов
/ 13 июля 2010

Я бы действительно не рекомендовал структурировать ваш код следующим образом.Обход соединения mysql может сделать ваши подписи функций невероятно загроможденными.Два других варианта:

  • Шаблон Singleton: Инкапсулируйте ваши функции взаимодействия с базой данных в один класс, а затем каждый раз, когда вам нужно вызвать один из них, вы получаете экземпляр этого класса.Что хорошо в этом методе, так это то, что вы всегда получаете одно и то же дБ соединение вместо того, чтобы открывать много запросов.Если вы не используете тяжелый OO (много процедурного php или много глобальных функций), это действительно полезно.Например:
public function foo() {  
  $results = Db::getInstance()->query("SELECT * FROM bar");  
  // Do other stuff
  return $results;
}
  • Наследование: Этот шаблон действительно полезен, если вы работаете с чем-то вроде MVC или вам нужно, чтобы объекты совместно использовали функциональность.В сочетании с одноэлементным соединением вы сохраняете одно соединение с БД на запрос и простой доступ к экземпляру БД в переменной-члене.
class DB {
  public function __construct() {
    $this->conn = Db::getInstance();
  }
}


class Foo extends DB {
  public function foo() {
    $this->conn->query("SELECT * FROM bar");
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...