• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Odbieranie zmiennych przez AJAX z OOP PHP

VPS Starter Arubacloud
0 głosów
405 wizyt
pytanie zadane 23 maja 2018 w PHP przez jking Początkujący (350 p.)

Cześć, zacząłem nieco refaktoryzować swój kod na bardziej obiektowego PHP, czyli zacząłem tworzyć własne klasy, metody i tak dalej. Niestety borykam się z problemem, z którym nie mam pojęcia jak sobie poradzić.

Otóż chcę żeby zaraz po załadowaniu strony, javascript wysłało ajax'a do php, który po wykonaniu danych metod zwróci mi tablicę w JSON'ie, dzięki czemu będę mógł sobie powkładać odpowiednie zmienne do danych DIV'ów.

Tak prezentuje się strona kod pliku accounts.php, w którym chcę wyświetlić żądane wartości:

<?php
session_start();

if (!($_SESSION['loggedIn'])) {
  header('Location: index.php');
  exit();
}

$userId = $_SESSION['userId'];

// include '../includes/database_inc.php';
include '../includes/accounts_inc.php';

$account = new Account();
$account->connect();
$account->getAccountInfo($userId);


?>

<!DOCTYPE HTML>
<html lang="pl">

  <head>
    <meta charset="utf-8" />
    <title>Free Bank - Panel Użytkownika</title>
    <link rel="stylesheet" type="text/css" href="../css/style-paneluser.css" />
    <link rel="stylesheet" type="text/css" href="../css/fontello.css" />
    <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.0.12/css/all.css"
      integrity="sha384-G0fIWCsCzJIMAVNQPfjH08cyYaUtMwjJwqiRKxxE/rx96Uroj1BtIQ6MLJuheaO9" crossorigin="anonymous">
    <link rel="shortcut icon" href="../img/logoicon.ico" type="image/x-icon">
    <link href="https://fonts.googleapis.com/css?family=Nunito:400,600&amp;subset=latin-ext" rel="stylesheet">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="../scripts/paneluser.js" type="text/javascript"></script>

  </head>

  <body>

    <div id="top-bar">
      <div id="logo">
        <a href="../paneluser/accounts.php" border="0" alt="Free Bank"><img src="../img/logo.png"></a>
      </div>

      <div id="user-information">
        <p1><?= $_SESSION['userName'] ." ". $_SESSION['userSurname']; ?></p1> <br>
        <p2><a href="../logout.php"><i class="fas fa-sign-out-alt" style="color: red;"></i> Wyloguj się</a></p2>
        <a href="#">
          <div id="avatar">
            <i class="fas fa-user"></i>
          </div>
        </a>
        <p3><a href="#"><i class="fas fa-cog"></i> Ustawienia</p3></a>
        <p4><a href="#"><i class="fas fa-envelope"></i> Wiadomości</p4></a>
        <p5><a href="#"><i class="fas fa-plus"></i></i> Nowy rachunek</p5></a>
      </div>

    </div>



    <nav>
      <ul id="navigation">
        <li><a href="accounts.php">Moje rachunki</li></a>
        <li><a href="#">Wykonaj przelew</li></a>
        <li><a href="#">Historia operacji</li></a>
        <li><a href="#">Książka odbiorców</li></a>
        <li><a href="#"><i class="far fa-envelope"></i> Kontakt z nami</li></a>
        <i id="dot1" class="fas fa-circle"></i>
        <i id="dot2" class="fas fa-circle"></i>
        <i id="dot3" class="fas fa-circle"></i>
        <i id="dot4" class="fas fa-circle"></i>
        <i id="dot5" class="fas fa-circle"></i>
      </ul>
    </nav>

    <main>

      <div id="my-accounts">
        <p>Moje rachunki</p>
        <p1>Saldo</p1>
        <p2>Dostępne środki</p2>
        <div id="account-nr1">
          <div class="account-type"></div>
          <div class="account-number"></div>
          <div class="balance"></div>
          <div class="available-funds"></div>
        </div>
        <div id="new-account-btn"></div>
        <div id="new-account"></div>
        <div id="account-description"></div>
      </div>

    </main>


  </body>

  <footer>
    <div id="socials">
      <a href="http://www.facebook.pl" target="_blank"><i class="icon-facebook-squared"></i></a>
      <a href="http://www.twitter.com" target="_blank"><i class="icon-twitter-squared"></i></a>
      <a href="http://www.instagram.com" target="_blank"><i class="icon-instagram-1"></i></a>
    </div>
  </footer>
