Erreur php call to undefined function mysql_prepare [Résolu/Fermé]

Signaler
Messages postés
110
Date d'inscription
jeudi 3 novembre 2011
Statut
Membre
Dernière intervention
3 février 2014
-
Arthur57530
Messages postés
264
Date d'inscription
mardi 6 juillet 2010
Statut
Membre
Dernière intervention
13 mai 2013
-
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

Messages postés
1227
Date d'inscription
lundi 28 mars 2011
Statut
Membre
Dernière intervention
2 septembre 2013
71
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 86399 internautes nous ont dit merci ce mois-ci

Messages postés
991
Date d'inscription
mercredi 20 février 2013
Statut
Membre
Dernière intervention
24 novembre 2018
91
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.
Messages postés
110
Date d'inscription
jeudi 3 novembre 2011
Statut
Membre
Dernière intervention
3 février 2014
70
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); ? :)
Messages postés
1227
Date d'inscription
lundi 28 mars 2011
Statut
Membre
Dernière intervention
2 septembre 2013
71
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 ;-)
Messages postés
110
Date d'inscription
jeudi 3 novembre 2011
Statut
Membre
Dernière intervention
3 février 2014
70
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.
Messages postés
1227
Date d'inscription
lundi 28 mars 2011
Statut
Membre
Dernière intervention
2 septembre 2013
71
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.
Messages postés
110
Date d'inscription
jeudi 3 novembre 2011
Statut
Membre
Dernière intervention
3 février 2014
70
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.
Messages postés
110
Date d'inscription
jeudi 3 novembre 2011
Statut
Membre
Dernière intervention
3 février 2014
70
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!
Messages postés
110
Date d'inscription
jeudi 3 novembre 2011
Statut
Membre
Dernière intervention
3 février 2014
70
up? :o)
Messages postés
1227
Date d'inscription
lundi 28 mars 2011
Statut
Membre
Dernière intervention
2 septembre 2013
71
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 ?
Messages postés
110
Date d'inscription
jeudi 3 novembre 2011
Statut
Membre
Dernière intervention
3 février 2014
70
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!
Messages postés
110
Date d'inscription
jeudi 3 novembre 2011
Statut
Membre
Dernière intervention
3 février 2014
70
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!
Messages postés
1227
Date d'inscription
lundi 28 mars 2011
Statut
Membre
Dernière intervention
2 septembre 2013
71
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.




Messages postés
110
Date d'inscription
jeudi 3 novembre 2011
Statut
Membre
Dernière intervention
3 février 2014
70
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...
Messages postés
1227
Date d'inscription
lundi 28 mars 2011
Statut
Membre
Dernière intervention
2 septembre 2013
71
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



Messages postés
110
Date d'inscription
jeudi 3 novembre 2011
Statut
Membre
Dernière intervention
3 février 2014
70
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 ;-)
Messages postés
1227
Date d'inscription
lundi 28 mars 2011
Statut
Membre
Dernière intervention
2 septembre 2013
71
Tant mieux pour toi !
Derien ;-)

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