Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[PHP] Method szablon::__toString() must return a string value in

Ostatnio zmodyfikowano 2012-10-24 20:05
Autor Wiadomość
jsc
Temat założony przez niniejszego użytkownika
[PHP] Method szablon::__toString() must return a string value in
» 2012-10-21 17:58:53
Ostatnio Admixior wykazał się jako web haker to zadedykuję mu i innym, którzy potrafią kombinować na błędach oto taki ooops, który sobie wysmażyłem.

Zrobiłem sobie taki system, który wczytuje z pliku szablon zapytania sql obrabia je i wysyła do bazy danych:
IOPlik.php

<?php
// Biblioteka przeznaczone do wykonywania odczytów i zapisów między instancją witryny, a jej plikami

class IOPlik
{
    private $plik;

    public function __construct ($sciezka)
    {
        if (!(file_exists ($sciezka)))
        {
            die ('Podany plik nie isnieje');
        }
       
        $this -> plik = $sciezka;
    }

    public function szybkiDopisDoPliku ($tekst)
    {
        if (!(is_writable ($this -> plik)))
        {
            die ('Podany plik nie moze byc zapisywany');
        }
       
        file_put_contents ($this -> plik, $tekst, FILE_APPEND | LOCK_EX);
    }

    public function szybkiOdczytPliku ()
    {
        if (!(is_readable ($this -> plik)))
        {
            die ('Podany plik nie moze byc czytany');
        }
       
        return file_get_contents ($this -> plik);
    }
   
    public function __toString ()
    {
        if (!(is_readable ($this -> plik)))
        {
            die ('Podany plik nie moze byc czytany');
        }
       
        return file_get_contents ($this -> plik);
    }   
}
?>

szablon.php

<?php
class szablon
{
    private $tresc;
   
    private $poczatekWzorca = '/^\(\$';
    private $dopuszczalneZnaki = '[a-zA-Z]+';
    //Każdy znak, ktory nie jest alfanumeryczny nie przejdzie tego testu
    private $koniecWzorca = '\)$/D';
   
    private function wzorzec ()
    {
        return $this -> poczatekWzorca . $this -> dopuszczalneZnaki . $this -> koniecWzorca;
    }
   
    public function __construct ($zawartosc)
    {
        $this -> tresc = $zawartosc;
    }

    public function przeksztalc ($argument, $wartosc)
    {
        if (!(preg_match ($this -> wzorzec (), $argument)))
        {
            die ('Wyszukiwany wzorzec jest nieprawidlowy' . $argument);
        }
       
        $this -> tresc = str_replace ($argument, $wartosc, $this -> tresc);
    }

    public function __toString ()
    {
        if ((preg_match ($this -> wzorzec (), $this -> tresc)))
        {
            die ('Szablon nie jest przetworzony do konca');
        }
       
        return $this -> tresc;
    }
}
?>

IOBazaDanych.php

<?php
require_once ('.\IOPlik.php');
require_once ('.\szablon.php');

class bazaDanych
{
    private $zrodla;
    private $lacze;
   
    private $kwerenda;
    private $wynik;
   
    private $czyWykonane;
   
    public function __construct ($sciezka)
    {
        $this -> zrodla = $sciezka . DIRECTORY_SEPARATOR;
        $daneLogowania = new IOPlik ($this -> zrodla . 'login.txt');
       
        try
        {
            $this -> lacze = new PDO ($daneLogowania);
        }
       
        catch (PDOEXception $blad)
        {
            die ('Połączenie nie moze zostać utworzone: ' . $e->getMessage());
        }
       
        $this -> czyWykonane = false;
    }
   
    public function __destruct()
    {   
        if (!($this -> czyWykonane))
        {
            die ('Poprzednia kwerenda nie wykonana');
        }
       
        unset ($this -> lacze);
    }
   
    public function utworzKwerende ($typ)
    {
        if ($this -> czyWykonane)
        {
            die ('Poprzednia kwerenda nie wykonana');
        }
       
        unset ($this -> wynik);
        $this -> czyWykonane = false;
       
        $typKwerendy = new IOPlik ($this -> zrodla . DIRECTORY_SEPARATOR . $typ . '.txt');
        $this -> kwerenda = new szablon ($typKwerendy);
    }
   
    public function uzupelnijKwerende ($kolumna, $zawartosc)
    {
        if ($this -> czyWykonane)
        {
            die ('W bazie danych nie maktywnego zapytania');
        }
       
        $this -> kwerenda -> przeksztalc ($kolumna, $zawartosc);
    }
   
    public function wykonajKwerende ($czyZmienia)
    {
        if ($this -> czyWykonane)
        {
            die ('W bazie danych nie maktywnego zapytania');
        }
       
        try
        {
            if ($czyZmienia)
            {
                $this -> wynik = $this -> lacze -> exec ("'" . $this -> kwerenda . "'");
                unset ($this -> zapytanie);
            }
       
            else
            {
                $this -> wynik = $this -> lacze -> query ("'" . $this -> kwerenda . "'");
                unset ($this -> kwerenda);
            }
        }
       
        catch (PDOEXception $blad)
        {
            die ('Kwerenda nie moze byc wykonana: ' . $e->getMessage());
        }
       
        $this -> czyWykonane = true;
    }
   
