WebPillangó főoldal
Oldalak: 1 ... 24 25 [26] 27 28 29   Le
  Nyomtatás  
Szerző Téma: PHP  (Megtekintve 229212 alkalommal)
Tas
Új tag
*
Nem elérhető Nem elérhető

Hozzászólások: 35


« Válasz #500 Dátum: 2010. 11. 08. - 16:13:59 »

A hiba az escapeString függvényben van. A myconn az nem objektum, gondolom, hanem egy változó az osztályon belül.
Naplózva
spier
Tag
**
Nem elérhető Nem elérhető

Hozzászólások: 125


« Válasz #501 Dátum: 2010. 11. 08. - 16:25:05 »

Igen, változó.
Elvileg a mysqli miatt így kell megadni oo-ban, és érdekes, hogy máshol is használom adatbázis lekérésnél ahol "eszképelem" a beérkező adatokat esetlegesen és sehol nem ír hibát kizárólag ezen az egy helyen.
Itt a mysqli kapcsolat, nem változott különösebben az előzőhöz képest.
Kód:
<?php if (!defined('DIRECT_ACCESS')) die('Restricted access');

class 
Database
{
    private 
$db_host  ''; // Database Host
    
private $db_user  ''; // Username
    
private $db_pass  ''; // Password
    
private $db_name  ''; // Database
    
private $db_char 'utf8'; // Default query character set is utf8

    
private $con  FALSE; // Checks to see if the connection is active
private $err  FALSE; // Default error messages is Error
    
private $myconn  FALSE;
private $result  = array(); // Results that are returned from the query

private static $instance NULL;

/**
 * Prevent constructing of Database
 */
private function __construct() {}

/**
 * Prevent cloning of Database
 */
private function __clone() {}

/**
 * Destructing the Database
 */
public function __destruct()
{
if ($this->con)
{
$this->Disconnect();
}
}

/**
     * Set the database connection character set
 *
 * @param string $db_char
     */
public function setCharset($db_char)
{
$this->db_char $db_char;
}

/**
     * Set the database connection paramaters
 *
 * @param string $db_host
 * @param string $db_user
 * @param string $db_pass
 * @param string $db_name
     */
public function setConnection($db_host$db_user$db_pass$db_name)
{
if (empty($db_host) || empty($db_user) || empty($db_pass) || empty($db_name))
{
die ('Cannot continue, login details not filled out!');
}

$this->db_host $db_host;
$this->db_user $db_user;
$this->db_pass $db_pass;
$this->db_name $db_name;
}

/**
     * Connects to the database,
     * only one connection allowed
     */
    
private function Connect()
{
        if (!
$this->con)
{
$this->myconn = new mysqli($this->db_host$this->db_user$this->db_pass$this->db_name);

if (!mysqli_connect_error())
{
$this->con TRUE;
$this->myconn->query("set names {$this->db_char}");
$this->myconn->query("set character set {$this->db_char}");
return TRUE;
}
else
{
$this->con FALSE;
                
$this->setError(mysqli_connect_error(), mysqli_connect_errno());
return FALSE;
}
}
else
{
return FALSE;
}
    }

    
/**
     * Executes query
 *
 * @param string $qstring
     */
public function Query($qstring)
{
if (!$this->con)
{
$this->Connect();
}

$q $this->myconn->query($qstring) or $this->setError($this->myconn->error$this->myconn->errno);
return $q;
}

    
/**
     * Changes the new database,
     * sets all current results to NULL
 *
 * @param string $name
     */
    
public function setDatabase($name)
{
        if (
$this->con)
{
            if (
$this->myconn->close())
{
                
$this->con FALSE;
                
$this->result NULL;
                
$this->db_name $name;
                
$this->Connect();
            }
        }
    }

    
/**
     * Checks to see if the table exists
     * when performing queries
 *
 * @param string $table
     */
    
private function tableExists($table)
{
        
$tables_in_db $this->myconn->query("SHOW TABLES FROM '" $this->db_name "' LIKE '" $table "'");

        if (
$tables_in_db)
{
            if (
$this->numRows($tables_in_db)==1)
{
                return 
TRUE;
            }
else
{
                return 
FALSE;
            }
        }
    }

/**
 * Simple method to count number of rows in a table.
 *
 * @param string $table_name
 * @param string $column
 */
public function countRows($table_name$column FALSE)
{
// Check what to count
if (empty($column))
{
$column '*';
}

// Count all rows
$result $this->myconn->query("SELECT '" $column "' FROM '" $table_name "'");
$num_rows $this->numRows($result);
// Display the results
return $num_rows;
}

    
/**
     * SQL fetch array query
 *
 * @param string $query_array
     */
public function fetchArray($query_array)
{
if ($query_array)
{
return @mysqli_fetch_array($query_array);
}
}

    
/**
     * SQL fetch assoc query
 *
 * @param string $query_assoc
     */
public function fetchAssoc($query_assoc)
{
if ($query_assoc)
{
return @mysqli_fetch_assoc($query_assoc);
}
}

    
/**
     * SQL fetch row query
 *
 * @param string $query_row
     */
public function fetchRow($query_row)
{
if ($query_row)
{
return @mysqli_fetch_row($query_row);
}
}

    
/**
     * SQL fetch object query
 *
 * @param string $query_object
     */
public function fetchObject($query_object)
{
if ($query_object)
{
return @mysqli_fetch_object($query_object);
}
}

    
/**
     * SQL num rows query
 *
 * @param string $query_rows
     */
public function numRows($query_rows)
{
if ($query_rows)
{
$row_no = @mysqli_num_rows($query_rows);
return $row_no;
}
}

public function lastID()
{
return $this->myconn->insert_id;
}

    
/**
     * Get result
 *
 * @param string $query_result
     */
public function freeResult($query_result)
{
if ($query_result)
{
@mysqli_free_result($query_result);
return TRUE;
}
}

    
/**
     * Returns the result set
     */
    
public function getResult()
{
        return 
$this->result;
    }

    
/**
 * Sanitizes value for safe execution in SQL query
 *
 * @param string $value
     */
public function escapeString($value)
{
if (get_magic_quotes_gpc())
{
$value stripslashes($value);
}
return $this->myconn->real_escape_string($value);
}

    
/**
     * Filter a value for display (XSS)
 *
 * @param string $unsafe_value
     */
    
public function filterForXss($unsafe_value)
    {
        if (
phpversion() >= "5.2.0")
{
            return 
filter_var($unsafe_valueFILTER_SANITIZE_STRING);
        }
else
{
            return 
htmlentities(strip_tags($unsafe_value));
}
    }

    
/**
     * Show error messages (TRUE or FALSE)
 *
 * @param string $option
     */
public function showError($option)
{
if ($option)
{
$this->err $option;
}
}

    
/**
     * Disconnect the connection
     */
public function Disconnect()
{
if ($this->con)
{
if ($this->myconn->close())
{
$this->con FALSE;
return TRUE;
}
else
{
return FALSE;
}
}
}

/**
 * Checks for errors
 *
 * @param string $mysqli_error
 * @param string $mysqli_errno
 */
protected function setError($mysqli_error ''$mysqli_errno '')
{
if ($this->con)
{
$this->Disconnect();
}

if ($this->err)
{
die ('Description: ' $mysqli_error '<br />Error Number: ' $mysqli_errno);
}
else
{
die ('Error');
}
}

/**
 * Creates and references the Database object
 */
public static function getInstance()
{
if (self::$instance == NULL)
{
self::$instance = new Database();
return self::$instance;
}
}
}

