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

[PHP] Problem ze zmienną w klasie

Object Storage Arubacloud
0 głosów
309 wizyt
pytanie zadane 9 maja 2018 w PHP przez KoruS Obywatel (1,630 p.)

Witam. Mógł by mi ktoś wytłumaczyć dlaczego to:

<?php

namespace EK;

class db
{
	private $dbconnect = new PDO("{$config['engineSQL']}:host={$config['host']};dbname={$config['DBname']};charset={$config['charset']}", 
		$config['DBlogin'], 
		$config['DBpass'], 
		[PDO::ATTR_EMULATE_PREPARES=>false, 
		PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION]
	);

	function insert($where, $value) {
		return $dbconnect->query('INSERT INTO '.$where.' VALUES ('.$value.')');
	}
}

Wyświetla błąd: Fatal error: Constant expression contains invalid operations (ścieżka) on line 7

Szukałem po internecie, usuwałem z tego wszystkie zmienne $config i zastępowałem po prostu danymi i dalej to wyskakuje. Z góry dziękuję za pomoc :)

1
komentarz 9 maja 2018 przez efiku Szeryf (75,160 p.)

Szkoda patrzeć na odpowiedź poniżej( w zasadzie wszystkie tego forumowicza można ignorować) ...  :) 

Jest coś takiego jak konstruktor i w konstruktorze zrób jak coś już:

<?php
...
 public function __construct(array $config)
{
  $this->dbconnect =  new \PDO("{$config['engineSQL']}:host={$config['host']};dbname={$config['DBname']};charset={$config['charset']}", 
        $config['DBlogin'], 
        $config['DBpass'],
        [PDO::ATTR_EMULATE_PREPARES=>false,
        PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION]
    );
}

Jeśli chcesz rozwiać swoje wszelkie wątpliwości, to poczytaj jakiś materiał na czasie o klasach w PHP. 

Z manuala na temat twojego błędu:

Like any other PHP static variable, static properties may only be initialized using a literal or constant before PHP 5.6; expressions are not allowed. In PHP 5.6 and later, the same rules apply as const expressions: some limited expressions are possible, provided they can be evaluated at compile time.

komentarz 9 maja 2018 przez KoruS Obywatel (1,630 p.)
edycja 9 maja 2018 przez KoruS

Właśnie zauważyłem, że tamten użytkownik do niczego się nie nadaje :)

Niestety, napotkałem kolejny problem. Szukałem rozwiązania, ale nic sensownego nie znalazłem :(

<?php

namespace EK;

class db
{

    private $dbconnect;

    public function __construct(){
        global $config;

         $this->dbconnect = new PDO("{$config['engineSQL']}:host={$config['host']};dbname={$config['DBname']};charset={$config['charset']}", 
            $config['DBlogin'], 
            $config['DBpass'],
            [PDO::ATTR_EMULATE_PREPARES=>false,
            PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION]
        );
    }

    public function insert($where, $value) {
        return $dbconnect->query('INSERT INTO '.$where.' VALUES ('.$value.')');
    }
}
\EK\db::insert('users', 'NULL , '.$nick.', '.$email.', '.$password_hash.', 0');

Fatal error: Uncaught Error: Call to a member function query() on null in (ścieżka) Stack trace: #0 (ścieżka) EK\db::insert('users', 'NULL , James Au...') #1 (ścieżka): {closure}(NULL) #2 {main} thrown in (ścieżka) on line 24

komentarz 10 maja 2018 przez efiku Szeryf (75,160 p.)

Dałem Ci ewidentnie przykład, jak przekazać $config przez konstruktor, a Ty.. zrobiłeś go za pomocą global?

Co oznacza, że masz gdzieś moje sugestie na temat poczytania o klasach w PHP.

Jeśli używasz PDO, to Twoja metoda insert jest bez sensu, ponieważ  można wstrzyknąć tam co się chce. NUll w błędzie oznacza, że obiekt pdo nie został utworzony..

 

<?php

class db
{
 
    private $dbconnect;
 
    public function __construct($config){
         $this->dbconnect = new stdClass;
         var_dump($config);
    }
 
    public function insert($sql, array $args) {
        //$pdoPrepare = $this->dbconnect->prepare($sql);
        //return $pdoPrepare->execute($args);
        var_dump([$sql,$args]);
    }
}
    
$config = [
"engineSQL" => "mysql",
"DBname" => "test",
"charset" => "utf-8",
"DBLogin" => "user",
"DBPass" => "haslo",
"host" => "localhost"
];

$database = new db($config);

$sql = "INSERT INTO 'tabela' VALUES (:username,:password, :first_name,:last_name)";
$args = [
    ':username' => '~user',
    ':password' => '~pass',
    ':first_name' => '~John',
    ':last_name' => '~Doe'
    ];
    
$database->insert($sql,$args);

http://pl.phptherightway.com/

https://code.tutsplus.com/tutorials/object-oriented-php-for-beginners--net-12762

http://sandbox.onlinephpfunctions.com/code/ef1cc1a30426dd6c3967b1ceeb4b5499a8582378

https://www.phpdevs.pl/

 

1 odpowiedź

–2 głosów
odpowiedź 9 maja 2018 przez Chess Szeryf (76,710 p.)
edycja 9 maja 2018 przez Chess

To co napisałeś nie ma prawa zadziałać, czy widziałeś to:

 PDO {
public __construct ( string $dsn [, string $username [, string $passwd [, array $options ]]] )
// ...
}

?

http://php.net/manual/en/class.pdo.php

http://php.net/manual/en/pdo.construct.php

$dsn - Data Source Name (nazwa źródłowych danych)

$username - User Name (nazwa użytkownika)

$passwd - Password (hasło)

$options - Options (opcje)

Czwarty parametr to konfiguracja (opcje po połączeniu się z bazą).

// ...
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
// ...

Tutorial: https://phpdelusions.net/pdo

Poczytaj z jakich części może składać się dsn (w PDO) w PHP.

Zobacz kolejność parametrów: http://php.net/manual/en/ref.pdo-mysql.connection.php

$connection_with_pdo = new PDO('mysql:dbname=turqus;host=127.0.0.1','root','',
[
	PDO::ATTR_EMULATE_PREPARES=>false, 
    PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION
]);

 

Podobne pytania

0 głosów
1 odpowiedź 167 wizyt
pytanie zadane 27 grudnia 2018 w C i C++ przez Qbsoon Nowicjusz (150 p.)
0 głosów
1 odpowiedź 116 wizyt
pytanie zadane 3 czerwca 2016 w PHP przez fmc Początkujący (260 p.)
+2 głosów
2 odpowiedzi 609 wizyt
pytanie zadane 3 lipca 2021 w JavaScript przez magic84 Nowicjusz (140 p.)

92,568 zapytań

141,420 odpowiedzi

319,622 komentarzy

61,954 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

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!

...