8791 sujets

Développement web côté serveur, CMS

Hello @ tous, je vous expose ce que je veux faire:

Pour résumer, j'ai une table "membres" avec les champs suivants:

nom
prenom


Je souhaite faire la fonction suivante:

function retourneMembre ($donnees)
{

$prenom = $donnees['prenom'];
$nom = $donnees['nom'];

$sql = "SELECT * FROM projet WHERE nom = :nom AND prenom=:prenom";
	$req = $bdd->prepare($sql);
	$req->execute( Array ('nom' => $nom,
						'prenom'   => $prenom,
						));
}


Ainsi, je pourrais l'utiliser de la manière suivante:

retourneMembre( Array ("nom"=>"Dupont", "prenom"=>"Kevin"))
// Me retourne l'unique personne "Kévin Dupont"

retourneMembre( Array ("nom"=>"Dupont")
// Me retourne tous les  "Dupont"

retourneMembre( Array ("prenom"=>"Kevin"))
// Me retourne tous les Kévins [biggrin]

retourneMembre( Array ())
// Me retourne tous les membres/


Ma question est la suivante : à quoi setter $prenom et $nom dans ma fonction retourneMembre(), s'ils ne sont pas renseignés, afin de ne pas les intégrer à la requête ? J'ai essayé un :

[code]if (!array_key_exists('prenom',$donnees))

$prenom = '1 OR 1'[code]

mais la requête prepare n'aime pas trop ca.

Avez vous des idées ?
j'espère que j'ai bien exposé mon problème...
Modifié par Yoyo85 (04 Aug 2010 - 01:51)
Salut,

il faut faire différentes requêtes. Par exemple :
function retourneMembre ($bdd, $donnees) {
	$prenom = !empty($donnees['prenom']) ? $donnees['prenom'] : '';
	$nom = !empty($donnees['nom']) ? $donnees['nom'] : '';
	if($prenom && $nom) {
		$sql = "SELECT * FROM projet WHERE nom = :nom AND prenom=:prenom Order By nom, prenom";
		$req = $bdd->prepare($sql);
		$req->execute( Array (':nom' => $nom, ':prenom'   => $prenom) );
	} elseif($prenom) {
		$sql = "SELECT * FROM projet WHERE prenom=:prenom Order By nom, prenom";
		$req = $bdd->prepare($sql);
		$req->execute( Array (':prenom'   => $prenom));
	} elseif($nom) {
		$sql = "SELECT * FROM projet WHERE nom=:nom Order By nom, prenom";
		$req = $bdd->prepare($sql);
		$req->execute( Array (':nom'   => $nom));
	} else {
		$sql = "SELECT * FROM projet Order By nom, prenom";
		$req = $bdd->query($sql);
	}
	return($req->fetchAll());
}

// Connexion au serveur
$NomServeur = $_SERVER['SERVER_NAME'] ; 
$local=((substr($NomServeur,0,7)=="192.168") || ($NomServeur=="localhost") || ($NomServeur=="127.0.0.1"));

$host = ($local) ? "localhost" : "xxx"; 
$user = ($local) ? "root" : "xxx"; 
$passwd = ($local) ? "" : "xxx"; 
$database = ($local) ? "test" : "xxx"; 

try {
    $dbh = new PDO('mysql:host='.$host.';dbname='.$database, $user, $passwd, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); 
} catch (PDOException $erreur) {
    if ($local) {
        die('Erreur : '.$erreur->getMessage());
    } else {
        die('Ce service est momentanément indisponible. Veuillez nous excuser pour la gêne occasionnée.');
    }
}

// traitement
var_dump(retourneMembre($dbh, Array ("nom"=>"Doe", "prenom"=>"John")));
echo '<hr />';
var_dump(retourneMembre($dbh, Array ("nom"=>"Doe")));
echo '<hr />';
var_dump(retourneMembre($dbh, Array ("prenom"=>"John")));
echo '<hr />';
var_dump(retourneMembre($dbh, Array ()));

$dbh = null;

Modifié par Heyoan (03 Aug 2010 - 13:41)
Merci pour cette réponse, malheuresement je recherche quelquechose de dynamique. Je vais rajouter d'ici peu les villes, pays, et plusieurs autres attributs pour les membres, je ne vais pas m'amuser à coder toutes les conditions...
Alors quelque chose comme ça :
function retourneMembre ($bdd, $donnees) {
	if(!empty($donnees)) {
		$valeurs = array();
		$where = 'Where ';
		$and = '';
		foreach($donnees as $key => $value) {
			$where .= $and.$key.' = ? ';
			$and = ' AND ';
			$valeurs[] = $value;
		}
		$sql = 'SELECT * FROM projet '.$where.' Order By nom, prenom';
		$req = $bdd->prepare($sql);
		$req->execute($valeurs);
	} else {
		$sql = 'SELECT * FROM projet Order By nom, prenom';
		$req = $bdd->query($sql);
	}
	return($req->fetchAll());
}
Cela implique d'avoir le même index que le champ de la table (prenom, nom, ...)
Modifié par Heyoan (03 Aug 2010 - 14:06)
Salut,

Je ne connais pas l'API utilisée. Est-ce que quelque chose de ce style est envisageable ?
function retourneMembre($donnees)
{
  $sql = 'SELECT * FROM projet';
  $prems = true;

  foreach ($donnees as $nom => $valeur)
  {
    $sql .= ' ' . ($prems ? 'WHERE' : 'AND') . " $nom = :$nom";
    $prems = false;
  }

  $req = $bdd->prepare($sql);
  $req->execute($donnees);
}

Modifié par Julien Royer (03 Aug 2010 - 14:18)
Impeccable Julien cela marche bien !!

Et je ne connaissais pas du tout ce truc :

  foreach ($donnees as $nom => $valeur) 


C'est vraiment puissant!
merci, je m'y remet Smiley biggrin
Modifié par Yoyo85 (04 Aug 2010 - 01:56)