identifiants à deux clefs étrangères problème

aerosky2
Invité n'ayant pas de compte PHPfrance

14 mai 2013, 09:21

Bonjour à tous et merci par avance.

Je suis entrain d'adapter les script php d'une appli que je réalise avec dreamweaver.

Mon app dispose d'une base de données de 4 tables, celles ci contiennent des clefs étrangères pour les rendre relationnelles mais je fais les jointures à la main, je ne les ai pas déclarées. Donc quand j'ai besoin j'utilise WHERE et AND pour connecter les tables ensembles. (concecernant les suppressions je fais en deux étapes si je supprime un élève, j'ai un second comportement qui supprime les évaluations liées à cet élève).

J'aimerais compléter un comportement php de dreamweaver qui me permet d'insérer un éléve dans une de mes tables en créant dans la foulée les 120 techniques que cet élève devra maîtriser. C'est ma table évaluation (elevesID; techniquesID; eval; date; auteur) qui doit être additionnée à chaque fois d'une nouvelle technique (je considère que chaque technique n'a qu'une seule évaluation possible elle est ensuite mise à jour) un item de cette table est donc identifié par la double clef étrangère elevesID et techniquesID.

J'ai donc commencé par récupérer le comportement d'ajout d'un élève, je tente ensuite de récupérer l'id via mysql_insert_id()// ne fonctionne pas

puis je lance une requête sur la table technique pour récupérer l'id de la technique en cours. Au sein de cette boucle je tente ensuite d'insérer à chaque tour l'évaluation identifiée par elevesID et techniquesID afin de créer les 120 techniques (les autres champs de cette table sont laissés à leurs valeurs par défaut et notamment l'éval à 7 qui correspond à non évaluée).

Je rencontre deux problèmes: Le premier c'est que je n'arrive pas à récupérer l'id de l'élève fraîchement créé, le second lorsque je mets un id fictif pour celui-ci sql me retourne une duplicate entry à chaque boucle du tableau considérant que elevesID (que j'utilise donc à chaque tour ) est le seul identifiant ce cette table évaluation alors que l'identifiant de cette table est composé des deux champs élèvesID et techniquesID.

Ouf j'ai cru que je ne parviendrais pas à vous expliquer tout cela. Je suis sauvé ou presque...

Il est à noter que lorsque j'insère directement depuis phpmyadmin des champs dans ma base évaluation en donnant des elevesID et techniquesID comme je le souhaite je n'ai pas d'erreurs.
<?php require_once('../Connections/mysqlConnection.php'); ?>
<?php
if (!isset($_SESSION)) {
  session_start();
}
$MM_authorizedUsers = "super";
$MM_donotCheckaccess = "false";

// *** Restrict Access To Page: Grant or deny access to this page
function isAuthorized($strUsers, $strGroups, $UserName, $UserGroup) { 
  // For security, start by assuming the visitor is NOT authorized. 
  $isValid = False; 

  // When a visitor has logged into this site, the Session variable MM_Username set equal to their username. 
  // Therefore, we know that a user is NOT logged in if that 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 they login. 
    // Parse the 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 their username. 
    if (in_array($UserGroup, $arrGroups)) { 
      $isValid = true; 
    } 
    if (($strUsers == "") && false) { 
      $isValid = true; 
    } 
  } 
  return $isValid; 
}

$MM_restrictGoTo = "index.php";
if (!((isset($_SESSION['MM_Username'])) && (isAuthorized("",$MM_authorizedUsers, $_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;
}
?>
<?php
if (!function_exists("GetSQLValueString")) {
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") 
{
  if (PHP_VERSION < 6) {
    $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
  }

  $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);

  switch ($theType) {
    case "text":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;    
    case "long":
    case "int":
      $theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case "double":
      $theValue = ($theValue != "") ? doubleval($theValue) : "NULL";
      break;
    case "date":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "defined":
      $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
      break;
  }
  return $theValue;
}
}

$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($_POST['nom'], "text"),
                       GetSQLValueString($_POST['prenom'], "text"),
                       GetSQLValueString($_POST['classe'], "text"),
                       GetSQLValueString($_POST['tel'], "text"),
                       GetSQLValueString($_POST['mail'], "text"));

  mysql_select_db($database_mysqlConnection, $mysqlConnection);
  $Result1 = mysql_query($insertSQL, $mysqlConnection) or die(mysql_error());

   //récupération de l'ID de l'étudiant ajouté
   $eleveID = mysql_insert_id(); 
   echo $eleveID;
}

