Erreur php call to undefined function mysql_prepare

Résolu
nouns62 Messages postés 111 Date d'inscription   Statut Membre Dernière intervention   -  
Arthur57530 Messages postés 294 Statut Membre -
Bonjour à tous,

comme vous le voyez dans le sujet, j'ai une erreur php, et ce suite à des modifications visant à optimiser mes requètes SQL.
Je voulais améliorer la vitesse de chargement de mes pages, et je suis tombé sur ce lien du site du zéro (<3)

https://openclassrooms.com/fr/courses

En utilisant la fonction mysql_prepare, qui existe bien en php, j'obtiens "Fatal error: Call to undefined function mysql_prepare() in .../..."

Pouvez-vous m'aider svp?
Merci.

18 réponses

  1. jeremy.s Messages postés 1248 Statut Membre 79
     
    D'accord j'ai compris le crois !
    Tu peux ne faire qu'une seule requete :)
    Avec une joindure !
    SELECT au.code, au.nom, au.prenom, au.mesure, in.Numero FROM intervention in, auterTable au WHERE au.codeMajeur = in.codeMajeur AND in.codeDelegé = :co AND au.codeDelegue = :co AND in.type=39

    Mmh voilà, mais à arranger à ta sauce ! (Je savais pas le nom de ta deuxieme table)

    Mais regarde du coté des jointures ;-)
    Sinon envois les structures exactes de tes tables et les infos qu'il te faut et je te refais une requete proprement pcq là c'est un peu à l'arrache
    1
  2. Utilisateur anonyme
     
    Salut salut,

    L'article traite de l'interrogation de la base de donnée en utilisant PDO, ce qui est une bonne pratique ;)

    Par contre la fonction mysql_prepare n'existe pas, regarde bien les tutos sur PDO.
    0
  3. nouns62 Messages postés 111 Date d'inscription   Statut Membre Dernière intervention   100
     
    ok, merci de ta réponse, apparament une fonction mysqli_prepare() existe, je vais voir ce ce coté => https://www.php.net/manual/fr/mysqli.prepare.php
    il y aurait un problème d'objet...
    $bdd->prepare(); ou $res = mysql_prepare("$query); ? :)
    0
  4. jeremy.s Messages postés 1248 Statut Membre 79
     
    Salut !

    $res = msqli_prepare($query);
    Et ensuite $res->execute :)
    Mais utilise PDO, comme l'a dit Kyser (décidément !), c'est une bonne pratique ;-)
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. nouns62 Messages postés 111 Date d'inscription   Statut Membre Dernière intervention   100
     
    humm, pas super dans mon cas mysqli car il faut un $link...
    en fait, j'affiche dans une table html diverses données concernant la liste des clients dont s'occupe celui qui est logué, et ce dans une boucle for. Je voudrait donc afin d'optimiser la vitesse, ne pas devoir refaire une requète à chaque tour de boucle mais la préparer avant le for puis envoyer l'array des params dans chaque boucle.... j'espère être clair...
    voilà mon code :
    $rep=mysql_prepare('SELECT Numero FROM intervention WHERE codeMajeur = :majeur AND codeDelegue = :delegue AND type=39') or die(mysql_error());
    		
    		for ($i=0;$rowma=mysql_fetch_array($res);++$i)
    		{
    			if (!$i){
    				echo'<br><u><h2>Ajouter des consignes :</h2></u>';
    				echo '<table border=1 width="75%">';
    		
    				echo "<tr><td></td><td></td><td></td><td></td><td><input type=submit value=Enregistrer></td></tr>";
    				echo "<tr>
    						<td width='20%'><b><u>Code </u></b></td>
    						<td width='35%'><b><u>Nom </u></b></td>
    						<td width='35%'><b><u>Prenom </u></b></td>
    						<td width='20%'><b><u>Mesure </u></b></td>
    						<td width='35%'><b><u>Consignes</u></b></td>
    						</tr></br>";
    				}							
    				echo "<tr>
    						<td>",$rowma['code'],"</td>
    						<td>",$rowma['nom'],"</td>
    						<td>",$rowma['prenom'],"</td>
    						<td>",$rowma['mesure'],"</td>";
    						
    						
    				$parsid = preg_replace("/ /","_",'consigne'.$rowma['code']);
    				array_push($arrcodes, $c);
    				
    				$rep->execute(array('majeur' => $rowma["code"], 'delegue' => $delegue["Code"]));
    				
    


    Des idées ? :D
    merci beaucoup.
    0
  7. jeremy.s Messages postés 1248 Statut Membre 79
     
    Mmh je ne comprend pas spécialement ta logique.
    Ton codemajeur et codedélégué c'est l'utilisateur logué pour le quel tu affiches les infos ?

    Peux tu mettre tes tables que tu utilises ? Et expliqué un peu ce que tu cherches à faire ?
    Du style :
    table user(id, nom, prenom, mdp)
    Je cherche à trouvé l'id et le mdp avec le nom.
    0
  8. nouns62 Messages postés 111 Date d'inscription   Statut Membre Dernière intervention   100
     
    le majeur est le client, et le délégué l'employé si vous préférez... ^^
    le délégué est logué (forcément).
    je récupère la liste des majeurs qu'il gère.
    pour chacun, une ligne de table apparaît (à chaque boucle du for) , j'y affiche en colonnes leurs infos (code(id), nom, prénom, mesure et une zone textarea pour y saisir des consignes afin de les enregistrer).
    la table intervention est celle ou sont stockées lesdites consignes, avec en gros des champs dont codeMajeur, codeDélegué, et consigne (pas exactement mais je simplifie ^^).
    je voudrais ne pas avoir à refaire une requète dans chaque tour de boucle afin d'alléger le serveur.
    0
  9. nouns62 Messages postés 111 Date d'inscription   Statut Membre Dernière intervention   100
     
    merci bien, par contre tu utilise ":co", mais comment les remplacer par le paramètre voulu, variable php du codeMajeur qui change à chaque boucle du for ? tel est mon problème avec la fonction mysql_prepare...
    je voulais preparer la requete avant le for et l'exécuter en remplaçant le ":co" dans chaque boucle
    ?

    Les rastas sont la preuve qu'on peut s'tresser tout en restant cool!
    0
  10. nouns62 Messages postés 111 Date d'inscription   Statut Membre Dernière intervention   100
     
    up? :o)
    0
  11. jeremy.s Messages postés 1248 Statut Membre 79
     
    Salut !

    Le :co c'est le délégué, donc le mec logué non ? Donc c'est le même, c'est le majeur qui change non ?

    C'est ce que te permet de faire la jointure :
    Tu veux tout les code majeur dont s'occupe le délégué avec le code :co
    C'est bien ca ?
    0
  12. nouns62 Messages postés 111 Date d'inscription   Statut Membre Dernière intervention   100
     
    bonjour, up après ce w-e chargé, mais pas en travail ^^
    alors pour répondre à ta question, oui, pour chaque majeur dont s'occupe le délégué logué je récupère le codeMajeur, nom, prénom, et mesure.
    Mais je dois faire une requête à chaque tour de boucle... ce qui à mon avis ralentit fortement mon site.
    regarde :

    $res=mysql_query("select code,nom,prenom,mesure from majeur where Delegue='".$delegue['Code'].
    			"' AND motiffin=' ' ORDER BY nom");
    						
    	$_SESSION["nb"]=mysql_num_rows($res);
    for ($i=0;$rowma=mysql_fetch_array($res);++$i)
    		{
    			if (!$i){
    				echo'<br><u><h2>Toutes vos consignes :</h2></u>';
    				echo '<table border=1 width="75%">';
    				
    				echo "<tr>
    						<td width='10%'><b><u>Code </u></b></td>
    						<td width='15%'><b><u>Nom </u></b></td>
    						<td width='15%'><b><u>Prenom </u></b></td>
    						<td width='10%'><b><u>Mesure </u></b></td>
    						<td width='100%'><b><u>Consignes</u></b></td>
    						</tr></br>";
    			}	
    
    				$parsid = preg_replace("/ /","_",'consigne'.$rowma['code']);
    				
    				$rap=mysql_fetch_array(mysql_query("SELECT Rapport FROM intervention WHERE CodeMajeur='"
    						.$rowma['code']."' AND CodeDelegue='".$delegue['Code']."' AND Type=39"));
    				
    				echo '<tr>
    						<td>',$rowma["code"],'</td>
    						<td>',$rowma["nom"],'</td>
    						<td>',$rowma["prenom"],'</td>
    						<td>',$rowma["mesure"],'</td>
    					';	
    
    				$rep=mysql_query('SELECT Numero FROM intervention WHERE codeMajeur="'.$rowma["code"].'" 
    						AND codeDelegue="'.$delegue["Code"].'"AND type=39') or die(mysql_error());
    				//on teste si une consigne avec le même majeur existe déjà
    				if(mysql_num_rows($rep)!=0) {
    						echo '<td><div id=\''.$parsid.'\' >'.html_entity_decode($rap['Rapport'], ENT_QUOTES,'UTF-8').'</div></td>';
    				}
    				else echo '<td><div style="color: #91283B;"><b>Aucune consigne enregistrée pour ce majeur.</b></div></td>';
    				
    				array_push($arrcodes, $rowma['code']);
    
    		}//for


    voilà, je voudrais donc ne faire qu'une seule requête, si possible, à la place de celle en gras qui s'exécute à chaque tour de boucle...
    Merci énormément à l'avance de votre aide!
    0
  13. nouns62 Messages postés 111 Date d'inscription   Statut Membre Dernière intervention   100
     
    j'ai aussi essayé ça (en regardant là => https://forum.phpfrance.com/vos-contributions/faire-des-requetes-preparees-avec-extension-mysql-t255960.html#p341769) :
    avant le for :
    $stmt1=mysql_query("PREPARE stmt1 FROM 'SELECT Rapport FROM intervention WHERE CodeMajeur=? AND CodeDelegue=? AND Type=39'") or die(mysql_error()); dans le for :
    $rap = mysql_fetch_array(mysql_query("EXECUTE stmt1 USING ".$rowma['code'].",".$delegue['Code']));
    j'obtiens une suite d'erreurs :
    Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\Program Files\......\voirconsignes.php on line 53(en gras)
    wtf?

    Les rastas sont la preuve qu'on peut s'tresser tout en restant cool!
    0
  14. jeremy.s Messages postés 1248 Statut Membre 79
     
    Alors tu peux faire une seule requete ! C'est même l'objectif
    Pour cela une seule solution : la jointure externe.
    Tu peux très bien faire une requete en appelant plusieurs table (c'est ce que tu veux dans ton cas)
    Tu as alors deux requetes :
    select code,nom,prenom,mesure from majeur where Delegue=$delegue['Code'] AND motiffin=' '
    SELECT Rapport FROM intervention WHERE CodeMajeur= $rowma['code'] AND CodeDelegue= $delegue['Code'] AND Type=39"

    Enfaite tu n'as même pas besoin de jointure, enfin si mais implicite avec une requete imbriquée. J'explique : tu peux faire une requete dans une autre.
    Donc ton cas cela va donné :
    SELECT Rapport FROM intervention WHERE CodeMajeur IN ( select code from majeur where Delegue=$delegue['Code'] AND motiffin=' ' ) AND CodeDelegue= $delegue['Code'] AND Type=39"

    Le IN correspont au =, mais veut dire que la comparaison à droite renvois plusieurs lignes, ce qui est le cas de la requete.

    0
  15. nouns62 Messages postés 111 Date d'inscription   Statut Membre Dernière intervention   100
     
    merci bien de ton aide jérémy. donc je ne serait pas obligé d'utiliser mysqli_prepare apparament..?
    par contre après il faut que je récupère les bonnes infos correspondant au majeurs, car certains n'ont pas de consigne...
    0
  16. jeremy.s Messages postés 1248 Statut Membre 79
     
    Préparer une requete est une norme de la PDO, et ca n'a rien avoir avec le type de requete utilisée :)

    On passe encore au dessus alors si il te faut d'autre infos :

    SELECT m.code, m.nom, m.prenom, m.mesure, i.rapport
    FROM majeur m, intervantion i
    WHERE m.delegue=i.delegue
    AND m.motiffin=' '
    AND i.CodeDelegue= $delegue['Code'] AND i.Type=39

    0
  17. nouns62 Messages postés 111 Date d'inscription   Statut Membre Dernière intervention   100
     
    Enorme merci, même si j'ai trouvé autrement par moi-même en même temps que toi!
    SELECT m.code, m.nom, m.prenom, m.mesure, i.Rapport
    FROM majeur m LEFT JOIN intervention i ON i.CodeMajeur=m.code
    WHERE Delegue='".$delegue['Code']."' AND motiffin=' ' ORDER BY nom";

    voilà! en une seule requete tout est fait alors qu'avant il me fallait 2 ou 3 fois le nombre de majeurs!!!!!

    évidemment, maintenant il faut que je revoie toute la conception de cette partie, car il y a aussi ajout, modif, suppression... é_è'

    en tout cas merci beaucoup pour ton aide jérémy! même si j'ai trouvé, c'est grâce à toi, car moi j'avait cherché beaucoup trop compliqué, et tu m'a remis sur le droit chemin ;-)
    0
  18. jeremy.s Messages postés 1248 Statut Membre 79
     
    Tant mieux pour toi !
    Derien ;-)

    0
  19. Arthur57530 Messages postés 294 Statut Membre 8
     
    Tout ça pique les yeux , c'est atroce à la lecture et à la compréhension aïe

    PDO ou mysqli sont des couches d'abstraction supplémentaire pour l'accès à la base de donnée , ça permet ( théoriquement ) de rendre indépendant le moteur SQL utilisé ( postgre mysql ... )

    donc que tu prépare ou non ta requête , celle ci ne change pas .

    arthur spitznagel
    0