Неустранимая ошибка: вызов функции-члена get () для null в C: \ appserv \ www \ Cocolani \ php \ req \ register.php в строке 4 - PullRequest
0 голосов
/ 14 июня 2019

Я все еще начинающий программист, поэтому я надеюсь, что вы дадите решение шаг за шагом.

Я пытаюсь создать частный сервер для флэш-игры, и у меня возникла проблема, которой я не имеюне знаю, как я могу решить это вообще.Я хочу связать игру с базой данных, и когда кто-то пытается создать учетную запись (зарегистрироваться) в игре, данные учетной записи, которые должны быть сохранены в базе данных (например, имя пользователя, пароль, цвет маски, дата рождения, дата регистрации,и т.д. ...) но это не происходит

Файл, который отвечает за этот шаг, называется "register.php", и я продолжаю получать эту ошибку:

Fatal error: Call to a member function get() on null in C:\appserv\www\Cocolani\php\req\register.php on line 4

проблеманаходится в этой строке:

$db = new database($obj->get("db_name"), $obj->get("db_server"), $obj->get("db_user"), $obj->get("db_password"), $obj->get("url_root"));

и это "register.php":

<?php
include_once("db.php");
include_once("settings.php");
$db = new database($obj->get("db_name"), $obj->get("db_server"), $obj->get("db_user"), $obj->get("db_password"), $obj->get("url_root"));

$FROM_EMAIL = $obj->getEmailFrom();

function generateTribeCurrency($ID, $db) {

//  $db = new database();

    // get init purse amount
    $db->setQuery("SELECT init_purse_amount FROM `cc_def_settings`");
    $row = $db->loadResult();
    $init_purse_amount = $row->init_purse_amount;

        // load tribe info
    $db->setQuery("SELECT * FROM `cc_tribes`");
    $tribeinfo = $db->loadResults();

    $newstr = array();      
    foreach ($tribeinfo as $i) {
        if ($ID == $i->ID) array_push($newstr, $init_purse_amount); else array_push($newstr, 0);
    }
    $newstr = implode(",", $newstr);

    return $newstr;
}

$hackchk = false;

 foreach($_POST as $POST) {
$POST = mysqli_real_escape_string($POST);
}

