par
moogli » 14 mai 2013, 23:00
salut,
Ton code n'effectue qu'une seule requête d'insertion il faut mettre le mysql_query dans le while de traitement du select id from techniques.
ensuite je te conseil de créer une procédure stockée pour faire cela.
le code d'insertion doit ce trouver dans la partie de validation du formulaire.
Pour faire bien utilise l'extension
mysqli plutôt que l'extension mysql.
Tu utilise mal la balise th, celle ci ne s'utilise que dans un thead !
je corrigerais ton code ainsi
<?php
// require_once('../Connections/mysqlConnection.php');
$link = mysqli_connect('loclahost', 'user', 'passwd', 'nom de la base');
if (!isset($_SESSION)) {
session_start();
}
$MM_autdorizedUsers = "super";
$MM_donotCheckaccess = "false";
/**
* Permet d'afficher une erreur sql proprement
* @param $link
*/
function erreurSQL($link) {
echo '<p class="sqlerror" Erreur SQL : <br />';
echo mysqli_error($link);
echo '</p>';
}
// *** Restrict Access To Page: Grant or deny access to tdis page
function isAutdorized($strUsers, $strGroups, $UserName, $UserGroup) {
// For security, start by assuming tde visitor is NOT autdorized.
$isValid = False;
// When a visitor has logged into tdis site, tde Session variable MM_Username set equal to tdeir username.
// tderefore, we know tdat a user is NOT logged in if tdat Session variable is blank.
if (!empty($UserName)) {
// Besides being logged in, you may restrict access to only certain users based on an ID established when tdey login.
// Parse tde strings into arrays.
$arrUsers = Explode(",", $strUsers);
$arrGroups = Explode(",", $strGroups);
if (in_array($UserName, $arrUsers)) {
$isValid = true;
}
// Or, you may restrict access to only certain users based on tdeir username.
if (in_array($UserGroup, $arrGroups)) {
$isValid = true;
}
if (($strUsers == "") && false) {
$isValid = true;
}
}
return $isValid;
}
$MM_restrictGoTo = "index.php";
if (!((isset($_SESSION['MM_Username'])) && (isAutdorized("", $MM_autdorizedUsers, $_SESSION['MM_Username'], $_SESSION['MM_UserGroup'])))) {
$MM_qsChar = "?";
$MM_referrer = $_SERVER['PHP_SELF'];
if (strpos($MM_restrictGoTo, "?")) {
$MM_qsChar = "&";
}
if (isset($_SERVER['QUERY_STRING']) && strlen($_SERVER['QUERY_STRING']) > 0) {
$MM_referrer .= "?" . $_SERVER['QUERY_STRING'];
}
$MM_restrictGoTo = $MM_restrictGoTo . $MM_qsChar . "accesscheck=" . urlencode($MM_referrer);
header("Location: " . $MM_restrictGoTo);
exit;
}
if (!function_exists("GetSQLValueString")) {
function GetSQLValueString($dbLink, $tdeValue, $tdeType, $tdeDefinedValue = "", $tdeNotDefinedValue = "") {
if (PHP_VERSION < 6) {
$tdeValue = get_magic_quotes_gpc() ? stripslashes($tdeValue) : $tdeValue;
}
$tdeValue = function_exists("mysql_real_escape_string") ? mysqli_real_escape_string($dbLink, $tdeValue) :
mysqli_real_escape_string($dbLink, $tdeValue);
switch ($tdeType) {
case "text":
$tdeValue = ($tdeValue != "") ? "'" . $tdeValue . "'" : "NULL";
break;
case "long":
case "int":
$tdeValue = ($tdeValue != "") ? intval($tdeValue) : "NULL";
break;
case "double":
$tdeValue = ($tdeValue != "") ? doubleval($tdeValue) : "NULL";
break;
case "date":
$tdeValue = ($tdeValue != "") ? "'" . $tdeValue . "'" : "NULL";
break;
case "defined":
$tdeValue = ($tdeValue != "") ? $tdeDefinedValue : $tdeNotDefinedValue;
break;
}
return $tdeValue;
}
}
$editFormAction = $_SERVER['PHP_SELF'];
if (isset($_SERVER['QUERY_STRING'])) {
$editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
}
//début de mon code adapté
//etape1 création de l'étudiant depuis le forumulaire
if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {
$insertSQL = sprintf('INSERT INTO eleves (nom, prenom, classe, tel, mail) VALUES (%s, %s, %s, %s, %s)',
GetSQLValueString($link, $_POST['nom'], "text"),
GetSQLValueString($link, $_POST['prenom'], "text"),
GetSQLValueString($link, $_POST['classe'], "text"),
GetSQLValueString($link, $_POST['tel'], "text"),
GetSQLValueString($link, $_POST['mail'], "text"));
$result1 = mysqli_query($link, $insertSQL);
if ($result1 === false) {
erreurSQL($link);
} else {
//récupération de l'ID de l'étudiant ajouté
$eleveID = mysqli_insert_id($link);
//Etape2 lancement de la requete pour trouver les techniques enregistrées dans la database
$query_Recordset1 = "SELECT ID FROM techniques";
$Recordset1 = mysqli_query($link, $query_Recordset1);
if ($Recordset1 === false) {
erreurSQL($link);
} else {
$sql = 'insert into evaluations (elevesID, techniquesID, dateeval) values(' . mysqli_real_escape_string($link, $eleveID) . ',
?, now())';
$prepareInsert = mysqli_prepare($link, $sql);
while ($row_Recordset1 = mysqli_fetch_assoc($Recordset1)) {
mysqli_stmt_bind_param($prepareInsert, 'i', $row_Recordset1['ID']);
mysqli_stmt_execute($prepareInsert);
}
mysqli_free_result($Recordset1);
//redirection
$insertGoTo = "gestionEtudiant.php";
if (isset($_SERVER['QUERY_STRING'])) {
$insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?";
$insertGoTo .= $_SERVER['QUERY_STRING'];
}
header(sprintf("Location: %s", $insertGoTo));
}
}
}
//autre////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
$query_rsMenuClasses = 'SELECT DISTINCT classe FROM eleves ORDER BY classe ASC';
$rsMenuClasses = mysqli_query($link, $query_rsMenuClasses);
$row_rsMenuClasses = mysqli_fetch_assoc($rsMenuClasses);
$totalRows_rsMenuClasses = mysqli_num_rows($rsMenuClasses);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Ajouter un étudiant</title>
<link href="styleAdmin.css" rel="stylesheet" type="text/css"/>
<link rel="stylesheet" type="text/css" href="styleMenuHorizontal_6.css"/>
<link href="style1.css" rel="stylesheet" type="text/css" media="all"/>
<!--insert de ma bibliotdèque jquery-->
<script src="jquery-1.9.1.js"></script>
<!--code js jquery -->
<script>
$(document).ready(function () {
$("#ok").click(function () {
$("#sousmenu").toggle();
});
});
</script>
</head>
<body>
<div id="conteneur">
<div id="entete"><img src="../images/ban2.jpg" alt="logo Guitares Electriques" widtd="750" height="150"/></div>
<div id="navbar">
<div id="menu">
<ul>
<li><a href="gestionEtudiant.php">Gestion des étudiants</a></li>
<li><a id="ok" href="#">Gestion des évals</a></li>
<ul id="sousmenu">
<li><a href="evalGestionEtudiant.php">Par étudiant</a></li>
<li><a href="evalGestionAtelier.php">Par étudiant et atelier</a></li>
<li><a href="evalGestionDate.php">Par étudiant et date</a></li>
<li><a href="evalGestionTechnique.php">Par étudiant et tech</a></li>
<li><a href="evalLast.php">Les 3 dernières</a></li>
</ul>
<li><a href="../index.php">Voir le site</a></li>
<li><a href="#">Déconnexion</a></li>
</ul>
</div>
<!--fin menu-->
</div>
<!--fin navbar-->
<div id="contenu">
<h1>Ajouter un étudiant</h1>
<p>Modifier la classe celle affichée est une valeur par défaut.</p>
<p><a href="gestionEtudiant.php">Retour</a></p>
<form action="<?php echo $editFormAction; ?>" name="form1" id="form1" metdod="POST">
<table widtd="268" border="0">
<tr>
<td widtd="98" class="marronTableau" scope="row">Nom</td>
<td widtd="154" class="jauneTableau"><input type="text" name="nom" id="nom"/></td>
</tr>
<tr>
<td class="marronTableau" scope="row">Prénom</td>
<td class="jauneTableau"><input type="text" name="prenom" id="prenom"/></td>
</tr>
<tr>
<td class="marronTableau" scope="row">Classe</td>
<td class="jauneTableau"><select name="classe" id="classe">
<?php
do {
?>
<option
value="<?php echo $row_rsMenuClasses['classe'] ?>"><?php echo $row_rsMenuClasses['classe'] ?></option>
<?php
} while ($row_rsMenuClasses = mysql_fetch_assoc($rsMenuClasses));
$rows = mysqli_num_rows($rsMenuClasses);
if ($rows > 0) {
mysqli_data_seek($rsMenuClasses, 0);
$row_rsMenuClasses = mysqli_fetch_assoc($rsMenuClasses);
}
?>
</select></td>
</tr>
<tr>
<td class="marronTableau" scope="row">Téléphone</td>
<td class="jauneTableau"><input type="text" name="tel" id="tel"/></td>
</tr>
<tr>
<td class="marronTableau" scope="row">Mail</td>
<td class="jauneTableau"><input type="text" name="mail" id="mail"/></td>
</tr>
<tr>
<td class="marronTableau" scope="row">Fichier photo</td>
<td class="jauneTableau"> </td>
</tr>
<tr>
<td scope="row"> </td>
<td><input type="submit" name="button" id="button" value="Valider "/>
<input type="reset" name="Reset" id="Reset" value="Effacer"/></td>
</tr>
</table>
<input type="hidden" name="MM_insert" value="form1"/>
</form>
<p> </p>
<p> </p>
</div>
<div id="pied"></div>
</div>
</body>
</html>
<?php
mysqli_free_result($rsMenuClasses);
?>
c'est a tester bien entendu
un tuto sur les procédures stockées sur le site du zéro :
http://www.siteduzero.com/informatique/ ... re-stockee
un exemple de ce que peux donner la procédure (pour mysql)
DELIMITER /
DROP PROCEDURE initEval;
CREATE PROCEDURE initEval(IN idEleve INT) BEGIN
-- Les variables
DECLARE i_id INT;
# pour la gestion de la fin de la boucle !
DECLARE done INT DEFAULT 0;
DECLARE c_technique CURSOR FOR
SELECT
id
FROM technique;
# déclare un handler pour détecter la fin du jeu d'enregistrements
# lorsque le jeux d'enregistrement arrive à la fin il y a une erreur qui est "attrapée" par le handler
# et dans ce cas on place done=1 pour sortir de la boucle repeat
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
# parcourt du curseur
OPEN c_technique;
REPEAT
FETCH c_technique
INTO i_id;
IF done = 0
THEN
INSERT INTO evaluations VALUES (idEleve, i_id, now());
END IF;
UNTIL done END REPEAT;
# sort quand done = 1
CLOSE c_technique;
END
/
DELIMITER ;
et dans ton code plutôt que d'utiliser un select + le while + les insert (même préparé)
un simple
<?php
mysqli_query('call initEval('.$idEleve.')');
Pour info il est préférable de nommer les noms de champs avec autre chose que des mots clef SQL (par exemple date). Tu peux facilement remédier à cela avec des mots français, voir en composant (dateeval par exemple).
dernière chose : pourquoi ne pas créer les contraintes de clef étrangère correctement. ce mécanisme est géré par le sgbd et t’empêche les boulettes.
edit : ajout de la procédure stockée
@+
salut,
Ton code n'effectue qu'une seule requête d'insertion il faut mettre le mysql_query dans le while de traitement du select id from techniques.
ensuite je te conseil de créer une procédure stockée pour faire cela.
le code d'insertion doit ce trouver dans la partie de validation du formulaire.
Pour faire bien utilise l'extension [url=http://www.php.net/mysqli]mysqli[/url] plutôt que l'extension mysql.
Tu utilise mal la balise th, celle ci ne s'utilise que dans un thead !
je corrigerais ton code ainsi
[php]<?php
// require_once('../Connections/mysqlConnection.php');
$link = mysqli_connect('loclahost', 'user', 'passwd', 'nom de la base');
if (!isset($_SESSION)) {
session_start();
}
$MM_autdorizedUsers = "super";
$MM_donotCheckaccess = "false";
/**
* Permet d'afficher une erreur sql proprement
* @param $link
*/
function erreurSQL($link) {
echo '<p class="sqlerror" Erreur SQL : <br />';
echo mysqli_error($link);
echo '</p>';
}
// *** Restrict Access To Page: Grant or deny access to tdis page
function isAutdorized($strUsers, $strGroups, $UserName, $UserGroup) {
// For security, start by assuming tde visitor is NOT autdorized.
$isValid = False;
// When a visitor has logged into tdis site, tde Session variable MM_Username set equal to tdeir username.
// tderefore, we know tdat a user is NOT logged in if tdat Session variable is blank.
if (!empty($UserName)) {
// Besides being logged in, you may restrict access to only certain users based on an ID established when tdey login.
// Parse tde strings into arrays.
$arrUsers = Explode(",", $strUsers);
$arrGroups = Explode(",", $strGroups);
if (in_array($UserName, $arrUsers)) {
$isValid = true;
}
// Or, you may restrict access to only certain users based on tdeir username.
if (in_array($UserGroup, $arrGroups)) {
$isValid = true;
}
if (($strUsers == "") && false) {
$isValid = true;
}
}
return $isValid;
}
$MM_restrictGoTo = "index.php";
if (!((isset($_SESSION['MM_Username'])) && (isAutdorized("", $MM_autdorizedUsers, $_SESSION['MM_Username'], $_SESSION['MM_UserGroup'])))) {
$MM_qsChar = "?";
$MM_referrer = $_SERVER['PHP_SELF'];
if (strpos($MM_restrictGoTo, "?")) {
$MM_qsChar = "&";
}
if (isset($_SERVER['QUERY_STRING']) && strlen($_SERVER['QUERY_STRING']) > 0) {
$MM_referrer .= "?" . $_SERVER['QUERY_STRING'];
}
$MM_restrictGoTo = $MM_restrictGoTo . $MM_qsChar . "accesscheck=" . urlencode($MM_referrer);
header("Location: " . $MM_restrictGoTo);
exit;
}
if (!function_exists("GetSQLValueString")) {
function GetSQLValueString($dbLink, $tdeValue, $tdeType, $tdeDefinedValue = "", $tdeNotDefinedValue = "") {
if (PHP_VERSION < 6) {
$tdeValue = get_magic_quotes_gpc() ? stripslashes($tdeValue) : $tdeValue;
}
$tdeValue = function_exists("mysql_real_escape_string") ? mysqli_real_escape_string($dbLink, $tdeValue) :
mysqli_real_escape_string($dbLink, $tdeValue);
switch ($tdeType) {
case "text":
$tdeValue = ($tdeValue != "") ? "'" . $tdeValue . "'" : "NULL";
break;
case "long":
case "int":
$tdeValue = ($tdeValue != "") ? intval($tdeValue) : "NULL";
break;
case "double":
$tdeValue = ($tdeValue != "") ? doubleval($tdeValue) : "NULL";
break;
case "date":
$tdeValue = ($tdeValue != "") ? "'" . $tdeValue . "'" : "NULL";
break;
case "defined":
$tdeValue = ($tdeValue != "") ? $tdeDefinedValue : $tdeNotDefinedValue;
break;
}
return $tdeValue;
}
}
$editFormAction = $_SERVER['PHP_SELF'];
if (isset($_SERVER['QUERY_STRING'])) {
$editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
}
//début de mon code adapté
//etape1 création de l'étudiant depuis le forumulaire
if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {
$insertSQL = sprintf('INSERT INTO eleves (nom, prenom, classe, tel, mail) VALUES (%s, %s, %s, %s, %s)',
GetSQLValueString($link, $_POST['nom'], "text"),
GetSQLValueString($link, $_POST['prenom'], "text"),
GetSQLValueString($link, $_POST['classe'], "text"),
GetSQLValueString($link, $_POST['tel'], "text"),
GetSQLValueString($link, $_POST['mail'], "text"));
$result1 = mysqli_query($link, $insertSQL);
if ($result1 === false) {
erreurSQL($link);
} else {
//récupération de l'ID de l'étudiant ajouté
$eleveID = mysqli_insert_id($link);
//Etape2 lancement de la requete pour trouver les techniques enregistrées dans la database
$query_Recordset1 = "SELECT ID FROM techniques";
$Recordset1 = mysqli_query($link, $query_Recordset1);
if ($Recordset1 === false) {
erreurSQL($link);
} else {
$sql = 'insert into evaluations (elevesID, techniquesID, dateeval) values(' . mysqli_real_escape_string($link, $eleveID) . ',
?, now())';
$prepareInsert = mysqli_prepare($link, $sql);
while ($row_Recordset1 = mysqli_fetch_assoc($Recordset1)) {
mysqli_stmt_bind_param($prepareInsert, 'i', $row_Recordset1['ID']);
mysqli_stmt_execute($prepareInsert);
}
mysqli_free_result($Recordset1);
//redirection
$insertGoTo = "gestionEtudiant.php";
if (isset($_SERVER['QUERY_STRING'])) {
$insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?";
$insertGoTo .= $_SERVER['QUERY_STRING'];
}
header(sprintf("Location: %s", $insertGoTo));
}
}
}
//autre////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
$query_rsMenuClasses = 'SELECT DISTINCT classe FROM eleves ORDER BY classe ASC';
$rsMenuClasses = mysqli_query($link, $query_rsMenuClasses);
$row_rsMenuClasses = mysqli_fetch_assoc($rsMenuClasses);
$totalRows_rsMenuClasses = mysqli_num_rows($rsMenuClasses);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Ajouter un étudiant</title>
<link href="styleAdmin.css" rel="stylesheet" type="text/css"/>
<link rel="stylesheet" type="text/css" href="styleMenuHorizontal_6.css"/>
<link href="style1.css" rel="stylesheet" type="text/css" media="all"/>
<!--insert de ma bibliotdèque jquery-->
<script src="jquery-1.9.1.js"></script>
<!--code js jquery -->
<script>
$(document).ready(function () {
$("#ok").click(function () {
$("#sousmenu").toggle();
});
});
</script>
</head>
<body>
<div id="conteneur">
<div id="entete"><img src="../images/ban2.jpg" alt="logo Guitares Electriques" widtd="750" height="150"/></div>
<div id="navbar">
<div id="menu">
<ul>
<li><a href="gestionEtudiant.php">Gestion des étudiants</a></li>
<li><a id="ok" href="#">Gestion des évals</a></li>
<ul id="sousmenu">
<li><a href="evalGestionEtudiant.php">Par étudiant</a></li>
<li><a href="evalGestionAtelier.php">Par étudiant et atelier</a></li>
<li><a href="evalGestionDate.php">Par étudiant et date</a></li>
<li><a href="evalGestionTechnique.php">Par étudiant et tech</a></li>
<li><a href="evalLast.php">Les 3 dernières</a></li>
</ul>
<li><a href="../index.php">Voir le site</a></li>
<li><a href="#">Déconnexion</a></li>
</ul>
</div>
<!--fin menu-->
</div>
<!--fin navbar-->
<div id="contenu">
<h1>Ajouter un étudiant</h1>
<p>Modifier la classe celle affichée est une valeur par défaut.</p>
<p><a href="gestionEtudiant.php">Retour</a></p>
<form action="<?php echo $editFormAction; ?>" name="form1" id="form1" metdod="POST">
<table widtd="268" border="0">
<tr>
<td widtd="98" class="marronTableau" scope="row">Nom</td>
<td widtd="154" class="jauneTableau"><input type="text" name="nom" id="nom"/></td>
</tr>
<tr>
<td class="marronTableau" scope="row">Prénom</td>
<td class="jauneTableau"><input type="text" name="prenom" id="prenom"/></td>
</tr>
<tr>
<td class="marronTableau" scope="row">Classe</td>
<td class="jauneTableau"><select name="classe" id="classe">
<?php
do {
?>
<option
value="<?php echo $row_rsMenuClasses['classe'] ?>"><?php echo $row_rsMenuClasses['classe'] ?></option>
<?php
} while ($row_rsMenuClasses = mysql_fetch_assoc($rsMenuClasses));
$rows = mysqli_num_rows($rsMenuClasses);
if ($rows > 0) {
mysqli_data_seek($rsMenuClasses, 0);
$row_rsMenuClasses = mysqli_fetch_assoc($rsMenuClasses);
}
?>
</select></td>
</tr>
<tr>
<td class="marronTableau" scope="row">Téléphone</td>
<td class="jauneTableau"><input type="text" name="tel" id="tel"/></td>
</tr>
<tr>
<td class="marronTableau" scope="row">Mail</td>
<td class="jauneTableau"><input type="text" name="mail" id="mail"/></td>
</tr>
<tr>
<td class="marronTableau" scope="row">Fichier photo</td>
<td class="jauneTableau"> </td>
</tr>
<tr>
<td scope="row"> </td>
<td><input type="submit" name="button" id="button" value="Valider "/>
<input type="reset" name="Reset" id="Reset" value="Effacer"/></td>
</tr>
</table>
<input type="hidden" name="MM_insert" value="form1"/>
</form>
<p> </p>
<p> </p>
</div>
<div id="pied"></div>
</div>
</body>
</html>
<?php
mysqli_free_result($rsMenuClasses);
?>[/php]
c'est a tester bien entendu :)
un tuto sur les procédures stockées sur le site du zéro : [url]http://www.siteduzero.com/informatique/tutoriels/procedure-stockee[/url]
un exemple de ce que peux donner la procédure (pour mysql)
[sql]DELIMITER /
DROP PROCEDURE initEval;
CREATE PROCEDURE initEval(IN idEleve INT) BEGIN
-- Les variables
DECLARE i_id INT;
# pour la gestion de la fin de la boucle !
DECLARE done INT DEFAULT 0;
DECLARE c_technique CURSOR FOR
SELECT
id
FROM technique;
# déclare un handler pour détecter la fin du jeu d'enregistrements
# lorsque le jeux d'enregistrement arrive à la fin il y a une erreur qui est "attrapée" par le handler
# et dans ce cas on place done=1 pour sortir de la boucle repeat
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
# parcourt du curseur
OPEN c_technique;
REPEAT
FETCH c_technique
INTO i_id;
IF done = 0
THEN
INSERT INTO evaluations VALUES (idEleve, i_id, now());
END IF;
UNTIL done END REPEAT;
# sort quand done = 1
CLOSE c_technique;
END
/
DELIMITER ;[/sql]
et dans ton code plutôt que d'utiliser un select + le while + les insert (même préparé)
un simple
[php]<?php
mysqli_query('call initEval('.$idEleve.')');
[/php]
Pour info il est préférable de nommer les noms de champs avec autre chose que des mots clef SQL (par exemple date). Tu peux facilement remédier à cela avec des mots français, voir en composant (dateeval par exemple).
dernière chose : pourquoi ne pas créer les contraintes de clef étrangère correctement. ce mécanisme est géré par le sgbd et t’empêche les boulettes. ;)
edit : ajout de la procédure stockée
@+