Hei,
Idea: Oman funktiokirjaston rakentaminen.
Eli haluaisin laittaa 2 funktiota erilliselle php-tiedostolle. Sitten muilla php-sivuilla kutsua funktioita esim:
<!--lisätään funktiokirjasto--> <?php include("funktiokirjasto.php"); ?> <?php // avataan tietokantayhteys connectDB(); jne.
Eli miten voisin kutsua funktiota koodissa ilman mitään include komentoja. Vai pitääkö aina sivun alussa käyttää include funktiokirjasto, kuten teen include header- footer- tiedostojen kanssa?
Alla funktio1:
<?php // funktio1: connectDB() function connectDB() { $username = "x"; $password = "x"; $host = "localhost"; $database = "x"; $con = mysql_connect("$host", "$username", "$password"); if (!$con) { die('Could not connect: ' . mysql_error()); } mysql_select_db("$database", $con); } ?>
...ja huom! ei jankkausta käytä PDO:ta. Toivottavasti joku voisi antaa idean miten vien funktiokirjasto ideaa eteenpäin. Kiitos! ..ja jaksamista raskaaseen viikkoon.
Niin siis pitäähän se tiedosto liittää mukaan, koska eihän sitä muutoin voi käyttää projektissa. Vai ymmärsinkö jotakin pahast väärin? connectDB() voisi mahdollisesti heittää virheen, mikäli yhdistäminen ei onnistu. Tuollainen epämääräinen die() ei ole välttämättä kovin tyylikäs rakenne.
Tosin PDO:n avulla onnistuisit helpommin projektissasi, joten miksi ihmeessä kartat sitä? PHP:n tekijätkään eivät suosita käyttämään mysql_ alkuisia funktioita projekteissa.
Käytä PDO:ta. Nuo vanhentuneet mysql-funktiot ovat vaarallista paskaa. Siitä on pakko muistuttaa, kun asia ei näemmä mene perille. PDO:ssa ei ole mitään pelättävää eikä siinä ole mitään opeteltavaa, joten on aivan typerää, ettet edes aio yrittää.
Autoload toimii vain luokkien kanssa. Alla esitän standardin tavan autoloadin ja luokkahierarkian hallitsemiseen PHP:ssä.
*** index.php <?php spl_autoload_register(function($class) { $file = 'src/' . str_replace('\\', DIRECTORY_SEPARATOR, $class) . '.php'; // NOTE: Ladataan tiedosto vain, jos se on olemassa. Mikäli tiedostoa ei löydy, // ei tehdä mitään, koska sovelluksessa voi olla useita autoloadereita, // joista jokin myöhemmin triggeröitävä osaa ladata luokan. if (is_file($file)) { include $file; } }); $db = \MyApp\Database::getConnection(); $foo = new \MyApp\Foo();
*** src/MyApp/Database.php <?php namespace MyApp; class Database { private $pdo; public static function getInstance() { if (!self::$instance) { self::$instance = new self(); } return self::$instance; } private function __construct() { } public function connect($user, $password, $database, $host = 'localhost') { if ($this->pdo) { return false; } try { $this->pdo = new PDO("mysql:dbname={$database};host={$host}", $user, $password); } catch (\Exception $e) { throw new \Exception("Database failure"); } } }
*** src/MyApp/Foo.php <?php namespace MyApp; class Foo { // Tänne jotain kivaa }
Kaunista koodia jälleen kerran, ei voi muuta sanoa. Olen kuullut kokeneilta koodareilta että pdo saattaa olla raskas pienissä projekteissa. Sen idea on että tietokantaa voi myöhemmin vaihtaa jos tarve. Ei kuitenkaan ole mitään syytä luopua mysql tietokannasta.
Toinen juttu on se että haluaisin tietää miksi käyttämäni tapa on väärä jos se on toiminut niin hyvin. Pdo tietenkin huippu kehittynyt ja moderni tapa hoitaa yhteys, mutta...?
Lisäys: Vielä sellaista alkemisti, että tuo miten luot konstruktorin, niin eikö se ole vanha tapa PHP4?
Lisäys:
Sen verran vielä, että mysqli, voisi olla helpommin hahmotettava koska olen tottunut tyyliin mysql. Eli kun yhdistetään tietokantaan. Pdo kyllä houkuttelee, mutta on selkeästi suurempi kokonaisuus.
Ja se vielä, olen täysin aloittelija vaikka olenkin onnistunut koodaamaan omat web-sivut ja yhden mukavasti toimivan asiakastyön.
latenleffahylly kirjoitti:
Ei kuitenkaan ole mitään syytä luopua mysql tietokannasta.
Toinen juttu on se että haluaisin tietää miksi käyttämäni tapa on väärä jos se on toiminut niin hyvin. Pdo tietenkin huippu kehittynyt ja moderni tapa hoitaa yhteys, mutta...?
Sinun kohdallasi varmasti tietoturva ja injektioilta suojautuminen ovat tärkeimpiä tekijöitä. Kurkkaa PDOStatement::bindParam().
Googlella löytyy aika hyvin juttua aiheesta btw.
PDO ei ole raskas. Se ei tee mitään ihmeellisiä asioita, joita muut tietokantarajapinnat eivät tekisi. Käyttämäsi tapa on väärä, koska mysql_-funktiot ovat vanhentuneita. Ne on suunniteltu MySQL 4:lle eivätkä tue uudempien MySQL-moottoreiden uusia ominaisuuksia. Lisäksi kyselyiden kokoaminen käsin on epävarmaa, vaikeaa ja työlästä, ja näiden seikkojen takia myös epäturvallista.
PDO ei itsessään ole riippuvainen MySQL:stä, mutta koska SQL-kieli on hieman erilainen eri moottoreiden välillä, niin joutuisit kuitenkin kirjoittamaan uudet kyselyt, jos haluat moottoria vaihtaa. Tai sitten tekemään kuten isot pojat tekevät, eli käyttämään jotain abstraktiokerrosta, jolloin riittää, kun vaihtaa kyseisen abstraktiokerroksen tietokanta-ajurin (eli SQL-kyselyiden rakentavan yksikön) toiseen.
PDO:n rajapinta ei ole yhtään sen monimutkaisempi kuin mysqli:nkään. Arvaan, että sinua ahdistaa PDO:n oliomaisuus, koska haluat väen väkisin tehdä tuollaisen tyhmän open_database()-funktion, jonka sisällä luodaan maaginen yhteys tietokantaan, joka on vain taivaan totuutena olemassa ja jonka voit toisella taikametodilla pudottaa syliisi täysin tyhjästä. Tästä päähänpinttymästä pitäisi päästä eroon, niin alkaisi helpottaa.
En ymmärrä, mitä tarkoitat "vanhanaikaisella konstruktorilla". En oikein osaa edes arvata, mihin mahdat viitata. Php4:ssä ei ollut kunnollista konstruktoria vaan sen virkaa hoiti luokan mukaan nimetty funktio. Eli jos luokan nimi oli XYZ, sillä oli funktio XYZ(), joka oli luokan konstruktori. Olio-php:ssä esiteltiin myöhemmin kahdella alaviivalla alkavat "taikametodit", joten __construct on kyllä ainoa tapa liittää olioon konstruktori nykypäivänä.
Eikö idea ole se että kutsutaan funktio luokkaa kuten SQL. Eli silloin suoritetaan se mitä luokan sisällä on..
Esim SQL-luokka avaa tietokanta yhteyden.
Luokkaa kutsutaan koodissa haeSQLLuokka();
Sitten header.php tiedostoon laitetaan include funktiokirjasto.
Funktiokirjasto.php olisi muokattavissa, esim. Salasanan vaihtaminen
En ymmärtänyt tuosta oikeastaan mitään, joten voinen turvallisesti sanoa, että ei, ei ole tarkoitus.
Mitähän tarkoitat funktioluokalla? Konstruktori on normaali funktio, jota kutsutaan automaattisesti objektin luomisen yhteydessä.
Koodin kokonaisuuden hahmottamisen vuoksi olisi hyvä pitää kaikki luokkaan liittyvät funktiot luokan sisällä. Sitä vartenhan se olio-ohjelmointi on olemassa. Jos haluat tehdä apuluokan SQL:n käyttöön, niin eikö olisi loogisempaa esim seuraavaa:
$yhteys = new Oma_SQL_Luokka(...); $yhteys->Connect(...); $yhteys->Query(...); $yhteys->Disconnect(...);
Tätä koodia on huomattavasti helpompi ymmärtää, koska kaikki tietokantaan liittyvät kyselyt viittaavat yhteen ainoaan luokkaan. Myös useamman tietokantayhteyden kanssa voit luoda yksinkertaisesti vain toisen objektin tuosta luokasta.
Mitä funktiokirjastoihin tulee, niin koko kirjaston idea on pitää yleisesti käytettävää koodia erillisessa tiedostossa, jolloin pelkkä tiedoston includettaminen uuteen projektiin riittää. Nykyisessä systeemissä joudut muokkaamaan itse kirjastoa jokaisen uuden projektin kanssa (olettaen että käytät eri tietokantatunnuksia eri projekteissa). Yritän tässä vain sanoa sitä, että ne funktion argumentit on juuri tätä varten. Fiksuinta on siis passata yhteyden luomiseen tarvittavat muuttujat funktiolle, et siis määrittele niitä funktion sisällä.
Noniin punppis, tämä selvensi jo melkoisesti. Eli nk. Kirjastossa ei olisi käyttäjänimeä, salasanaa tai tietokannan nimeä.
Paremminkin:
$database
$user
$password
Hmm.. Täytyy varmaankin palata tähän viestiketjuun, kunhan ensin käyn TAAS kerran hieman perusteita läpi.
Aihe on jo aika vanha, joten et voi enää vastata siihen.