/* End of file Mysqli.php */
/* Location: ./libraries/Mysqli.php */

Naplózva
Tas
Új tag
*
Nem elérhető Nem elérhető

Hozzászólások: 35


« Válasz #502 Dátum: 2010. 11. 08. - 18:43:59 »

Oké, értem. Annyit segítek, hogy az escapeString függvényedben nézd meg a myconn típusát (getType()) és biztos rá fogsz jönni Kacsint
Naplózva
spier
Tag
**
Nem elérhető Nem elérhető

Hozzászólások: 125


« Válasz #503 Dátum: 2010. 11. 08. - 23:05:33 »

Aham, alakul.
A myconn boolean-t ad vissza és akkor elvileg az FALSE valamiért, nem pedig a "kapcsolati link".
Gondolom string-nek kellene lennie ha jó lenne a dolog ott.

De ettől függetlenül is x-akták nekem, hogy más helyen miért működik minden. Itt is megy a query is ami szintén a myconn-t használja, megnéztem kismillió mysqli-s példát mindenhol így építik fel az escape-et.  Hááát

A fő gond talán az, hogy máshol jónak vélem és a példákban is így adják meg, nem jó helyen keresem a hibát, leragadtam valahol.
Asszem még trónolnom kell rajta.
Lehet újra kellene gondolni a Database osztályt, alapvető bajok lehetnek, ez a mysqli-s dolog nagyon bezavart.

