Pour les opérations SQL j'utilise une classe (DAO) passerelle entre bdd et modèle objet. Cela me permet par exemple, si je veux update d'écrire simplement :
$update = DAO::update($membre);
, aprés avoir set les nouvelles valeurs du membre . ex :
$membre->setCivilite($newCivilite);
Voici la fonction update de la classe DAO : (mais sans connaître le projet . . .)
public static function update($instance,$updateMany=false){
$tableName=OrmUtils::getTableName(get_class($instance));
$ColumnskeyAndValues=Reflexion::getPropertiesAndValues($instance);
$ColumnskeyAndValues=array_merge($ColumnskeyAndValues, OrmUtils::getManyToOneMembersAndValues($instance));
$keyFieldsAndValues=OrmUtils::getKeyFieldsAndValues($instance);
$sql="UPDATE ".$tableName." SET ".SqlUtils::getUpdateFieldsKeyAndValues($ColumnskeyAndValues)." WHERE ".SqlUtils::getWhere($keyFieldsAndValues);
Logger::log("update", $sql);
$statement=DAO::$db->prepareStatement($sql);
foreach ($ColumnskeyAndValues as $key=>$value){
DAO::$db->bindValueFromStatement($statement,$key,$value);
}
$result= $statement->execute();
if($result && $updateMany)
DAO::insertOrUpdateAllManyToMany($instance);
return $result;
}
Et voici la fonction pour modifier le profil : (unpeu bordélique dsl !)
// permet de modifier le profil du membre
public function modifProfil(){
$membre=commonUtils::chargerMembre(); // on récupère le membre connecté
// stock les vrais set
$trueCivilite=$membre->getCivilite();
$trueNom=$membre->getNom();
$truePrenom=$membre->getPrenom();
$trueEmail=$membre->getEmail();
$trueMdp=$membre->getPassword();
$trueSignature=$membre->getSignature();
$arrayTrue = array("trueCivilite"=>$trueCivilite, "trueNom"=>$trueNom, "truePrenom"=>$truePrenom, "trueEmail"=>$trueEmail, "trueMdp"=>$trueMdp, "trueSignature"=>$trueSignature);
// stock les données returned par le POST
$newNom=$_POST["newNomProfil"];
$newPrenom=$_POST["newPrenomProfil"];
$newCivilite=$_POST["newCiviliteProfil"];
$newEmail=$_POST["newEmailProfil"];
$newMdp=$_POST["newMdpProfil"];
$newMdp2=$_POST["newMdp2Profil"];
$currentIdent=$_POST["currentIdentProfil"];
$currentMdp=$_POST["currentMdpProfil"];
$newSignature = $_POST["textareaSignatureProfil"];
// variables de tests
$needUpdate=false; // on considere qu'il n'y a pas besoin d'update le membre initialement
$validateModif=false; // on considere que la modification est de base non effectuée
$validateEmail=true; // on considere que l'email est disponible
$auth=false; // on considere que l'authentification est de base mauvaise
$mdpLength=true; // on considere que la longueur du mot de passe est sufisante
$mdpEquality=true; // on considere que les mots de passes sont identiques
// :::::::::::::::::::::::::::::::::::::::::::::::::::::::: TEST MODIF NEED :::::::::::::::::::::::::::::::::::::::::::::::::::::::
// si y a besoin de modifier
if($newSignature != $membre->getSignature() || $newMdp != "" || $newEmail != $membre->getEmail() || $newCivilite != $membre->getCivilite() || $newNom != $membre->getNom() || $newPrenom != $membre->getPrenom()){
$needUpdate = true;
// auth
if(sha1($currentMdp) === $membre->getPassword() && $currentIdent === $membre->getIdentifiant()){ // si currentmdp/ident == membreConnecté.ident/.mdp => auth réussie
$auth=true; // auth réussie
$membre->setCivilite($newCivilite); // on set la nouvelle civilite
$membre->setNom($newNom); // on set le nouveau nom
$membre->setPrenom($newPrenom); // on set le nouveau prenom
$membre->setSignature($newSignature); // on set la nouvelle signature
// test mdp
if($newMdp != ""){
// vérification si le mdp n'est pas composé de moins de 7 caractères
if(strlen($newMdp)<7){
$mdpLength=false; // alors la taille du mdp est plus petit que 7
}
// vérification de l'égalité entre newMdp et newMdp confirmation
if($newMdp != $newMdp2){
$mdpEquality=false; // alors les mots de passe ne sont pas semblables
}
if($mdpEquality && $mdpLength){ // si conditions sont remplies
$membre->setPassword(sha1($newMdp));// on set le nouveau mdp
}
}
// test email
if($newEmail != $membre->getEmail()){
// vérification si l'email est disponible
$validateEmail = commonUtils::checkIfEmailExists($newEmail);
if($validateEmail){
$membre->setEmail($newEmail); // on set la nouvelle adresse
}
}
// test DAO update
if($mdpEquality && $mdpLength && $validateEmail){
$update = DAO::update($membre);
if($update==1){ // si toutes les modifs sont effectuées
$validateModif=true; // => modification effectuée
}else{
$this->initialSet($arrayTrue);
}
}else{
$this->initialSet($arrayTrue);
}
}
}
echo json_encode(array("auth"=>$auth, "validateModif"=>$validateModif, "validateEmail"=>$validateEmail, "mdpLength"=>$mdpLength, "mdpEquality"=>$mdpEquality, "needUpdate"=>$needUpdate));
}
Et enfin, dans cette dernière fonction, si je remplace la ligne :
$membre->setSignature($newSignature); // on set la nouvelle signature
par :
$membre->setSignature(""); // on set la nouvelle signature
, et bien cela ne modifie pas la valeur du champ dans la bdd. Mais si, je GET la valeur de l'objet membre , elle sera bien vide soit string "" jusqu'a ce que je déconnecte le membre.