</html>

Tutaj plik accounts_inc.php:

<?php

if (session_status() == PHP_SESSION_NONE) {
  session_start();
}

include 'database_inc.php';

class Account extends Database {
  private $userId;
  private $accountNumber;
  private $accountBalance;
  private $accountAvailableFunds;
  private $accountType;

  public function getAccountInfo($userId) {
    $this->userId = $userId;

    try {
      $query = $this->pdo->prepare('SELECT * FROM accounts WHERE id_user = :userId');
      $query->bindValue(':userId', $this->userId, PDO::PARAM_INT);
      $query->execute();

      $accInfo = $query->fetch();
      if ($accInfo > 0) {
        $this->accountNumber         = $accInfo['account_number'];
        $this->accountBalance        = number_format($accInfo['balance'], 2, ',', ' ');
        $this->accountAvailableFunds = number_format($accInfo['available_funds'], 2, ',', ' ');
        $this->accountType           = $accInfo['account_type'];

        switch($this->accountType) {
          case 'standard':
            $this->accountType = "Rachunek standard";
            break;
          case 'standard-plus':
            $this->accountType = "Rachunek standard plus";
            break;
          case 'for-young':
            $this->accountType = "Rachunek dla młodych";
            break;
          case 'company':
            $this->accountType = "Rachunek firmowy";
            break;
        }

        $entryNumber = $this->accountNumber[0] . $this->accountNumber[1];
        $restNumber  = null;

        for ($i = 2; $i < 26; $i++) {
          $restNumber = $restNumber . $this->accountNumber[$i];
        }

        $formattedNumber = $entryNumber . ' ' . chunk_split($restNumber, 4 , ' ');

        $accountInfo = [
          'formattedNumber' => $formattedNumber,
          'balance' => $this->accountBalance,
          'availableFunds' => $this->accountAvailableFunds,
          'accountType' => $this->accountType,
        ];

        // $data['formattedNumber'] = $formattedNumber;
        // $data['balance'] = $this->accountBalance;
        // $data['availableFunds'] = $this->accountAvailableFunds;
        // $data['accountType'] = $this->accountType;

        echo json_encode($accountInfo);

        // echo '<div class="account-number">'.$formattedNumber.'</div>';
        // echo '<div class="balance">'.$this->accountBalance.' PLN'.'</div>';
        // echo '<div class="available-funds">'.$this->accountAvailableFunds.' PLN'.'</div>';
        // echo '<div class="account-type">'.$this->accountType.'</div>';
      } else {
        $accountsCount = 0;
        echo $accountsCount;
      }

    } catch (PDOException $e) {
      echo $e->getMessage();
    }

  }
}

?>

Plik database_inc.php:
 

<?php

class Database {
  private $host;
  private $db_user;
  private $db_password;
  private $db_name;
  protected $pdo;

  public function connect() {
    $this->host        = "localhost";
    $this->db_user     = "root";
    $this->db_password = "";
    $this->db_name     = "freebank";
    try {
      $this->pdo = new PDO("mysql:host=" . $this->host . ";dbname=" . $this->db_name . ";charset=utf8", $this->db_user, $this->db_password, [
        // zwiększenie bezpieczenstwa, wyłączenie emulacji po stronie PDORow
        PDO::ATTR_EMULATE_PREPARES => false,
        // rzucanie błędów
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
      ]);
    } catch (PDOException $e) {
      echo "Wystąpił błąd podczas łączenia z bazą. "."Kod błędu: ".$e->getCode();
      exit();
    }
  }
}

?>

I wreszcie plik paneluser.js:

