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
|
|
|
DejaVu |
» 2012-10-21 23:46:38 |
|
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. |
|
DejaVu |
» 2012-10-22 13:16:53 |
|
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. |
|
|
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ą. |
|
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 ... |
|
« 1 » |