JeuWeb - Crée ton jeu par navigateur
Une variable provenant d'un attribut dans la BD de type int, ne passe pas le "is_int" - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Une variable provenant d'un attribut dans la BD de type int, ne passe pas le "is_int" (/showthread.php?tid=6414)



Une variable provenant d'un attribut dans la BD de type int, ne passe pas le "is_int" - tghpow - 16-12-2012

Bonsoir les cocos!

Je vais essayer de vous décrire plus amplement mon probleme:

Pour ma page ApercuVillage.php (->détail du village et construction), je commence par construire, et hydrater le village qui doit être détaillé:

Code PHP :
<?php

$villageManager
= new VillageManager($bdd);
if(
$villageManager->exists($idVillage)){
$village= $villageManager->select($idVillage);
}

?>

Ensuite en théorie, j'appelle les differentes méthodes de la classe Village et de VillageManager..M'enfin je devrais faire ca si mon hydratation marcherait! :p

En effet, lorsque je test ce bout de code, voici l'erreur que je trouve:

[Image: 129761Capture.png]

Ce que j'en comprend (pas très français ça..):

C'est que la variable levelBatPrincipal de type int que je recupere via une requête sql dans ma bd, n'est pas considéré comme un int... Probleme :p

Voici ma méthode select de la classe VillageManager:
Code PHP :
<?php
public function select($pidVillage)
{
if(
is_int($pidVillage)){

$rep= $this->_db->query('select * FROM Villages WHERE idVillage = '.$pidVillage);
$donnees = $rep->fetch();

return new
Village($donnees);
}
else{
trigger_error('le parametre n\'est pas un int dans la methode select de la classe Manager Village', E_USER_WARNING);
return;
}
}
?>

Et voici mon constructeur de Village suivi de ma méthode d'hydratation:

Code PHP :
<?php
public function __construct($donnees)
{
$this->hydrate($donnees);
}


public function
hydrate(array $donnees)
{
foreach (
$donnees as $key => $value)
{
$method = 'set'.ucfirst($key);
if (
method_exists($this, $method))
{
$this->$method($value);
}
}
}
?>

Voici ma méthode setLevelBatPrincipal qui effectue le test:
Code PHP :
<?php
public function setLevelBatPrincipal($pLevel)
{
if(
is_int($pLevel))
{
$this->_levelBatPrincipal= $pLevel;
}
else
{
trigger_error('le parametre n\'est pas un int dans la methode setLevelBatPrincipal de la classe Village', E_USER_WARNING);
return;
}
}
?>

Et voici pour finir, la structure de ma table dans phpmyadmin:

[Image: 826310Capture.png]

[...] Quelqu'un comprend où est mon problème?

Dans tout les cas, merci:p

tghpow

PS: J'ai tenté un ptit intval($value) dans l'hydratation avant de balancer la méthode..ca n'a rien donné.


RE: - MicroNotSoft - 17-12-2012

Bonsoir,
as-tu essayé de faire un var_dump() et de l'afficher ?


RE: Une variable provenant d'un attribut dans la BD de type int, ne passe pas - julp - 17-12-2012

C'est normal, tout est renvoyé en strings. Il me semblait qu'en non-émulé ($objetPDO->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE)) les types étaient respectés. Sinon, la seule alternative pour assurer les types, c'est de passer par la méthode bindColumn mais autant dire qu'il faudrait tout reprendre.

Visiblement (après un test), sans l'émulation, ce problème est bien levé.

Du moins, j'évoque ici le pilote mysql, n'ayant pas tous le même comportement.


Re: [sujet trop long] PDO & typage - Xenos - 17-12-2012

Code PHP :
<?php

$i
= '35';
var_dump($i);
var_dump(is_int($i));
var_dump((int)$i);
var_dump(is_int((int)$i));
?>

Renvoie

Citation :string '35' (length=2)

boolean false

int 35

boolean true

Donc si PDO traite bien des strings, alors le is_int est "false".
Personnellement, je préfère lever des exceptions si le typage est incorrect (throw new exception\badParameterType()): cela permet d'éviter l'affichage sur l'écran qui peut être problématique en recette (ou en déploiement du site). Je me suis d'ailleurs construit ma propre classe pour gérer les cast (accompagnée d'interface, 1 pour chaque cast de base, aka string, int, float, double, array, bool): ca simplifie pas mal de choses.

As-tu vraiment besoin de faire ce test "is_int" d'ailleurs? tu peux tout simplement forcer le cast en int: s'il n'est pas possible (car $pLevel est un objet), une erreur sera affichée, et s'il est possible, php le fera très bien...
Code PHP :
<?php
public function setLevelBatPrincipal($pLevel)
{
$this->_levelBatPrincipal= (int)$pLevel;
}
?>



Une variable provenant d'un attribut dans la BD de type int, ne passe pas le "is_int" - tghpow - 17-12-2012

Merci de votre aide,
Je pense faire un cast tout simple comme xenos l'a souligné, si c'est plus simple c'est aussi bienSmile