function remove_bad_symbols($s) {
return preg_replace(
  array(0=>'#/#', 1=>'#\\\#', 2=>'#;#', 3=>'#{#', 4=>'#}#', 5=>'#<#', 6=>'#>#', 7=>'#@#', 8=>'#\'#', 9=>'# #', 10=>'#"#') // patterns
  , '' // replacements
  , $s);
 }

 $username = isset($_POST['username']) ? remove_bad_symbols($_POST['username']) : "";
 $password = isset($_POST['password']) ? $_POST['password'] : "";
 $email = isset($_POST['email']) ? $_POST['email'] : "";
 $birthdate = isset($_POST['birthdate']) ? $_POST['birthdate'] : "";
 $firstname = isset($_POST['firstname']) ? $_POST['firstname'] : "";
 $lastname = isset($_POST['lastname']) ? $_POST['lastname'] : "";
 $sex = isset($_POST['sex']) ? $_POST['sex'] : "";
 $tribeid = isset($_POST['clan']) ? $_POST['clan'] : "";
 $mask = isset($_POST['mask']) ? $_POST['mask'] : "";
 $mask_color = isset($_POST['maskcl']) ? $_POST['maskcl'] : "";
 $lang_id = isset($_POST['lang_id']) ? $_POST['lang_id'] : 0;

 $error = '';

 $purse = generateTribeCurrency((int) $tribeid, $db);

 // get language suffix 
 if ($lang_id != 0) {
 $db->setQuery("SELECT * FROM `cc_extra_langs` WHERE id='{$lang_id}'");
 $res = $db->loadResult();
 $lang = "_".$res->lang;
 } else $lang = "";  


 $db->setQuery("SELECT one_email_per_registration FROM `cc_def_settings`");
 $res = $db->loadResult();
 $one_registration_per_email = ($res->one_email_per_registration == 1);

 $email_check_ok = true;
 if ($one_registration_per_email == true) {
 $sql = "SELECT COUNT(*) AS counter FROM `cc_user` WHERE email='{$email}'"; 
 // for several registrations per one email address -- no check  
   $db->setQuery($sql);
   $res1 = $db->loadResult();
   $email_check_ok = $res1->counter == "0";
 }

 // first check there is no username with this name already registered.
 $db->setQuery("SELECT COUNT(*) AS counter FROM `cc_user` WHERE username='".$username."'");
 $res = $db->loadResult();

 if ($username && $email && $sex && $birthdate) {
     if ($email_check_ok) {
   if ($res->counter == "0") {
        // check that there are no registrations from this same IP in the last 2 hours
        $db->setQuery("SELECT COUNT(*) as counter FROM `cc_userreginfo` WHERE IP='".$_SERVER['REMOTE_ADDR']."' AND (DATE_SUB(CURDATE(), INTERVAL 2 HOUR)<register_date)");
        $regcheck = $db->loadResult(); 
        if (($regcheck != null && (int)($regcheck->counter) == 0) || $hackchk == false) {

      // get number of already registered number of registrations with this email address                    
      $query = $db->setQuery("SELECT count(*) as registered_num_emails FROM `cc_user` WHERE email='{$email}'");
      $row = $db->loadResult();
      $already_registered_num_emails = $row->registered_num_emails;

      // get max number of accounts per email from settings table
      $query = $db->setQuery("SELECT max_num_account_per_email from `cc_def_settings`");
      $row = $db->loadResult();
      $max_num_account_per_email = $row->max_num_account_per_email;

      if ($already_registered_num_emails < $max_num_account_per_email) {

              $uniqid = uniqid(); 
                $newreq = "INSERT INTO `cc_user` (`ID`,`username`, `password`, `email`, `birth_date`, `first_name`, `last_name`, `sex`, `about`, `mask`, `mask_colors`, `clothing`, `tribe_ID` , `money`, `happyness`, `rank_ID`, `status_ID`, `lang_id`, `register_date`, uniqid, permission_id) VALUES ";
                $newreq .= "(NULL, '{$username}', '{$password}', '{$email}', '{$birthdate}', '{$firstname}' , '{$lastname}', '{$sex}', '', '{$mask}', '{$mask_color}', '', '{$tribeid}', '{$purse}', 50, 0, 3, '{$lang_id}', NOW(), '{$uniqid}', 4)";
                $db->setQuery($newreq);
                $res = $db->runQuery();
                if ($res) {
                  // add registration info into the userreginfo table as well.
                    $iid = $db->mysqlInsertID();
                    $db->setQuery("INSERT INTO `cc_userreginfo` (`ID`, `user_id`, `register_IP`, `register_date`, `last_update`) VALUES (NULL, ".$iid.",'".$_SERVER['REMOTE_ADDR']."', NOW(), NOW())");
                    $res2 = $db->runQuery();

                    $counter = ($regcheck != null) ? $regcheck->counter : 0; 
                    echo 'response=true&reg='.$counter;
            // ----------------------------------
            // send confirmation email
            // ----------------------------------                        
            $cur_lang = ($lang != "") ? substr($lang, 1)."/" : "";            
            $msg = $obj->getTranslation(-13, $lang, "email_templates", "id", "content");
            $msg = str_replace("%FIRST_NAME%", $firstname, $msg);  
            $msg = str_replace("%LAST_NAME%", $lastname, $msg);
            $msg = str_replace("&#039;", "'", $msg);              
            $msg = str_replace("%CONFIRM%", '<a href="'.$obj->get("url_root").'/'.$cur_lang.'registration-confirmed?confirmregistration='.$uniqid.'">confirm</a>', $msg);
            $headers  = 'MIME-Version: 1.0' . "\r\n";
            $headers .= 'Content-type: text/html; charset=utf8' . "\r\n";
            $headers .= 'From: '.$FROM_EMAIL."\r\n";
            //mail($email, $obj->getTranslation(-13, $lang, "email_templates", "id", "subject"), $msg, $headers);

            include "../../admin/php_mailer/class.phpmailer.php";
            $mail = new PHPMailer(); // defaults to using php "mail()"
            $body = $msg;
            $body = eregi_replace("[\]",'',$body);
            $mail->SetFrom($FROM_EMAIL);
            $mail->AddAddress($email);
            $mail->Subject = $obj->getTranslation(-13, $lang, "email_templates", "id", "subject");
            $mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test
            $mail->MsgHTML($body);
            if(!$mail->Send()) {
              die("Mailer Error: " . $mail->ErrorInfo);
            } else {
              //echo "Message sent!";
            }            
            // ----------------------------------
                } else {
                    echo 'response=false';
                }

      } else {
        // get warning message from db
        $db->setQuery("SELECT * FROM `cc_translations` WHERE caption='MAX_NUM_REGISTRATION_REACHED'");
        $res = $db->loadResult();
              echo 'error='.urlencode($res->{"name".$lang});
      }  


        } else {
      // get warning message from db
      $db->setQuery("SELECT * FROM `cc_translations` WHERE caption='REGISTER_LATER'");
        $res = $db->loadResult();
          echo 'errorhide='.urlencode($res->{"name".$lang});
        }
     } else {
     // get warning message from db
     $db->setQuery("SELECT * FROM `cc_translations` WHERE caption='USERNAME_IN_USE'");
     $res = $db->loadResult();
       echo 'error='.urlencode($res->{"name".$lang});
     }
 } else {
   //if ($one_registration_per_email == true) 
     $sql = "SELECT * FROM `cc_translations` WHERE caption='DUPLICATED_EMAIL'"; //else $sql = "SELECT * FROM `cc_translations` WHERE caption='DUPLICATED_REGISTRATION'";
   // get warning message from db
   $db->setQuery($sql);
     $res = $db->loadResult();
       echo 'error='.urlencode($res->{"name".$lang});
   }
 } else {
 // get warning message from db
 $db->setQuery("SELECT * FROM `cc_translations` WHERE caption='REGFORM_PROBLEM'");
 $res = $db->loadResult();     
     echo 'error='.urlencode($res->{"name".$lang});
 }   

 ?>

