McDodik
@McDodik
MC.Додик

Как исправить эту ошибку?

Шалом! Как исправить эту ошибку? Fatal error: Call to a member function query() on a non-object in Z:\home\tronmoney.online\www\engine\functions.php on line 12
Вот код
function fakePayout ($user, $amount, $time) {
   $referer = 'P'.rand(4, 6).rand(1, 0).rand(000000, 999999);
   $refererIncome = $amount/100*150;
   $mysqli->query("INSERT INTO `deposits` (`user`, `amount`, `time`, `type`, `fake`) VALUES ('$user', '$amount', '$time', '1', '1')");
   $mysqli->query("INSERT INTO `deposits` (`user`, `amount`, `time`, `type`, `fake`) VALUES ('$referer', '$refererIncome', '$time', '2', '1')");
   return true;
}

вот подключение к базе
class DataBase
{
   public $template = 'default';
   public $db_host;
   public $db_user;
   public $db_passord;
   public $db_name;

   public $mysql_port;
   public $mysql_socket;

   public function __construct($db_host, $db_user, $db_passord, $db_name, $mysql_port, $mysql_socket)
   {
      $this->db_host = $db_host;
      $this->db_user = $db_user;
      $this->db_passord = $db_passord;
      $this->db_name = $db_name;

      $this->mysql_socket = $mysql_socket;
      $this->mysql_port = $mysql_port;

      $mysqli = @new mysqli($this->db_host, $this->db_user, $this->db_passord, $this->db_name, $this->mysql_port, $this->mysql_socket);
      if (mysqli_connect_error()) {
         echo 'Подключение к серверу Mysql невозможно. Код ошибки: '.mysqli_connect_error();
         exit;
      }
   }
}

подключаю так
include_once(dirname(__FILE__).'/engine/classes/Config.class.php');
$mysqli = new DataBase("localhost", "root", "", "test1488", NULL, NULL);
  • Вопрос задан
  • 220 просмотров
Пригласить эксперта
Ответы на вопрос 3
FanatPHP
@FanatPHP
Чебуратор тега РНР
1. Выкинуть класс DataBase на помойку, он здесь явно лишний.
2. создать файл engine/что-нибудь/mysqli.php и записать в него код отсюда
3. Добавить а параметрам функции $mysqli
function fakePayout ($mysqli, $user, $amount, $time) {

4. Переписать код запросов на подготовленные выражения
function fakePayout ($mysqli, $user, $amount, $time) {
   $referer = 'P'.rand(4, 6).rand(1, 0).rand(000000, 999999);
   $refererIncome = $amount/100*150;
   $stmt = $mysqli->prepare("INSERT INTO `deposits` (`user`, `amount`, `time`, `type`, `fake`) VALUES (?,?,?, '1', '1')");
    $stmt->bind_param("sss", $user, $amount, $time);
    $stmt->execute();
    $stmt = $mysqli->prepare("INSERT INTO `deposits` (`user`, `amount`, `time`, `type`, `fake`) VALUES (?,?,?, '2', '1')");
    $stmt->bind_param("sss", $referer, $refererIncome, $time);
    $stmt->execute();
}

5. Вызывать как обычно
include_once(dirname(__FILE__).'/engine/что-нибудь/mysqli.php');
fakePayout ($mysqli,$user, $amount, $time);
Ответ написан
Комментировать
HeadOnFire
@HeadOnFire
PHP, Laravel & WordPress Evangelist
Проблема в области видимости - переменная $mysqli недоступна в функции fakePayout(). Решается одним из способов:

1. Явной передачей переменной внутрь функции function fakePayout($mysqli, ...) {
2. Корректным доступом к данной переменной, поместив ее в свойство класса, содержащего функцию fakePayout():
class SomeClass 
{
    private $mysqli;

    public function __construct(DataBase $mysqli)
    {
        $this->mysqli = $mysqli;
    }

    public function fakePayout($user, $amount, $time)
    {
        // Теперь можно использовать
        $this->mysqli->query()
    }
}

3. Вариации #2 с dependency injection контейнерами, фасадами и прочее.

ЗЫ: Можно еще внутри самой функции создавать соединение, или хранить его в глобальной переменной / синглтоне - но это уже совсем дичь.
Ответ написан
AlexMaxTM
@AlexMaxTM
Внутри функции fakePayout переменная $mysqli не определена. Передавайте ее как еще один параметр к функции.
function fakePayout ($user, $amount, $time, $mysqli) {
.....
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы