Lucrez la un mic site in php si vreau sa extrag informatiile din baza de date in fisierul page.php. De exemplu pagina despre-noi sa se afiseze informatiile titlu si continu dar as dori sa aive si un permalink curat gen http://demosite.ro/despre-noi. Cineva care ma poate ajuta as fi recunoscator.
Momentan apare asa: http://demo.dev-zb.ro/page.php?page=despre
In fisierul page.php
Altă problemă o am cu acel or die(). Pe Google vei găsi o grămadă de explicații detaliate de ce nu-i o idee bună. Dacă chiar ții să scrii cod puțin, mai degrabă pui ceva de genul:
function showErrorPage() {
include_once('views/error.php');
die();
}
mysqli_query('...') or showErrorPage();
Este ok faptul că folosești $mysqli->real_escape_string().
Sugestii:
În loc de !empty($_POST) îți sugerez $_SERVER['REQUEST_METHOD'] === 'POST'. E mai lung, dar, teoretic, te interesează să continui procesarea doar dacă datele au fost trimise prin POST. S-ar putea ca formularul să fi fost trimis prin POST, dar fără a completa nici un câmp, caz în care $_POST este empty(). Ceea ce mă duce la punctul următor…
Nu faci nicăieri validarea datelor! $_POST s-ar putea să nu fie gol, dar s-ar putea să-ți lipsească o parte din câmpuri (poate ai apăsat <Enter> din greșeală înainte să completezi câmpul slug). Întotdeauna verifică existența și validitatea datelor (de exemplu, un câmp de email să nu fie doar prezent, ci să aibă și un format valid). După care…
Generează mesaje de eroare corespunzătoare! Dacă verifici câmpul slug, în cazul că e gol, eroarea să specifice că acel câmp este obligatoriu. Dacă nu este gol, verifică dacă nu există deja o altă pagină în baza de date cu acel slug iar, în caz contrar, generează un mesaj de eroare care să informeze utilizatorul cu privire la asta, să înțeleagă ce se întâmplă.
Din nou, abuzezi de die(). Generează mesaje de eroare informative, afișate corespunzător în pagină.
Separă HTML-ul de PHP. Câmpul $message putea foarte bine să conțină doar textul, fără tag-ul <h3> iar în HTML, unde afișezi mesajul, să ai ceva de genul
Encoding-ul este deja default UTF-8 din PHP 5.4, deci poate fi ignorat dacă folosești ceva echivalent sau mai nou
Recomand folosire formelor “lungi” ale structurilor de control (if: endif; for: endfor; while: endwhile;, etc) doar atunci când sunt folosite pentru generarea de cod HTML, pentru îmbunătățirea lizibilității
Pentru a simplifica lucrurile poți folosi o funcție ajutătoare în secțiunile de afișare
Ah, și recomandarea mea (dar asta nu-i standard și e subiect de dezbatere) este să nu folosești string interpolation, mai ales atunci când nu este vorba despre o simplă variabilă ci de o expresie, cum este în cazul tău
Daca e sa fiu carcotas, nici real_escape_string nu e sigur, fiindca poti face smecherii cu encoding-ul, rezultand intr-un SQL injection. Doar preparem statements e mai sigur, fiindca se comunica in 2 stagii, mai intai interogarea, apoi valorile, si asta face o injectare mai dificil de creat.
Deci ce-ar fi sa incepi de pe-acuma OOP @bucur si sa faci new PDO() etc.?
<?php
require_once 'bootstrap/_init.php';
$errors = array();
$data = array(
'title' => NULL,
'content' => NULL,
'slug' => NULL,
);
// dacă request-ul este de tip POST
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// sunt eliminate spațiile de la începutul și sfârșitul string-urilor
foreach ($_POST as $key => $value) {
$data[$key] = trim($value);
}
// validare titlu (5 caractere sunt doar un exemplu arbitrar)
if (strlen($data['title']) < 5) {
$errors['title'] = 'Titlul trebuie să aibă o lungime de minim 5 caractere';
}
// validare conținut
if (empty($data['content'])) {
$errors['content'] = 'Conținutul paginii nu poate fi gol';
}
// validare existență `slug`
if (empty($data['slug'])) {
$errors['slug'] = 'Câmpul "slug" este obligatoriu';
} else {
// validare unicitate slug
$result = $DB->query('SELECT `slug` FROM `pages` WHERE `slug` = "' . $DB->escape_string($data['slug']) . '" LIMIT 1');
$result or render('db-error') and exit();
if ($result->num_rows) {
$errors['slug'] = 'Există deja o pagină cu URL-ul "' . $data['slug'] . '"';
}
$result->close();
}
if (empty($errors)) {
$data = array_map($DB->escape_string, $data);
$DB->query('INSERT INTO `pages` SET
`title` = "' . $data['title'] . '",
`content` = "' . $data['content'] . '",
`slug` = "' . $data['slug'] . '"
') or render('db-error') and exit();
redirect('?success');
}
}
// toate cheile celui de-al doilea parametru vor fi disponibile ca variabile în template: $errors, $success, $data
render('add-form', array(
'errors' => $errors,
'success' => isset($_GET['success']),
'data' => $data
));
?>