Cours PHP BTS SIO - accès aux bases de données.
Réponse AJAX
Connexion à une base de données MySQL
Avant toute requête SQL, il faut que PHP soit connecté à une base de données.
Connexion au serveur de bases de données et sélection de la base de données (mysqli_connect) :
$CONNEXION = mysqli_connect ("serveur", "utilisateur", "mot de passe", "nom de la base");
Remarque : vous devez remplacer par vos propres valeurs : "serveur", "utilisateur", "mot de passe" et "nom de la base".
Connexion, sélection avec gestion d'erreur :
$CONNEXION = mysqli_connect ("serveur", "utilisateur", "mot de passe", "nom de la base") or die(mysqli_connect_error());
Accès aux bases de données MySQL en lecture
Récupération d'un jeu d'enregistrements dans une variable avec mysqli_query :
$rs_users = mysqli_query($CONNEXION, "select * from user");
Remarque : $rs_users
est une variable PHP qui contient un jeu d'enregistrements, c'est à dire
plusieurs lignes (ou une, ou zéro) de la table user. Dans notre exemple, $rs_users
contient plusieurs utilisateurs.
Affichage du jeu d'enregistrements, grâce à une boucle while
et mysqli_fetch_assoc :
while ($user = mysqli_fetch_assoc($rs_users))
{
echo $user["usr_name"]."<br>";
}
Remarques :
- mysqli_fetch_assoc : prend l'enregistrement courant pour le mettre dans la variable $user. $user ne contient donc qu'un seul utilisateur (contrairement à $rs_users).
- Quand il n'y a plus d'enregistrement, mysqli_fetch_assoc renvoie la valeur false (ce qui nous permet de terminer automatiquement
la boucle while), ce qui correspond exactement au comportement souhaité en général.
Accès aux bases de données MySQL en insertion
Exécution de la requête d'insertion :
mysqli_query($CONNEXION, "insert into nom_table values (null, 18.5, 'alpha', \"l'autre\", 1261440000, '2008-01-15', 1, 0);
- null
: sous MySQL, convient pour qu'un numéro automatique soit géré
automatiquement.
- 18.5
: les valeurs numériques sont insérable facilement. Le séparateur
de décimale est le point, et surtout pas la virgule. Si un champ
est numérique et que vous entourez la valeur par des guillemets
(simples ou doubles), cela générera une erreur.
- 'coucou'
: les valeurs de type chaîne de caractères doivent être
entourées de guillemets (simples ou doubles).
- \"l'autre\"
: Si la valeur elle-même est susceptible de contenir un guillemet
simple, il faut l'entourer de guillemets doubles, qu'on doit alors échapper
grâce à l'anti-slashe.
- '2008-01-15'
: les dates au format DATE sont entourées de guillemets, en notation
américaine (AAAA-MM-JJ)
- 1261445148
: les dates au format TIMESTAMP (nombre de secondes écoulées
depuis le 1 janvier 1970 00h00) sont des champs numériques.
- 0 et 1
: le type booléen n'existant pas sous MySQL, on le représente
généralement grâce aux valeurs 0 (pour faux),
et 1 (pour vrai). Techniquement, tous les outils (langages et SGBDR)
considèrent que 0 représente la valeur faux, et toutes
les autres valeurs numériques représentent la valeur vrai.
Votre requête ne marche pas, comment diagnostiquer l'erreur ?
- Pour être sûr que l'erreur vient de telle ou telle requête, rajouter la gestion d'erreur
or die()
:
mysqli_query($CONNEXION, "...") or die("Erreur SQL : " . mysqli_error($CONNEXION));
- Affichez la requête pour la regardez droit dans les yeux. Si vous
ne trouvez pas l'erreur visuellement, faites-en un copier/coller pour
la tester directement sous PHPMyAdmin :
$sql = "INSERT ... ";
mysqli_query($CONNEXION, $sql) or die("La requête qui foire est : $sql<br> et l'erreur est ".mysqli_error($CONNEXION));
Votre requête ne marche pas, quelles sont les erreurs les plus courantes
?
- Vous n'êtes pas connecté à la base ou n'avez pas
sélectionné la table. Le cas échéant, rajoutez
une gestion d'erreur or
die()
sur les fonction mysql_connect
et mysql_select_db.
- Dans la requête insert,
vous avez mal orthographié le nom de la table ou des champs.
- Un champ alphanumérique entouré de quote contient une
quote : values ('l'autre').
- Un champ alphanumérique entouré de guillemets contient
un guillemet : values
("pas de "tchi-tchi" en cours"). Protégez
vos valeurs avec addslashes,
qui échappe automatiquement les guillemets.
- Un champ ne contient pas de valeur : values
(1, ,2).
- Le nombre de valeurs insérées ne correspond pas au nombre
de champs.
- Non respect de l'intégrité de la base, par exemple doublon
dans la clé primaire.
- Vous essayez d'insérer une date sans guillemets : values
(2008-01-15).
Quelques insertions fréquentes et délicates :
- $ma_variable
de type chaîne de caractères est susceptible de contenir
des guillemets, comment faire ?
mysqli_myquery("insert
into ma_table
values ('".addslashes($ma_variable)."')");
- $ma_variable
est de type booléen, comment l'insérer dans un champ booléen/numérique
(voir doc sur l'opérateur ?:)?
mysqli_myquery("insert
into ma_table
values (".($ma_variable?1:0).")");
- Comment insérer la date courante dans un champ de type TIMESTAMP
?
mysqli_myquery("insert
into ma_table
values (".time().")");
- Comment insérer la date courante dans un champ de type DATE
?
mysqli_myquery("insert
into ma_table
values ('".date("Y-m-d", time())."')");
Page canevas-type pour ajout/edition/suppression
Gestion des clients<br>
<?php
mysql_connect("127.0.0.1", "root", "abcd");
mysql_select_db("spastore_db");
// Traitement de la suppression d'un client
if (isset($_GET["supp"]))
mysqli_myquery("DELETE from ma_table where client_id = {$_GET["supp"]};");
// Traitement du formulaire d'édition et d'ajout
if (isset($_POST["form_nom"]))
{
$nom = $_POST["form_nom"];
$mel = $_POST["form_mel"];
$id = $_POST["form_id"];
if ($id)
$sql = "UPDATE ma_table SET client_nom = '$nom', client_mel = '$mel'
WHERE client_id = $id;";
else
$sql = "INSERT INTO ma_table VALUES(null, '$nom', '$mel')";
mysqli_myquery($sql) or die("Erreur n".mysql_errno()." dans la requte $sql :<br>".mysql_error());
}
// Formulaire unifié d'édition (d'un client existant) et d'ajout (d'un nouveau client)
if (isset($_GET["edit"]))
{
if ($_GET["edit"])
{
$client_edit = mysqli_fetch_array(mysqli_myquery("select * from ma_table where client_id = {$_GET["edit"]}"));
$nom = $client_edit["client_nom"];
$mel = $client_edit["client_mel"];
$id = $_GET["edit"];
$message_bouton = "Modifier";
}
else
{
$nom = "";
$mel= "";
$id= "0";
$message_bouton = "Ajouter";
}
echo "<form action={$_SERVER["PHP_SELF"]} method=post>";
echo "nom : <input type=text name=form_nom value='$nom'><br>";
echo "ml : <input type=text name=form_mel value='$mel'><br>";
echo "<input type=hidden name=form_id value=$id>";
echo "<input type=submit value=$message_bouton>";
echo "</form>";
}
// affichage du contenu de la table
$rs_clients = mysqli_myquery("select * from ma_table;");
while ($client = mysqli_fetch_array($rs_clients))
{
echo "{$client["client_nom"]} {$client["client_mel"]} ";
echo "<a href='?supp={$client["client_id"]}'>supprimer</a> ";
echo "<a href='?edit={$client["client_id"]}'>editer</a><br>";
}
echo "<a href='?edit=0'>Ajouter</a><br>";
?>