Exécution d'ordres SQL en PHP
Exécution d'ordres SQL en PHP
- Objectif : Interagir avec la base de données Oracle pour effectuer des
opérations SQL.
- Étapes principales :
- Préparer une requête SQL avec
oci_parse
.
- Exécuter la requête avec
oci_execute
.
- Récupérer les résultats avec un curseur (
oci_fetch
).
Préparer une requête SQL
- Fonction :
oci_parse
- Rôle : Prépare la requête SQL pour qu'elle puisse être exécutée.
- Prend en paramètres :
$connection
: La connexion Oracle établie.
$query
: La chaîne contenant la requête SQL.
<?php
$query = "SELECT nom FROM produit WHERE prix < 300";
$cursor = oci_parse($connection, $query);
?>
Exécuter une requête SQL
- Fonction :
oci_execute
- Rôle : Exécute la requête préparée par
oci_parse
.
- Retourne
true
en cas de succès, false
sinon.
<?php
oci_execute($cursor);
?>
Récupérer les résultats avec un curseur
- Fonction :
oci_fetch
- Rôle : Parcourt chaque ligne du résultat de la requête.
- Retourne
true
tant qu'il y a des lignes, sinon false
.
- Pour accéder aux colonnes :
- Utiliser
oci_result
avec le nom ou l'indice de la colonne.
<?php
while (oci_fetch($cursor)) {
echo oci_result($cursor, 'NOM') . "<br>";
}
?>
Métadonnées des résultats
- Utiliser
ocinumcols
pour obtenir le nombre de colonnes.
- Utiliser
ocicolumnname
pour récupérer les noms des colonnes.
<?php
$numCols = ocinumcols($cursor);
for ($i = 1; $i <= $numCols; $i++) {
echo "Colonne $i : " . ocicolumnname($cursor, $i) . "<br>";
}
?>
Sécuriser les requêtes avec des paramètres liés
- Pourquoi : Éviter les injections SQL.
- Fonction :
oci_bind_by_name
.
- Permet de lier une variable PHP à un paramètre SQL.
<?php
$query = "INSERT INTO produit (nom, prix) VALUES (:nom, :prix)";
$cursor = oci_parse($connection, $query);
oci_bind_by_name($cursor, ":nom", $nom);
oci_bind_by_name($cursor, ":prix", $prix);
oci_execute($cursor);
?>
Sécurité en PHP et SQL
- Pourquoi la sécurité est-elle essentielle ?
- Les applications web sont exposées aux attaques (par exemple : injection SQL).
- Les données sensibles doivent être protégées (mots de passe, informations utilisateur).
- Objectifs :
- Prévenir les vulnérabilités.
- Adopter des bonnes pratiques modernes en PHP et SQL.
Validation et filtrage des données utilisateur
- Risque : Les utilisateurs peuvent envoyer des données malveillantes.
- Bonne pratique : Toujours valider et filtrer les données reçues.
- Valider les types de données (entiers, emails, etc.).
- Filtrer les entrées pour supprimer les caractères dangereux.
- Fonctions PHP utiles :
filter_var
pour valider des emails ou des entiers.
htmlspecialchars
pour échapper les caractères spéciaux.
<?php
$email = $_POST['email'];
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo "Email non valide.";
} else {
echo "Email valide : " . htmlspecialchars($email);
}
?>
Prévention des injections SQL
- Risque : Les utilisateurs peuvent insérer des commandes SQL malveillantes.
- Bonne pratique : Utiliser des paramètres liés pour sécuriser les requêtes
SQL.
- Éviter la concaténation directe des entrées utilisateur dans les requêtes.
- Snippet sécurisé :
<?php
$query = "SELECT * FROM utilisateurs WHERE email = :email";
$cursor = oci_parse($connection, $query);
oci_bind_by_name($cursor, ":email", $email);
oci_execute($cursor);
?>
Stockage sécurisé des mots de passe
- Risque : Stocker des mots de passe en clair peut exposer les utilisateurs.
- Bonne pratique : Toujours hacher les mots de passe avant de les stocker.
- Utiliser des fonctions modernes comme
password_hash
et
password_verify
.
- Ne jamais stocker de mot de passe directement.
<?php
$password = "123456";
$hashedPassword = password_hash($password, PASSWORD_BCRYPT);
if (password_verify($password, $hashedPassword)) {
echo "Mot de passe valide.";
} else {
echo "Mot de passe invalide.";
}
?>
Gestion des erreurs et des exceptions
- Bonne pratique : Toujours gérer les erreurs de manière appropriée.
- Ne pas afficher les erreurs sensibles aux utilisateurs.
- Utiliser un système de journalisation pour suivre les erreurs.
<?php
try {
$connection = oci_connect('nom_utilisateur', 'mot_de_passe', 'nom_base');
if (!$connection) {
throw new Exception("Erreur de connexion : " . oci_error());
}
} catch (Exception $e) {
error_log($e->getMessage());
echo "Une erreur est survenue. Veuillez réessayer plus tard.";
}
?>