//Etape2 lancement de la requete pour trouver les 121 techniques enregistrées dans la database
		
mysql_select_db($database_mysqlConnection, $mysqlConnection);
$query_Recordset1 = "SELECT ID
FROM techniques" ;
$Recordset1 = mysql_query($query_Recordset1, $mysqlConnection) or die(mysql_error());
$totalRows_Recordset1 = mysql_num_rows($Recordset1);
	$eleveID= 555;
	while( $row_Recordset1 = mysql_fetch_assoc($Recordset1)){
	 	 $techniqueID = $row_Recordset1['ID'];	
		echo "ddddd ".$eleveID." ".$techniqueID;
			//Etape3:  insertion du code pour créer les 120 techniques
			$insertSQL2 = sprintf("INSERT INTO evaluations (elevesID, techniquesID, date) VALUES (%s, %s, %s)",
			
			
			 GetSQLValueString($eleveID, "int"), //je récupère l'id de l' étudiant depuis la fonction mysql_insert_id()
             GetSQLValueString($techniqueID, "smallint"),  //de m^me à partir du tabelau mysql_fetch
             'NOW()'
			 
			 );
                       
					   
	}
//création effective des techniques
mysql_select_db($database_mysqlConnection, $mysqlConnection);
  $Result2 = mysql_query($insertSQL2, $mysqlConnection) or die(mysql_error());

//redirection
$insertGoTo = "gestionEtudiant.php";
  if (isset($_SERVER['QUERY_STRING'])) {
    $insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?";
    $insertGoTo .= $_SERVER['QUERY_STRING'];
  }
  header(sprintf("Location: %s", $insertGoTo));



//autre////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
mysql_select_db($database_mysqlConnection, $mysqlConnection);
$query_rsMenuClasses = "SELECT DISTINCT classe FROM eleves ORDER BY classe ASC";
$rsMenuClasses = mysql_query($query_rsMenuClasses, $mysqlConnection) or die(mysql_error());
$row_rsMenuClasses = mysql_fetch_assoc($rsMenuClasses);
$totalRows_rsMenuClasses = mysql_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" />
</head>

<body>
<div id="conteneur">
  <div id="entete"><img src="../images/ban2.jpg" alt="logo Guitares Electriques" width="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" method="POST">
      <table width="268" border="0">
        <tr>
          <th width="98" class="marronTableau" scope="row">Nom</th>
          <td width="154" class="jauneTableau"><input type="text" name="nom" id="nom" /></td>
        </tr>
        <tr>
          <th class="marronTableau" scope="row">Prénom</th>
          <td class="jauneTableau"><input type="text" name="prenom" id="prenom" /></td>
        </tr>
        <tr>
          <th class="marronTableau" scope="row">Classe</th>
          <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 = mysql_num_rows($rsMenuClasses);
  if($rows > 0) {
      mysql_data_seek($rsMenuClasses, 0);
	  $row_rsMenuClasses = mysql_fetch_assoc($rsMenuClasses);
  }
?>
          </select></td>
        </tr>
        <tr>
          <th class="marronTableau" scope="row">Téléphone</th>
          <td class="jauneTableau"><input type="text" name="tel" id="tel" /></td>
        </tr>
        <tr>
          <th class="marronTableau" scope="row">Mail</th>
          <td class="jauneTableau"><input type="text" name="mail" id="mail" /></td>
        </tr>
        <tr>
          <th class="marronTableau" scope="row">Fichier photo</th>
          <td class="jauneTableau">&nbsp;</td>
        </tr>
        <tr>
          <th scope="row">&nbsp;</th>
          <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>&nbsp;</p>
    <p>&nbsp;</p>
  </div>
  <div id="pied"></div>
</div>
<!--insert de ma bibliothèque jquery-->
<script src="jquery-1.9.1.js"></script>
<!--code js jquery -->
<script>
$(document).ready(function(){
	$("#ok").click(function(){
		$("#sousmenu").toggle();
		});
});	
</script>
</body>
</html>
<?php
mysql_free_result($rsMenuClasses);
?>
Le message d'erreur ici
Image

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

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">&nbsp;</td>
                    </tr>
                    <tr>
                        <td scope="row">&nbsp;</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>&nbsp;</p>

            <p>&nbsp;</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

@+
Il en faut peu pour être heureux ......