10 perccel később:
Módosítottam így a kódot:
Kód:
   /**
* Sanitizes value for safe execution in SQL query
*
* @param string $value
     */
public function escapeString($value)
{
if (!$this->con)
{
$this->Connect();
}

if (get_magic_quotes_gpc())
{
$value = stripslashes($value);
}
return $this->myconn->real_escape_string($value);
}

Működik így, tehát akkor a hiba lényegi oka megvan, de még az mindig ködös miért FALSE a myconn-om. Elvileg az osztályon belül elérhető bárhonnan, nem?

Még 5 perccel később:
Tehát akkor attól függetlenül, hogy példányosítottam az osztályom és beadtam neki a kapcsolathoz szükséges adatokat még nem csatlakoztam hozzá, az elősszür a Query végzi el ami ha nem lát élő kapcsolatot ($this->conn ugyebár FALSE) akkor kapcsolódik.
Valószínűleg akkor máshol azért jó mert már Query-t használtam és csak utána jött valahol az escapeString, de akkor már élt a kapcsolat és nem FALSE volt.

Nos, jól silabizálok?...  Mosolyog
« Utoljára szerkesztve: 2010. 11. 08. - 23:29:07 írta spier » Naplózva
Tas
Új tag
*
Nem elérhető Nem elérhető

Hozzászólások: 35


« Válasz #504 Dátum: 2010. 11. 09. - 00:24:38 »

Megy ez neked, pontosan az történt Mosolyog. Amúgy a myconn-nak object-típusúnak kell lennie, miután megvolt a példányosítás a  Connectben. Érdemes figyelni a fordító hibákra, az is azt mondta, hogy tagfüggvényt akarsz hívni egy nem-objektumon Kacsint
Naplózva
spier
Tag
**
Nem elérhető Nem elérhető

Hozzászólások: 125


« Válasz #505 Dátum: 2010. 11. 09. - 00:27:31 »

Értem, köszönöm a segítséget!
Naplózva
Tupacko
WebPillangó

Adminisztrátor
Törzstag
*****
Nem elérhető Nem elérhető

Hozzászólások: 966


WWW
« Válasz #506 Dátum: 2010. 11. 10. - 21:59:11 »

Gratulalok, hogy sikerult megoldani Mosolyog
Naplózva
spier
Tag
**
Nem elérhető Nem elérhető

Hozzászólások: 125


« Válasz #507 Dátum: 2010. 12. 31. - 15:00:56 »

Ha esetleg erre tévedne valaki Mosolyog

Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in

értem mit ír, csak értelmezni nem tudom.
Jó a lekérdezés, tanácstalan vagyok. esetleg az adatbázisban lehet valami...

itt a lekérdezés is:
Kód:
    $rTipus=mysql_query("select * from termek_fotipus where statusz='1' order by sorszam");
        while ( $FotipusSor=mysql_fetch_array($rTipus) ){ kiíratunk.... }

Nem én írtam ezt, olyan amilyen de elvileg mennie kellene.
Naplózva
Tas
Új tag
*
Nem elérhető Nem elérhető

Hozzászólások: 35


« Válasz #508 Dátum: 2011. 01. 01. - 18:25:27 »

B.ú.é.k. Menő

Nézd meg az $rTipus típusát (getType). Valószínűleg boolean lesz, mint azt az üzenet is írja. Szerintem a mezőnevek nem azonosak az adatbázisban lévőkkel.

Naplózva
spier
Tag
**
Nem elérhető Nem elérhető

Hozzászólások: 125


« Válasz #509 Dátum: 2011. 01. 01. - 19:57:16 »

Boldog Új Évet!
Köszönöm, átnézem erről az oldalról a dolgot.
Naplózva
spier
Tag
**
Nem elérhető Nem elérhető

Hozzászólások: 125


« Válasz #510 Dátum: 2011. 01. 03. - 18:44:15 »

Igen Tas, nem egyeztek a mezőnevek, rossz táblát töltöttem fel.  He
Naplózva
Tas
Új tag
*
Nem elérhető Nem elérhető

Hozzászólások: 35


« Válasz #511 Dátum: 2011. 01. 04. - 15:25:44 »

Előfordul az ilyen Vigyorog
Naplózva
Tupacko
WebPillangó

Adminisztrátor
Törzstag
*****
Nem elérhető Nem elérhető

Hozzászólások: 966


