Update : un champ à vide ("") impossible

Petit nouveau ! | 3 Messages

24 sept. 2015, 21:59

Bonjour,

J'ai un formulaire de modification de profil du membre connecté; J'arrive à set l'objet membre avec les nouvelles valeurs une fois le formulaire envoyé ! En actualisant la page, je peux voir que les propriétés de l'objet membre dont la valeur devait être vide, sont bien en string ""; Seulement, dans la bdd, ces champs auront gardés l'ancienne valeur .... En effet, une fois le membre déconnecté puis reconnecté, les valeurs ne sont plus vides, elles n'ont pas été changées !

En résumé : si la nouvelle valeur est différente de "", la modification est effectuée, sinon elle ne l'est pas. Malgré que la valeur soit bien Set , et que les champs sont nullable dans la bdd. De plus, je peux , à partir de phpmyadmin directement, insérer des valeurs vides sans problème.

=> structure de la table ci-dessous : (seul le champs signature pourra être vide mais j'ai ce problème avec tous)
http://static.commentcamarche.net/www.c ... apture.png

Je vous remercie d'avance pour votre aide !

Mammouth du PHP | 2703 Messages

24 sept. 2015, 23:24

c'est le code qui fait la mise à jour de la table dont on a besoin.

Petit nouveau ! | 3 Messages

24 sept. 2015, 23:45

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.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

25 sept. 2015, 22:12

salut,

Est ce que la modif est faite en base après utilisation de DAO::update() ?
si oui => il faut voir autre part que la.
As-tu essayer de debogger la page en pas à pas ? (ide + xdebug ou zend debuger) ?

Si non : que fait DAO::$db->bindValueFromStatement($statement,$key,$value);
Est ce que la méthode bindValueFromStatement de l'objet db vérifie le contenu des données ?

@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 3 Messages

26 sept. 2015, 20:47

Admettons que le membre Harry Potter modifie sont nom de famille par "thmétique" et son prénom par rien soit "". Après l'utilisation de DAO::update(), dans la bdd le nom ce ce membre sera bien thmétique mais son prénom sera encore Harry et non "". Donc oui la modif est faite en base après DAO update.

Non je n'ai pas essayer de debogger, il faut que j'installe xdebug d'ailleurs !

Merci pour votre aide