$(document).ready(function(){
  $.ajax({
    //url: "../includes/accounts_inc.php",
    url: "../paneluser/accounts.php",
    dataType: 'JSON',
    success: function(data) {
      $(".account-number").html(data.formattedNumber);
      $(".account-type").html(data.accountType);
      $(".balance").html(data.balance);
      $(".available-funds").html(data.availableFunds);
    }
  });
})

 

Jedynie co otrzymuję to JSON'a na samym górze strony:

{"formattedNumber":"80 1050 2018 0000 7023 5093 1568 ","balance":"0,00","availableFunds":"0,00","accountType":"Rachunek standard"} 

który jest wywoływany echem w pliku accounts_inc.php

Chciałbym jednak aby to echo było przesyłane do ajaxa i poszczególne wartości wsadzone do divów. Nie jestem też do końca pewny czy dobrze się odwołuję w ajax'ie, ponieważ dla testu dałem w success'ie zwykłego console loga, który i tak się nie pojawia, także nie mam wartości zwrotnych.

Proszę o nakierowanie jak zrobić to aby działało na klasie, którą stworzyłem, chyba, że to kompletnie nie ma sensu i wrócę do poprzedniego schematu.

1 odpowiedź

0 głosów
odpowiedź 24 maja 2018 przez Ehlert Ekspert (213,530 p.)

Bez żadnych konkretów, ale mam nadzieję że będą refleksje które doprowadzą do rozwiązania:

zacząłem nieco refaktoryzować swój kod na bardziej obiektowego PHP

Użycie słowa class bez przemyślenia i od tak, nie czyni kodu zrefaktorowanego na obiektowy.

Nie wiem czemu nie require skoro już tak piszesz.

Oddziel pliki, z htmlem od php. Na ten moment wszystko masz wrzucone na kupę i nie wiesz co się dzieje ani co jest zwracane w ramach requesta. 

Czemu metoda get... nie zwraca wyniku do zmiennej? Czy ona o zgrozo coś wypisuje? 

Jesli z aplikacji skorzysta dziennie 20000 userów, i wystąpi błąd połączenia z bazą to Ty się na pewno o tym nie dowiesz laugh

komentarz 24 maja 2018 przez jking Początkujący (350 p.)

Nie wiem czemu nie require skoro już tak piszesz.

Chodzi Ci o to, żebym zamiast include używał require? Bo nie do końca zrozumiałem to zdanie.

Co do tematu, zrobiłem nowy plik, accounts_handler.php, wrzuciłem do niego taką zawartość:

<?php
session_start();

$userId = $_SESSION['userId'];

include '../classes/account_class.php';

$account = new Account();
$account->connect();
$result = $account->getAccountInfo($userId);
echo json_encode($result);

?>

W ajaxie podmieniłem ścieżkę na plik, który jest wyżej, z pliku accounts.php zostawiłem samego html (plus tylko start sesji w php) i wszystko działa poprawnie. Czy o to chodziło?

komentarz 24 maja 2018 przez Ehlert Ekspert (213,530 p.)
Nie, bo puszczę requesta do samego handlera, i php sypnie błędem.
komentarz 24 maja 2018 przez jking Początkujący (350 p.)

Hmm?

<?php
if (!$_SERVER['HTTP_REFERER']) {
  header('Location: ../index.php'); 
  die();
}

session_start();


$userId = $_SESSION['userId'];

include '../classes/account_class.php';

$account = new Account();
$account->connect();
$result = $account->getAccountInfo($userId);
echo json_encode($result);

?>

 

Podobne pytania

0 głosów
1 odpowiedź 117 wizyt
pytanie zadane 6 grudnia 2018 w PHP przez niezalogowany
+1 głos
2 odpowiedzi 269 wizyt
pytanie zadane 5 sierpnia 2020 w JavaScript przez persikk Obywatel (1,140 p.)
0 głosów
2 odpowiedzi 443 wizyt
pytanie zadane 22 stycznia 2019 w PHP przez niezalogowany

92,832 zapytań

141,776 odpowiedzi

320,824 komentarzy

62,163 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...