Page 1 sur 1

requête sql avec variables

Posté : 21 avr. 2009, 18:14
par oupsla
Bonjour,
Je voudrais créer une fonction pour mes mysql_fetch_row

Code : Tout sélectionner

<? function sqlrow($cols,$table,$where,$id) { require_once 'admin/conf.php'; // les infos de connexion à la base de données require_once 'lib/link.php'; // mysql_connect et mysql_select_db $requete = "SELECT ".$cols." FROM ".$table." WHERE ".$where." = '".$id."'"; $result = mysql_query ($requete,$link); $content = mysql_fetch_row($result); if (!$content){die (include ('inc/404.php'));} $col = explode(", ",$cols); for($nb =0; $col[$nb] != false; $nb++) { $col = "$".$col; $col = utf8_encode($content[$nb]); echo $col; //pour essayer, ça me renvoie bien le contenu de la base return $col; } mysql_free_result($result); } $cols = 'titre, chapeau, texte'; sqlrow($cols,content,id,1); echo $titre."<br>".$chapeau."<br>".$texte; ?>
Je voudrais accéder aux données $cols(titre,chapeau,texte) par des variables $titre $chapeau et $texte.
Et là je coince...

Posté : 21 avr. 2009, 18:43
par Ryle
Deux petites infos qui devraient t'aider.

Si $col contient la chaine "titre", alors pour accéder à la variable $titre, tu peux faire appel à $$col (c'est pas une concatenation de la chaine "$" et de la variable $col)
$col = "titre";
$$col = "toto";
echo $titre; // affiche "toto"
L'autre point, c'est qu'une variable déclarée dans une fonction à une portée limitée à celle-ci. En gros, en dehors de la fonction elle n'est pas déclarée, à moins que tu ne spécifies qu'il s'agit d'une variable globale :
function maFonction() {
  $col = "titre";
  global $$col;
  $$col = "toto";
}
maFonction();
echo $titre; // affiche "toto"
C'est pas forcément super propre parce que tu ne maitrises absolument pas les variables qui vont être définie par ta fonction... L'idéal est je pense que ta fonction retourne un tableau de valeurs que tu peux ensuite exploiter comme bon te semble avec un list(), extract() ou un foreach() :)

Posté : 21 avr. 2009, 22:08
par oupsla
J'ai trouvé ;)
Merci pour ton aide.
<?
function sqlobj($cols,$table,$where,$id){	
	require_once 'admin/conf.php';
	require_once 'lib/link.php';
	$requete = "SELECT ".$cols." FROM ".$table." WHERE ".$where." = '".$id."'";
	$result = mysql_query ($requete,$link);
	$content = mysql_fetch_object($result);
	mysql_free_result($result);
	if (!$content){die (include ('inc/404.php'));}
	$col = explode(", ",$cols);
	foreach($col as $var){
		global $$var;
		$$var = utf8_encode($content->$var);
	}
}
$cols = "titre, chapeau, texte";
sqlobj($cols,content,id,1);
echo $titre."<br>".$chapeau."<br>".$texte
?>
Il me reste à essayer mysql_fetch_array...

En fait je voudrais que les variables de cette fonction soient données par une table de liaison, et pour différents contenus.
Les variables qui définiront la page à afficher seront passées par .htaccess et rewriterules pour des urls proprent:
par ex http://www.mon.site/index.html me donnera $page=index ou par ex: http://www.mon.site/galerie/portrait/index-1.html $section=galerie (permet de selectionner dans la base le contenu et le menu de navigation dans les galeries) $subsection=portrait (rassembler les photos de la table media où mots_clef=portrait) $page=index (page de vignettes) $id=1 (les 12 premières) et pour afficher une photo seul index-1.html change pour par ex: photo-7.html donc $page=photo (template différent que pour un index) et $media=7 (qui me donnera toute les infos liées dans les tables media iptc exif auteur et commentaire). Je pense tester ces variables passées par l'url avec des if avant de construire les requêtes sql...
Pour le moment je pense faire un .htaccess par section avec des directives RewriteBase.
Est-ce que cette méthode permet des injections sql? Si oui, comment s'en prémunir?
Je n'en suis pas encore là hélas.