WWW
« Válasz #512 Dátum: 2011. 01. 04. - 20:38:21 »

BUEK! Fo, hogy megoldodott a gond Mosolyog
Naplózva
spier
Tag
**
Nem elérhető Nem elérhető

Hozzászólások: 125


« Válasz #513 Dátum: 2011. 01. 08. - 18:01:59 »

Kérnék egy kis segítséget vagy inkább véleményezést, egy megvalósított dologhoz.
Úgy gondoltam csinálok egy System osztályt, ezt példányosítom és ebbe töltöm be a különböző osztályokat. Itt példányosítom az adatbázis osztályt és minden mást is szinte. Ezt a System osztályt pedig ugyebár példányosítom így minden elérhető rajta keresztül, ebbe beletettem még különböző funkciókat amit ebből szeretnék elérni majd vagy kiemelt prioritású.

Mivel a System vezérelget így a többi osztályban ha adatbázist vagy bármi az osztályban lévő dolgot akarok elérni akkor csak - esetemben pl. - System::$db->Query.... System::$db->Disconnect();...  stb. stb.

Így egyszerűbbnek tűnt a dolog, de lehet rosszul gondolom. természetesen mindent példányosítok és védek amit lehet.
Nagyon sok felesleges kódtól és megoldástól megkímélem magam így a frontend motornál.

Ez így jó megoldásnak tűnik? Működni jól működik...
Naplózva
Tupacko
WebPillangó

Adminisztrátor
Törzstag
*****
Nem elérhető Nem elérhető

Hozzászólások: 966


WWW
« Válasz #514 Dátum: 2011. 01. 08. - 18:41:49 »