    public function zwrocWynik ()
    {
        return $this -> wynik;
    }
}
?>


I gdy próbuję (tylko i wyłącznie) robić zapytania korzystające z metody query od PDO wyskakuje mi co następuje:

( ! ) Catchable fatal error: Method szablon::__toString() must return a string value in C:\wamp\www\CMS\skrypty\PHP\IOBazaDanych.php on line 84
Call Stack
# Time Memory Function Location
1 0.0005 382344 {main}( ) ..\zakladanie konta.php:0
2 0.0209 451320 bazaDanych->wykonajKwerende( ) ..\zakladanie konta.php:25
P-67235
DejaVu
» 2012-10-21 23:46:38
private $tresc = "";
P-67254
jsc
Temat założony przez niniejszego użytkownika
» 2012-10-22 09:25:06
Zmieniłem to co wskazałeś i dalej dostaję to samo.
P-67270
DejaVu
» 2012-10-22 13:16:53
Być może błąd jest gdzieś indziej, a być może 'die' nie jest mile widziany wewnątrz tej metody. Poczytaj dokumentację i poeksperymentuj.

http://php.net/manual/en/language.oop5.magic.php
P-67277
jsc
Temat założony przez niniejszego użytkownika
» 2012-10-22 13:33:48
Z adresu skorzystam, a co do die to na pewno nie to, bo testowałem to też na gołym projekcie (mój CMS 0.0.1) i też to było, a zrobiłem je, bo chcę mieć to gotowe do jako takiej publikacji.

A z eksperymentowania wyszło mi, że te moje __toString gryzie się z zapytaniami, ale z faktu, że skrypt do bazy się loguje wychodzi, że błąd jest bardzo gdzieś indzie.

PS. Z adresu skorzystałem, zgłosiłem mój błąd i dostałem:
This appears to be caused by the fact that the $tresc property in the
bazaDanych::$kwerenda variable created in utworzKwerende() is set to an object,
rather than a string.

I nie wiem jak zgodnie z netykietą napisać, że do zapytania NAPRAWDĘ przekazuję string?
Chyba nie mogę napisać:
W linijce 31 pliku szablon.php zaczyna się magiczna funkcja __toString, która wzraca $this -> tresc, która zawiera tekst.
P-67280
jsc
Temat założony przez niniejszego użytkownika
» 2012-10-23 12:18:46
Okazało się, że jak utworzyłem obiekt szablonu to PDO bierze jako ten obiekt, acz ponoć żąda stringa.
Dziwi mnie tylko, że panowie developerzy od PHP uznają za sytuację normalną.
P-67330
jsc
Temat założony przez niniejszego użytkownika
Problem z zapytaniami
» 2012-10-24 20:05:30
Muszę odmrozić ten temat, bo dotyczy systemu, który tu zaprezentowałem, a dotyczy tego, że baza danych (MySQL na WAMPServer 2.2) w ogóle nie reaguje na moje zapytania.

Problem dotyczy następującego kodu:
index.html

<!DOCTYPE html>
<html lang="pl">
<head>
<title>Zakladanie konta witryny</title>
</head>

<body>
<form action="./zakladanie konta.php" method="get">
Podaj lokalizacje witryny:
<input type="text" name="katalogWitryny" required /><br />
Podaj domene witryny: <input type="url" name="domenaWitryny" required /><br />
<input type="submit" value="Zatwierdź" />
</form>
</body>
</html>

zakladanie konta.php:

<?php
require_once ('C:\wamp\www\jsc\IOBazaDanych.php');

$przewodnikWitryn = new bazaDanych ('C:\wamp\www\jsc\SQL');

$przewodnikWitryn -> utworzKwerende ('liczWiersze');
$przewodnikWitryn -> wykonajKwerende (false);

$obecnaIloscWitryn = $przewodnikWitryn -> zwrocWynik ();

$przewodnikWitryn -> utworzKwerende ('dodajWitryne');

$przewodnikWitryn -> uzupelnijKwerende ('($id)', ++$obecnaIloscWitryn);
$przewodnikWitryn -> uzupelnijKwerende ('($nazwa)', $_GET["katalogWitryny"]);
$przewodnikWitryn -> uzupelnijKwerende ('($domena)', $_GET['domenaWitryny']);
$przewodnikWitryn -> uzupelnijKwerende ('($sponsor)', 'ja');

$przewodnikWitryn -> wykonajKwerende (true);

unset ($przewodnikWitryn);
?>

SQL\login.txt

mysql:host = localhost; dbname = witryny; port = 3307, '', ''

SQL\liczWiersze.txt

SELECT COUNT '*' FROM 'daneglowne'

SQL\login.txt

INSERT daneglowne (ID, Nazwa, Domena, Sponsor) VALUES (($id), '($nazwa)', '($domena)', '($sponsor)')

Z góry dziękuję za pomoc.

Na razie udało mi się znaleźć trick na ujawnienie potencjalnego błędu i dostałem:

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''daneglowne'' at line 1

Może mi ktoś podpowiedzieć jak to czytać, abym mógł wpisać do Google MySQL błąd numer ...
P-67407
« 1 »
  Strona 1 z 1