Nie wyświetla się obrazek napisany w PHP po zmianie przestarzalej funkcji EREGI na nową PREG_MATCH
|
r3pilc3 |
Dodany dnia 22.07.2012 17:12:37
|
Przedszkolak
Postów: 7 Ostrzeżeń: 3
Data rejestracji: 22.07.2012 16:20
|
Witam :]
Mam stronę działającą na zasadzie frameworka. Wieke plików.php z elementami JavaScript.
W XAMPP 1.7.1 (PHP 5.2.8) utworzyłem bazę danych powprowadzałem dane. Wyświetlam stronę localhost/nazwastrony i wszystko działa ;]
Strona jest OK!
Pragnę tą stronę mieć w XAMPP 1.7.7, który posiada wersję PHP 5.3.8.
W tym rzecz, że nowsza wersja PHP w XAMPP 1.7.7 napotyka błędy gdy próbuje wyświetlić stronę administratora.
Strona główna nie zawiera błędów. natomiast strona logowania administratora napotyka błędy. Oto strona dla wzrokowców: (zwróćcie uwagę, że obrazek się nie wyświetla).
Z jednym błędem, który się wyświetlał sobie poradziłem.
Funkcja sesion_unregister(), która zgodnie z nowymi wymogami jest 'zła' poprawiłem ją w sposób taki, że:
session_unregister($key);
zastąpiłem:
$_SESSION[$key]=$GLOBALS[$key];
i już się nie wyświetla ten błąd. Tak, więc został mi jeszcze jeden błąd.
"Teraz moja prośba o pomoc".
Wyświetla mi się jeszcze 1 błąd (6x pisze to samo):
Deprecated: Function eregi() is deprecated in (ŚcieżkaPliku\admin.php) on line 242
Komunikat ten oznacza po prostu iż funkcja eregi z której wtedy korzystałem została zdeprecjonowana i należy ją zastąpić nowszym odpowiednikiem. Myślę, że tym odpowiednikiem jest preg_match().
Więc pokażę Wam część kodu związaną z funkcją eregi:
foreach($menus as $option){
if($option['activeon'])
foreach($option['activeon'] as $activeon){
if(eregi($action, $activeon)) {
$option['active']=true;
} }
Po zamianie funkcji eregi zgodnie z wymogami kod powinien wyglądać następująco:
foreach($menus as $option){
if($option['activeon'])
foreach($option['activeon'] as $activeon){
if(preg_match("/".$action."/i", $activeon)) {
$option['active']=true;
} }[code]
lub też zamiast[blad]:[/blad]
[code]if(preg_match("/".$action."/i", $activeon))
można wpisać:
if($action == $activeon)
tak i tak działa strona logowania działa bez wyświetlania się żadnych błędów na niej.
Problem w tym, że po zmianie EREGI na PREG_MATCH nie wyświetla mi się już w ogóle obrazek. A powinien się wyświetlać abym mógł przepisać z niego losowo generujący się kod w celu poprawnego zalogowania na stronie.
Nie wiem co jest nie tak. Jeśli ktoś wpadł na jakiś pomysł to proszę o pomoc.
Odpada opcja wpisania w plik index.php wyłączenia raportowania błędów zamiast poprawić eregi:
error_reporting ('E_ALL ^E_DEPRECATED ^E_NOTICE');
Ponieważ wtedy też obrazek się nie wyświetla.
Co nie tak z funkcją PREG_MATCH, która zastąpiła przestarzałą funkcję EREGI?
Powinno być wszystko OK a tu w ogóle obrazek się nie wyświetla.
Proszę o pomoc.
PW od moderatora:
- Przeniesienie tematu - Drecha 22.07.2012 18:00
Edytowane przez Pieka dnia 27.07.2012 12:42:52
|
|
|
|
Wścibski Gość |
Dodany dnia 22.12.2024 09:59:06
|
Pan Kontekstualny
Postów: n^x
Data rejestracji: Zawsze
|
|
IP: localhost |
|
|
bartek124 |
Dodany dnia 23.07.2012 08:21:09
|
Weteran
Postów: 3264 Pomógł: 236
v7.02.06 Data rejestracji: 26.05.2007 12:25
|
Ten preg_match powinien rozwiązać sprawę. Być może jeszcze skrypt generujący obrazek zawiera jakieś błędy. Otwórz go w nowym oknie i sprawdź czy wyświetla coś niepożądanego.
Nie pomagam na komunikatorach oraz PW!
|
|
|
|
r3pilc3 |
Dodany dnia 25.07.2012 18:47:12
|
Przedszkolak
Postów: 7 Ostrzeżeń: 3
Data rejestracji: 22.07.2012 16:20
|
bartek124 napisał(a):
Ten preg_match powinien rozwiązać sprawę. Być może jeszcze skrypt generujący obrazek zawiera jakieś błędy. Otwórz go w nowym oknie i sprawdź czy wyświetla coś niepożądanego.
Strona składa się z frameworka i nie dam rady tak komponować.
Jak włączę pełne raportowanie błędów to nie wyświetla mi się żaden błąd.
Jak już mówiłem w XAMPP 1.7.1 strona wyświetlał mi się prawidłowo.
Teraz mam XAMPP1.7.7 (PHP5.3.8)..
..i wyświetla mi się komunikat, że funkcja eregi jest przestarzała. Więc zamieniłem ją:
if(eregi($action, $activeon))
na:
if(preg_match("/{$action}/i", $activeon))
Zamieniłem eregi na preg_match i powinno być wszystko ok. Niestety w panelu logowania nie wyświetla się obrazek.
Myślę, że powinien skoro zrobiłem zamianę eregi na preg_match zgodnie z wymogami.
Co może być nie tak? Jakieś pomysły?
Edytowane przez r3pilc3 dnia 26.07.2012 12:32:00
|
|
|
|
bartek124 |
Dodany dnia 26.07.2012 14:41:48
|
Weteran
Postów: 3264 Pomógł: 236
v7.02.06 Data rejestracji: 26.05.2007 12:25
|
Słuchaj, to rozumiem, ale obrazek captchy też jest generowany przez skrypt PHP i być może tam też istnieje jakiś błąd który uniemożliwia poprawne wygenerowanie.
Nie pomagam na komunikatorach oraz PW!
|
|
|
|
r3pilc3 |
Dodany dnia 27.07.2012 11:00:33
|
Przedszkolak
Postów: 7 Ostrzeżeń: 3
Data rejestracji: 22.07.2012 16:20
|
Plik captcha.php:
<?php
$rn=$_GET['rn'];
$datekey = date("F j");
$rcode = hexdec(md5($_SERVER[HTTP_USER_AGENT].$rn . $datekey));
$code = substr($rcode, 2, 6);
$wysokosc=30;
$szerokosc=130;
$pic=imagecreatetruecolor($szerokosc,$wysokosc);
$bialy=ImageColorAllocate($pic,207,224,215);
$czarny=ImageColorAllocate($pic,0,0,0);
$szary=ImageColorAllocate($pic,150,150,150);
ImageFill($pic,1,1,$bialy);
for($i=0;$i<200;$i++)
{
$los1=rand(0,$szerokosc);
$los2=rand(0,$wysokosc);
ImageLine($pic,$los1,$los2,$los1,$los2,$szary);
}
for($i=0;$i<strlen($code);$i++)
{
$nr=$code[$i];
$czcionka = "opiated.ttf";
$rozmiar=rand(9,12); //wielkośc litery
$obrot=rand(-25,25); //pod jakim katem ma być dana litera
imagettftext($pic,$rozmiar,$obrot,$i*20+7,rand(1,2)*4+14,$czarny,$czcionka,$nr);
}
// echo $a."sss";
Header("Content-type: image/gif");
header("Cache-Control:no-store,no-cache,must-revalidate");
ImageGIF($pic);
ImageDestroy($image);
?>
|
|
|
|
bartek124 |
Dodany dnia 27.07.2012 12:38:17
|
Weteran
Postów: 3264 Pomógł: 236
v7.02.06 Data rejestracji: 26.05.2007 12:25
|
Poprawiony:
<?php
$rn=$_GET['rn'];
date_default_timezone_set("Europe/Warsaw");
$datekey = date("F j");
$rcode = hexdec(md5($_SERVER['HTTP_USER_AGENT'].$rn . $datekey));
$code = substr($rcode, 2, 6);
$wysokosc=30;
$szerokosc=130;
$pic=imagecreatetruecolor($szerokosc,$wysokosc);
$bialy=ImageColorAllocate($pic,207,224,215);
$czarny=ImageColorAllocate($pic,0,0,0);
$szary=ImageColorAllocate($pic,150,150,150);
ImageFill($pic,1,1,$bialy);
for($i=0;$i<200;$i++)
{
$los1=rand(0,$szerokosc);
$los2=rand(0,$wysokosc);
ImageLine($pic,$los1,$los2,$los1,$los2,$szary);
}
for($i=0;$i<strlen($code);$i++)
{
$nr=$code[$i];
$czcionka = getcwd()."/opiated.ttf";
$rozmiar=rand(9,12); //wielkośc litery
$obrot=rand(-25,25); //pod jakim katem ma być dana litera
imagettftext($pic,$rozmiar,$obrot,$i*20+7,rand(1,2)*4+14,$czarny,$czcionka,$nr);
}
Header("Content-type: image/gif");
header("Cache-Control:no-store,no-cache,must-revalidate");
ImageGIF($pic);
ImageDestroy($pic);
?>
Kliknij i zaczekaj na załadowanie kodu ...
Plik z czcionką powinien być w tym samym folderze co plik captcha.php.
Nie pomagam na komunikatorach oraz PW!
|
|
|
|
r3pilc3 |
Dodany dnia 27.07.2012 23:20:44
|
Przedszkolak
Postów: 7 Ostrzeżeń: 3
Data rejestracji: 22.07.2012 16:20
|
Tak, znajduje się w tej samej lokalizacji co plik captcha.php.
KOD pliku captcha.php
<?php
$rn=$_GET['rn'];
$datekey = date("F j");
$rcode = hexdec(md5($_SERVER['HTTP_USER_AGENT'].$rn . $datekey));
$code = substr($rcode, 2, 6);
$wysokosc=30;
$szerokosc=130;
$pic=imagecreatetruecolor($szerokosc,$wysokosc);
$bialy=ImageColorAllocate($pic,207,224,215);
$czarny=ImageColorAllocate($pic,0,0,0);
$szary=ImageColorAllocate($pic,150,150,150);
ImageFill($pic,1,1,$bialy);
for($i=0;$i<200;$i++)
{
$los1=rand(0,$szerokosc);
$los2=rand(0,$wysokosc);
ImageLine($pic,$los1,$los2,$los1,$los2,$szary);
}
for($i=0;$i<strlen($code);$i++)
{
$nr=$code[$i];
$czcionka = "opiated.ttf";
$rozmiar=rand(9,12);
$obrot=rand(-25,25);
imagettftext($pic,$rozmiar,$obrot,$i*20+7,rand(1,2)*4+14,$czarny,$czcionka,$nr);
}
// echo $a."sss";
Header("Content-type: image/gif");
header("Cache-Control:no-store,no-cache,must-revalidate");
ImageGIF($pic);
ImageDestroy($image);
?>
?>
Wystarczyło zamienić w nim:
[HTTP_USER_AGENT]
Na:
['HTTP_USER_AGENT']
Oraz otworzyć plik w Notepad++ i zapisać kodowanie w ANSI (a miałem w UTF-8).
Problem rozwiązany:
http://i47.tinypi...3kyptu.png
Dziękuję Bartkowi124 za największe zaangażowanie i próbę pomocy.
Jednak tematu nie zamykam. Ponieważ mam kolejny problem.
Idę krok wyżej i z poprawy błędów występujących w XAMPP 1.7.7 postanowiłem przejść do najnowszego XAMPP 1.8.0.
Oraz dodatkow włączyłem w index.php pełne raportowanie błędów!
Tak więc, w XAMPP 1.8.0, który zawiera php w wersji 5.4.4 mój projekt sklepu internetowego napotyka następujące błędy:
1) strona główna mojej strony zawiera 2 Warningi i błędy, które się nie wyświetlają bez pełnego raportowania błędów:
http://i45.tinypi...upa7ty.png
2) posiadam w projekcie tylko stronę główną oraz stronę logowania w której występują następujące błędy:
http://i47.tinypi...oh0nit.png
Proszę bardzo o pomoc w rozwiązaniu tych błędów.
Narazie zajmnę się 2 Warningami, które doszły wraz z nowa wersją PHP 5.4.4
W pliku controller_base.php wyświetla się błąd w linii: 13 i 17, tylko 'to' trzeba poprawić.
Oto plik controller_base.php:
<?php
Abstract Class Controller_Base {
protected $registry;
function __construct($registry, $models, $addons, $layout, $controller) {
$this->registry = $registry;
$this->session = $registry->session;
$this->error = $registry->error;
$this->text = $registry->text;
$this->router = $registry->router;
$this->template = $registry->template;
$this->db = $registry->db;
foreach($models as $model){
$this->model->$model = $registry->model->$model;
}
if($addons)
foreach($addons as $addon){
$this->addon->$addon = $registry->addon->$addon;
}
$this->template->layout = $layout;
$this->here = $controller;
}
abstract function index($args=null,$post=null);
function addon($addon){
return 'http://'.server_addr.site_addr.'core/addons/'.$addon;
}
}
?>
W pliku router.php warningi są w linii: 118 i 131 oraz błędy w linii: 88, 107 i 135.
plik: router.php:
(Napisałem w komentarzu gzie błędy żebyście nie musieli liczyć: //linia 88 itd..)
<?php
Class Router {
private $registry;
private $path;
private $args = array();
function __construct($registry) {
$this->registry = $registry;
}
function setPath($path) {
$path .= DIRSEP;
if (is_dir($path) == false) {
throw new Exception ('Invalid controller path: `' . $path . '`');
}
$this->path = $path;
}
private function getController(&$file, &$controller, &$action, &$args) {
$route = (empty($_GET['route'])) ? '' : $_GET['route'];
if (empty($route)) { $route = 'home'; }
// Get separate parts
$route = trim($route, '/\\');
$parts = explode('/', $route);
// Find right controller
$cmd_path = $this->path;
foreach ($parts as $part) {
$fullpath = $cmd_path . $part;
// Is there a dir with this path?
if (is_dir($fullpath)) {
$cmd_path .= $part . DIRSEP;
array_shift($parts);
continue;
}
// Find the file
if (is_file($fullpath . iext)) {
$controller = $part;
array_shift($parts);
break;
}
}
if (empty($controller)) { $controller = 'home'; };
// Get action
$action = array_shift($parts);
if (empty($action)) { $action = 'index'; }
$file = $cmd_path . $controller . iext;
$args = $parts;
}
function delegate() {
// Analyze route
$this->getController($file, $controller, $action, $args);
// File available?
$controller_name=$controller;
if (is_readable($file) == false) {
die ('404 - Controller File Not Found');
}
// Include the file
include ($file);
// Initiate the class
$class = 'Controller_' . $controller;
/// LANGUAGE
if($controller=="admin")
$name='pl';
else
$name=$_SESSION['language'];
end;
if($name=="") $name="eng";
$mfile=site_path . 'views' . DIRSEP . 'texts' . DIRSEP . $name . iext;
if (is_readable($mfile) == false) {
die ('404 - Texts File Not Found: '.$mfile);
}
include($mfile);
$text_name='Text_'.$name;
$text = new $text_name($this->registry);
$this->registry->text = $text;
////////////
if($addons)
foreach($addons as $addon){
$mfile=core_path . 'addons' . DIRSEP .$addon . iext;
if (is_readable($mfile) == false) {
die ('404 - Addon File Not Found');
}
include($mfile);
$addon_name='Addon_' . $addon;
$addon2 = new $addon_name($this->registry);
$this->registry->addon->$addon = $addon2;
}
foreach($models as $name){
$mfile=site_path . 'models' . DIRSEP . $name . iext;
if (is_readable($mfile) == false) {
die ('404 - Model File Not Found');
}
include($mfile);
$model_name='Model_' . $name;
$model = new $model_name($this->registry);
$this->registry->model->$name = $model;
}
$controller = new $class($this->registry, $models, $addons, $layout, $controller);
// Action available?
if (is_callable(array($controller, $action)) == false) {
$this->redirect('home/deadend/'.$controller_name.'/'.$action);
die ('404 - Controller Action Not Found');
}
// Run action
if(is_callable(array($controller, 'BeforeFilter')) == true)
$controller->BeforeFilter($action,$controller_name,$args,$_POST);
$controller->$action($args,$_POST);
}
function redirect($route){
header("Location: ".site_addr.$route);
}
}
?>
1 błąd 'Notice' rozwiązałem. Powiedźcie jak wiecie czy źle zrobiłem ale jestem pewien, że dobrze, skoro jest komunikat:
Notice: Use of undefined constant end - assumed 'end' in C:\xampp\htdocs\Sklep_jubilerski\core\classes\router.php on line 88
To należy w linii 88 co się znajduje: end; poprawić na: 'end';
Zapisałem zmiany i już ten błąd się nie wyświetla na stronie głównej i na stronie logowania.
Proszę o pomoc.
Wiem co znaczą niektóre z tych komunikatów ale nie wiem co trzeba w takim wypadku podjąć za kroki... aby poprawić stronę żeby działała.
Edytowane przez r3pilc3 dnia 30.07.2012 21:55:01
|
|
|