Tokeletes egyetertes sosem lesz arrol, hogy erdemes/elonyos vagy sem ilyen komplex tudasu osztalyokat hasznalni vagy sem. Van aki azt mondja, hogy jo a Facade (http://en.wikipedia.org/wiki/Facade_pattern) design pattern, van aki helytelennek tartja. Arra kell gondolni, hogy nem minden esetben jo egy ekkora meretu osztalyt betolts, amikor csak bizonyos reszeit hasznalod, hanem abban az esetben a vegso cel osztalyokat erdemes peldanyositani (kimeled a memoriat, es gyorsabban is fog futni az alkalmazas, mivel a cel osztallyal direktbe kommunikalsz). Ugyanakkor, erdemes a Facade osztalyok alkalmazasa, amennyiben egyszerusiteni szeretned a sok-sok osztaly/csomag kezeleset.

!!! Amire kifejezetten figyelmet fektetnek, hogy az alatta levo osztalyokat csak akkor peldanyositanam, amikor azokra szukseg van (lazy instantiation, http://en.wikipedia.org/wiki/Lazy_initialization).
    Peldaul: ha a Facade osztaly beolvas harom A, B es C osztalyt, akkor amikor a Facade peldanyositodik, akkor nem hoz letre a konstruktor A, B es C peldanyokat. Amikor egy olyan metodust akarok elerni, amit az A tartalmaz, akkor megnezem, ha mar van A peldanyom, ellenkezo esetben letre hozom. Sok memoriat es folosleges processzor idot sporolsz meg ezzel a modszerrel!
Naplózva
spier
Tag
**
Nem elérhető Nem elérhető

Hozzászólások: 125


« Válasz #515 Dátum: 2011. 01. 08. - 19:29:12 »

Értem, köszönöm.
Akkor megmaradok ennél a megoldásnál, ez nagyon jól fekszik számomra, ez is előny, illetve elég áttekinthető is a vezérlési szerkezet.
Viszont akkor figyelek mikor mi kerüljön be, lényegében azokat példányosítottam benne már most is amit első használatkor/betöltéskor kellenek. Adatbázis, ami az oldalakat vagy híreket kezeli osztály, a session-t, login cuccokat. A többit akkor ha szükséges vagy külön a szokásos módon a megfelelő helyen és futásnál, ezeket úgy is tudom majd menet közben, hogy lesz szükség dolgokra.

Áttanulmányozom a linkeket, köszönöm.
Igazából egy egységes vezérlést szeretnék így megoldani ami mindenhol azonos lehet, biztonságosabbnak is tűnik, több helyen védett, mindig a jól megszokott dolgokat alkalmazom. Illetve egy kicsit modulárisabbra tervezném, talán az előny lehet kiegészítésnél vagy ha valami nem kell bele, de ezt már az osztályok akkor elvileg nagyjából prezentálják is csak jól el kell helyeznem.
Ha jól gondolkozok...

Köszönöm.
Üdv.
Naplózva
spier
Tag
**
Nem elérhető Nem elérhető

Hozzászólások: 125


« Válasz #516 Dátum: 2011. 01. 21. - 13:50:27 »

Üdv.

Elképzelhető inkább a mod_rewrite kategóriába tartozna a kérdésem de elég feles a dolog így ide írom, hátha tud valaki segíteni vagy inkább megmutatni az irányt vagy megmondani ahogy megcsináltam és működik is az jó-e.

Tehát a weblapnál úgy gondoltam az azonos tartalmú oldalakat, - mondjuk csak szöveges tartalom - egy fájl végzi a megjelenítést. Esetemben és általában ahogy ez szokott is az index.php. Tehát ha lekérek egy ilyen oldalt akkor index.php?page=index, index.php?page=kapcsolat stb.
De ezt mond_rewrite-al csináltam meg így tudok létrehozni admin-ban új lapot és az már egyből "szép url-es" lesz.
Mivel itt az id alapú megkülönböztetést nem tudom használni úgy gondoltam az oldal nevéből előállítok egy alias-t és azt elmentem adatbázisban. Ez alapján lesz a megkülönbözettés és ezt kapja a mod_rewrite is, így kapok egy kellemes url-t és nem utólsó sorban védem a feldolgozó lapot is.

A .htaccess kódom a következő:
Kód:
RewriteRule ^([^/\.]+)/?$ /index.php?page=$1 [L]

Tehát megkapja a page változót ami a link vagy menüpont és azt feldolgozza a,
Kód:
$p = isset($_GET['page']) ? $_GET['page'] : 'index';
System::$page->getPages($p);

kódrészlet ami ha van $_GET['page'] akkor továbbviszi azt ha nincs akkor alap a nyitólap azaz az index jelzésű.
Továbbiakban már csak az osztályba beadom a kapott aliast ami a link és az alapján lekéri a kívánt oldalt ha talál egyezőséget ha nem talál akkor 404.

Nem tudom így szokták-e megoldani, nem találtam hasonló mintát így csak találomra készítettem, de jól működik a dolog.
Előre is köszönöm az építő jellegű kritikát és hozzászólást, segítséget!

Üdv.
Naplózva
Tupacko
WebPillangó

Adminisztrátor
Törzstag
*****
Nem elérhető Nem elérhető

Hozzászólások: 966


WWW
« Válasz #517 Dátum: 2011. 01. 25. - 19:27:01 »

Szia!

Nagyon jol van megoldva, hasonlo a Drupal es a Wordpress megoldasa is. Esetleg nezd meg a WP es Drupal alap megoldasait Mosolyog

Udv,
Tupacko
Naplózva
spier
Tag
**
Nem elérhető Nem elérhető

Hozzászólások: 125


« Válasz #518 Dátum: 2011. 02. 07. - 22:22:37 »

Helló,

nem egyértelmű milyen kategóriába tartozna kérdésem de valami php gond lehet.
Használok egy login-t az admin beléptetésére az admin felületre.
Számomra teljesen érthetetlen a dolog, nem tudom mit kellene csinálnom de a következő a hiba:
Firefox, Chrome stb. böngészőkkel hibátlanul belép és minden egyéb dolgot tudok használni ami az admin-ban van.
IE6-al nagy nehezen, minden post vagy get kérésnél üres oldalt hoz először azt lefrissítem és akkor behozza rendesen a kért oldalt vagy elvégzi a kért műveletet. IE7 és IE8 már a loginra sem képes, adatokat hiányol.
Érthetetlen teljesen.

A másik, hogy a rewrite_rule-os dolgokat az IE6 nem kezeli, egyszerűen nem lép át másik oldalra. Nem láttam még ilyet, minden mással tökéletes.

Ez normális dolog? Mit lehet ilyenkor tenni? IE6 már nem nagyon izgat de, hogy IE7 és IE8al nem loginol meg semmi.

Ötlet? Másoljak forrást?
Előre is köszönöm a segítséget.
Naplózva
Tas
Új tag
*
Nem elérhető Nem elérhető

Hozzászólások: 35


« Válasz #519 Dátum: 2011. 02. 08. - 13:03:24 »

Én kérnék forrást Vigyorog
Naplózva
Oldalak: 1 ... 24 25 [26] 27 28 29   Fel
  Nyomtatás  
 
Ugrás: