Salut tuturor, astazi o sa va prezint o modalitate prin care va puteti instala scripturile in mod automat folosind o interfata web, fara a fi nevoiti sa modificati fisiere din interiorul aplicatiei.Ideea este simpla, vom folosi un fisier JSON pentru a citi si a scrie datele necesare instalarii scriptului.
JSON sau Javascript Object Notation este un format foarte simplu pentru a lucra cu datele.
Vom incepe prin crearea folderului tutorial
, in interiorul acestui folder vom crea fisierele index.php
si install.php
.De asemenea, vom crea folderul includes,
in interiorul acestui folder vom crea fisierul connect.php
.Mai mult decat atat, vom mai crea folderul config
, acest folder va stoca fisierele ce tin setarile de configurare ale aplicatiei, vom adauga in curand, aici, fisierul database.json
.
Sa adaugam codul necesar in fisierul connect.php
<?php
// ne asigura ca PHP emite si afiseaza toate erorile
error_reporting(E_ALL);
ini_set('display_errors, 1);
// locatia fisierului database.json
$databaseFile = __DIR__ . '/../config/database.json';
// verificam daca fisierul exista, initial acesta nu exista
if (file_exists($databaseFile)) {
// preluam continutul fisierului sub forma de string
$db = file_get_contents($databaseFile);
// continutul fisierului va avea formatul JSON
// folosind json_decode() modificam formatul in array
$db = json_decode($db, true);
// incercam sa ne conectam la baza de date
try {
$conn = new PDO("mysql:host={$db['hostname']};dbname={$db['dbname']}", $db['username'], $db['password']);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
$conn = null;
}
} else {
// fisierul nu exista, variabila $conn are valoarea null
$conn = null;
}
Sa oferim niste explicatii in legatura cu ceea ce am scris mai sus.In primul rand, avem nevoie de locatia fisierului database.json
.In functie de rezultatul verificarii existentei acestui fisier, la locatia oferita, folosind functia file_exists()
, vom stii daca ne putem conecta sau nu la baza de date.Daca fisierul exista ( initial acesta nu exista ), in primul rand, trebuie sa preluam continutul acestui fisier folosind functia file_get_contents()
, acesta functie va returna continutul sub forma de string, momentan avand formatul JSON.
Mai departe, vrem sa schimbam acest format astfel incat sa putem lucra mai usor cu datele necesare.Folosind functia json_decode()
, putem face acest lucru.Primul parametru al acestei functii reprezinta datele in format JSON, urmatorul parametru ii spune functiei daca dorim ca datele sa fie transformate intr-un array, ceea ce si dorm.
Evident, incercam sa ne conectam la baza de date, insa daca ceva nu este bine, am setat valoarea null
pentru variabila $conn
.De ce am facut acest lucru? Ei bine, in functie de valoarea acestei variabile, noi vom stii daca scriptul a fost instalat sau nu.Daca fisierul nu exista, evident, acesta variabila are valoarea null
.
Sa adaugam codul necesar in fisierul index.php
<?php
// ne asigura ca PHP emite si afiseaza toate erorile
error_reporting(E_ALL);
ini_set('display_errors', 1);
// includem fisierul ce ofera conexiunea cu baza de date
require_once __DIR__ . '/includes/connect.php';
// daca scriptul nu a fost instalat
// daca aplicatia nu s-a putut conecta la baza de date
// facem redirect catre fisierul de install
if (!isset($conn)) {
header("Location: install.php");
exit;
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Welcome here</title>
</head>
<body>
<h1>Welcome to my website!</h1>
</body>
</html>
Dupa cum putem observa, putem face acesta verificare in toate fisierele publice, ceea ce inseamna ca scriptul nu va putea fi folosit daca nu este instalat, astfel se face redirect catre fisierul install.php
.
Sa adaugam codul necesar in fisierul install.php
.
<?php
// ne asigura ca PHP emite si afiseaza toate erorile
error_reporting(E_ALL);
ini_set('display_errors', 1);
session_start();
// includem fisierul ce ofera conexiunea cu baza de date
require_once __DIR__ . '/includes/connect.php';
// daca scriptul a fost instalat
// daca conexiunea cu baza de date este facuta
// facem redirect in index.php
if (isset($conn)) {
header("Location: index.php");
exit;
}
// verificam daca o cerere folosind metoda POST a fost trimisa catre server
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// verificam existenta datelor
if (empty($_POST['hostname']) || empty($_POST['username']) || empty($_POST['password']) || empty($_POST['dbname'])) {
$_SESSION['alert']['danger'] = 'Please fill all the required filelds!';
header("Location: install.php");
exit;
}
// salvam datele in variabile
$hostname = $_POST['hostname'];
$username = $_POST['username'];
$password = $_POST['password'];
$dbname = $_POST['dbname'];
// cream o matrice cu datele necesare
$db = [
'hostname' => $hostname,
'username' => $username,
'password' => $password,
'dbname' => $dbname,
];
// transforma matricea in format JSON
$db = json_encode($db);
// scriem datele in fisierul database.json
file_put_contents($databaseFile, $db);
facem redirect catre index.php
header("Location: index.php");
exit;
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Script Installation</title>
</head>
<body>
<h1>Script Installation</h1>
<?php if (isset($_SESSION['alert']['danger'])): ?>
<p>
<?php echo $_SESSION['alert']['danger'];?>
</p>
<?php endif; ?>
<form action="install.php" method="POST">
<p>
<label for="hostname">Hostname</label>
<input type="text" name="hostname" placeholder="Hostname..">
</p>
<p>
<label for="username">Username</label>
<input type="text" name="username" placeholder="Username..">
</p>
<p>
<label for="password">Password</label>
<input type="password" name="password" placeholder="Your password..">
</p>
<p>
<label for="dbname">Database Name</label>
<input type="text" name="dbname" placeholder="Database Name..">
</p>
<button type="submit">Install</button>
</form>
</body>
</html>
<?php
if (isset($_SESSION['alert'])) {
unset($_SESSION['alert']);
}
Sa oferim niste explicatii, in primul rand, eu folosesc mecanismul de sesiuni pentru stocarea si afisarea mesajelor ce apar in urma validarii formularelor.
Aceste randuri de cod sunt foarte imporatante, daca variabila $conn
, exista si are o alta valoare decat null
, ceea ce inseamna ca exista conexiunea cu baza de date, nu dorim ca utilizatorii sa acceseze acest fisier, scriptul a fost instalat deja.
if (isset($conn)) {
header("Location: index.php");
exit;
}
In continuare, verificam daca a fost trimisa o cerere folosind metoda POST, cu alte cuvinte, daca formularul a fost completat, nimic complicat.Mai departe, verificam existenta datelor, de asemenea, nimic complicat.Salvam aceste date in niste variabile astfel incat sa lucram mai usor cu ele.Mai mult decat atat, salvam aceste date intr-o matrice, de ce facem acest lucru? Vrem sa transformam acesta matrice in format JSON, dupa cum am vazut, putem face aceasta trecere, JSON -> Array sau Array -> JSON.
Folosind functia json_encode()
facem aceasta transformare.Mai departe, trebuie sa scriem aceste date in fisierul database.json
.Daca fisierul exista sau nu exista, functia file_put_contents()
il va crea sau ii va rescrie continutul.
In final, facem rediect catre index.php.
Formatul fisierului database.json
este de forma:
{"hostname":"localhost","username":"root","password":"root","dbname":"tutorial"}
Cam atat cu acest articol, foarte simplu, asa cum am spus, insa nu recomand folosirea acestui cod in productie, evident, puteti face totul mult mai bine, eu am oferit doar o idee.