Erreur php call to undefined function mysql_prepare

Résolu/Fermé
nouns62 Messages postés 110 Date d'inscription jeudi 3 novembre 2011 Statut Membre Dernière intervention 3 février 2014 - 3 mai 2013 à 14:21
Arthur57530 Messages postés 264 Date d'inscription mardi 6 juillet 2010 Statut Membre Dernière intervention 13 mai 2013 - 6 mai 2013 à 16:17
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.
A voir également:

18 réponses

jeremy.s Messages postés 1226 Date d'inscription lundi 28 mars 2011 Statut Membre Dernière intervention 2 septembre 2013 79
3 mai 2013 à 15:10
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
Utilisateur anonyme
3 mai 2013 à 14:25
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
nouns62 Messages postés 110 Date d'inscription jeudi 3 novembre 2011 Statut Membre Dernière intervention 3 février 2014 96
3 mai 2013 à 14:33
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
jeremy.s Messages postés 1226 Date d'inscription lundi 28 mars 2011 Statut Membre Dernière intervention 2 septembre 2013 79
3 mai 2013 à 14:38
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nouns62 Messages postés 110 Date d'inscription jeudi 3 novembre 2011 Statut Membre Dernière intervention 3 février 2014 96
3 mai 2013 à 14:44
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
jeremy.s Messages postés 1226 Date d'inscription lundi 28 mars 2011 Statut Membre Dernière intervention 2 septembre 2013 79
3 mai 2013 à 14:49
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
nouns62 Messages postés 110 Date d'inscription jeudi 3 novembre 2011 Statut Membre Dernière intervention 3 février 2014 96
3 mai 2013 à 15:01
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
nouns62 Messages postés 110 Date d'inscription jeudi 3 novembre 2011 Statut Membre Dernière intervention 3 février 2014 96
Modifié par nouns62 le 3/05/2013 à 15:19
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
nouns62 Messages postés 110 Date d'inscription jeudi 3 novembre 2011 Statut Membre Dernière intervention 3 février 2014 96
3 mai 2013 à 16:36
up? :o)
0
jeremy.s Messages postés 1226 Date d'inscription lundi 28 mars 2011 Statut Membre Dernière intervention 2 septembre 2013 79
3 mai 2013 à 20:29
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
nouns62 Messages postés 110 Date d'inscription jeudi 3 novembre 2011 Statut Membre Dernière intervention 3 février 2014 96
6 mai 2013 à 09:16
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
nouns62 Messages postés 110 Date d'inscription jeudi 3 novembre 2011 Statut Membre Dernière intervention 3 février 2014 96
Modifié par nouns62 le 6/05/2013 à 10:20
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
jeremy.s Messages postés 1226 Date d'inscription lundi 28 mars 2011 Statut Membre Dernière intervention 2 septembre 2013 79
6 mai 2013 à 14:40
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
nouns62 Messages postés 110 Date d'inscription jeudi 3 novembre 2011 Statut Membre Dernière intervention 3 février 2014 96
6 mai 2013 à 14:54
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
jeremy.s Messages postés 1226 Date d'inscription lundi 28 mars 2011 Statut Membre Dernière intervention 2 septembre 2013 79
6 mai 2013 à 15:03
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
nouns62 Messages postés 110 Date d'inscription jeudi 3 novembre 2011 Statut Membre Dernière intervention 3 février 2014 96
6 mai 2013 à 15:41
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
jeremy.s Messages postés 1226 Date d'inscription lundi 28 mars 2011 Statut Membre Dernière intervention 2 septembre 2013 79
6 mai 2013 à 16:02
Tant mieux pour toi !
Derien ;-)

0
Arthur57530 Messages postés 264 Date d'inscription mardi 6 juillet 2010 Statut Membre Dernière intervention 13 mai 2013 8
6 mai 2013 à 16:17
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