примечание: "register.php" требует два файла, так что, возможно, ошибка в одном изих

settings.php:

<?php

$db_server = "localhost";
$db_user = "root";
$db_password = "qazqazqaz1";
$db_name = "coco"; 

$connect = mysqli_connect("$db_server","$db_user","$db_password","$db_name");


?>

db.php:

<code><?php

class database {
var $_debug = 0;
var $_sql = '';
var $_error = '';
var $_prefix = '';

var $_numrows = 0;

var $_DBhost = 'localhost';
var $_DBuser = "root";
var $_DBpass = "qazqazqaz1";
var $_DBname = "cocol";
var $url_root = "localhost/cocolani";

public function __construct($dbname = 'cocolani_battle', $dbuser = 'root', $dbpsw = 'pass1234', $dbhost = 'localhost', $urlroot = 'localhost/cocolani') {

        $this->_DBname = 'cocolani_battle';
        $this->_DBuser = 'root';
        $this->_DBpass = 'pass1234';
        $this->url_root = 'localhost/cocolani';
        $this->_DBhost = 'localhost';

    $this->_connection = mysqli_connect($this->_DBhost, $this->_DBuser, $this->_DBpass) or die("Couldn't connect to MySQL");
    mysqli_select_db($this->_connection, $this->_DBname) or die("Select DB Error: ".mysqli_error());

}

public function __destruct() {
    mysqli_close($this->_connection);
}

function debug($debug_level) {
    $this->_debug = intval($debug_level);   
}

function setQuery($sql) {
    /* queries are given in the form of #__table need to replace that with the prefix */
    $this->_sql = str_replace('#__', $this->_prefix.'_', $sql);
}

function getQuery() {
    return "<pre>" . htmlspecialchars( $this->_sql) . "
";} функция prepareStatement ($ sql) {$ this-> sql = mysqli_prepare ($ this-> _ connection, $ sql); вернуть $ this-> sql;} функцию runQuery ($ num_rows = 0) {mysqli_select_db ($ this -> _ connection, $ this -> _ DBname) или die («Выбрать ошибку БД:» .mysqli_error()); $ this -> _ numrows = 0; $ result = mysqli_query ($ this -> _ connection, $ this -> _ sql); if ($ this -> _ debug> 1) echo "
" . htmlspecialchars( $this->_sql) . "
"; if (! $ result) {$ this -> _ error = mysqli_error ($ this -> _ connection);if ($ this -> _ debug) {echo 'Ошибка:'.$ this-> getQuery ().$ Это -> _ ошибка;} вернуть ложь;} if ($ num_rows) {$ this -> _ numrows = mysqli_num_rows ($ result);} вернуть $ результат;} / * Получить идентификатор вставки Mysql * / function mysqlInsertID () {$ insert_id = mysqli_insert_id ();return $ insert_id;} / * Экранирует специальные символы при вставке в db * / function db_input ($ string) {if (is_array ($ string)) {$ retArray = array ();foreach ($ string as $ key => $ value) {$ value = (get_magic_quotes_gpc ()? stripslashes ($ value): $ value);$ retArray [$ key] = mysqli_real_escape_string ($ value);} return $ retArray;} else {$ string = (get_magic_quotes_gpc ()? stripslashes ($ string): $ string);return mysqli_real_escape_string ($ string);}} function getError () {return $ this -> _ error;} / * Загрузка результатов в строку в формате csv * / function loadCsv () {if (! ($ Res = $ this-> runQuery ())) {return null;} $ csv_string = '';while ($ row = mysqli_fetch_row ($ res)) {$ line = '';foreach ($ row как $ value) {if ((! isset ($ value)) || ($ value == "")) {$ value = ",";} else {$ value = $ value."";$ value = str_replace ('"', '" "', $ value);} $ line. = $ value;} $ line = substr ($ line, 0, -1); $ csv_string. = trim ($ line). "\ n";} $ csv_string = str_replace ("\ r", "", $ csv_string); // $ csv_string. = implode (",", $ row). "\ n"; mysqli_free_result ($ res); return $ csv_string;} / * Загрузка нескольких результатов * / функция loadResults ($ key = '') {if (! ($ res = $ this-> runQuery ())) {return null;} $ array = array (); while ($ row = mysqli_fetch_object ($ res)) {if ($ key) {$ array [strtolower ($ row -> $ key)] = $ row;} else {$ array [] = $ row;}} mysqli_free_result($ res); вернуть $ массив;} функция loadResult () {if (! ($ res = $ this-> runQuery ())) {if ($ this -> _ debug) echo 'Ошибка:'. $ this->_error; return null;} $ row = mysqli_fetch_object ($ res); mysqli_free_result ($ res); return $ row;} / * Загрузить поле результата в массив * / function loadArray () {if (! ($ res = $this-> runQuery ())) {return null;} $ array = array (); while ($ row = mysql_fetch_row ($ res)) {$ array [] = $ row [0];} mysqli_free_result ($ res);Ретурмассив n $;}/ * Загрузить строку в ассоциативный массив * / function loadAssoc () {if (! ($ Res = $ this-> runQuery ())) {return null;} $ row = mysqli_fetch_assoc ($ res);mysqli_free_result ($ Рез);вернуть $ row;} / * Вернуть одно поле * / function loadField () {if (! ($ Res = $ this-> runQuery ())) {return null;} while ($ row = mysql_fetch_row ($ res)) {$ field = $ row [0];} mysqli_free_result ($ res);вернуть поле $;}?>

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

спасибо.

1 Ответ

0 голосов
/ 14 июня 2019

Ошибка относится к $obj->get. По сути, вы выполняете метод get для пустой переменной, то есть он не существует. После просмотра всего кода, который у вас есть, вы не объявляете $obj в любой момент.

Я думаю, вам может понадобиться проверить, как вы передаете свои настройки объекту базы данных. Например:

$db = new database($db_server, ... , ...);

Обновлено: Вы все равно жестко программируете свое соединение, просто ничего не передавайте объекту БД.

Изменить это:

$db = new database($obj->get("db_name"), $obj->get("db_server"), $obj->get("db_user"), $obj->get("db_password"), $obj->get("url_root"));

К этому:

$db = new database();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...