Bonjour,

J'ai suivi deux tuto mais je n'arrive toujours pas à faire aparaître mon erreur dans le deuxième try.

Voici mon code :

<?php
$m="<br><br>-MESSAGE- Erreur n° :";
function connect()
{
try{
    $a='mysql:host=sql;dbname=chablink';
    $b='chaa';
    $c='%bqc';

    $db=new PDO($a,$b,$c);
    $db->setAttribute(PDO::ATTR_ERRMODE,PDO_ERRMODE_EXCEPTION);
    }
    catch(PDOException $e){echo $m.'e01';} 
    return $db;
}  

// Remplacement du formlulaire
$username='paddfdblo2';
$email='nomail';
$pass='passw'; 
$verif_mail='0';
$maj='2017-01-01';
$affich_mail='0';
$read_pass='read'; 
$user_text='ustxt';
$email_temp='temp';

$v = array(           
'username'    => $username,            
'email'       => $email,
'pass'        => $pass,
'verif_mail'  => $verif_mail,
'maj'         => $maj,
'affich_mail' => $affich_mail,  
'read_pass'   => $read_pass,
'user_text'   => $user_text,
'email_temp'  => $email_temp
);

try
{
$db=connect();  

$s = $db->prepare("ISERT INTO onk_users 
      (username,email,pass,verif_mail,maj,affich_mail,read_pass,user_text,email_temp) 
VALUE (:username,:email,:pass,:verif_mail,:maj,:affich_mail,:read_pass,:user_text,:email_temp)
");

$s->execute($v); 
}
    catch(PDOException $e){echo $m.'e02';}
    //   catch(Exception $e){var_dump($e);}

      echo'<br>FIN';
        ?>

On note ISERT au lieu de INSERT
Aucune réponse d'erreur. Même avec Exception.
Par contre si je fais une erreur à la connection genre
$a='mysql:hot=sql1;dbname=chabaya_onelink';
Alors il m'affiche l'erreur.

J'ai fais différents test dans tous les sens (sauf dans le bon ...)

Bonne journée

8 réponses


Salut

On dirait que ce qu'il y a après le 1er try n'est jamais exécuté à cause du return $db;

Salut,

Comme l'a souligné @SLK, juste après ton premier try, tu as mis un return, donc ta fonction s'arrête là. Le problème est donc là.

Zut, on s'est trompé @betaWeb,
(enfin surtout moi, vu que c'est moi qui ai lancé la fausse piste)

en même temps le code est tellement mal indenté...

<?php
function connect()
{
    try
    {
        $a = 'mysql:host=sql;dbname=chablink';
        $b = 'chaa';
        $c = '%bqc';

        $db = new PDO($a, $b, $c);
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO_ERRMODE_EXCEPTION);
    }
    catch (PDOException $e)
    {
        echo 'catch 1<br>';
        echo $e->getMessage();
    }

    return $db;
}  

// Remplacement du formlulaire
$username = 'paddfdblo2';
$email = 'nomail';
$pass = 'passw'; 
$verif_mail = '0';
$maj = '2017-01-01';
$affich_mail = '0';
$read_pass = 'read'; 
$user_text = 'ustxt';
$email_temp = 'temp';

$v = array(        
    'username'    => $username,            
    'email'       => $email,
    'pass'        => $pass,
    'verif_mail'  => $verif_mail,
    'maj'         => $maj,
    'affich_mail' => $affich_mail,  
    'read_pass'   => $read_pass,
    'user_text'   => $user_text,
    'email_temp'  => $email_temp
);

try
{
    $db = connect();  

    $s = $db->prepare(" ISERT INTO onk_users 
                        (username, email, pass, verif_mail, maj, affich_mail, read_pass, user_text, email_temp) 
                        VALUE (:username, :email, :pass, :verif_mail, :maj, :affich_mail, :read_pass, :user_text, :email_temp)
                      ");

    $s->execute($v); 
}
catch(PDOException $e)
{
    echo 'catch 2<br>';
    echo $e->getMessage();
}

echo'<br>FIN';
?>

j'ai aussi mis des $e->getMessage(),
et laissé la faute volontaire sur le "INSERT"

Une chose qui m'étonne tout de même c'est ça :

$a = 'mysql:host=sql;dbname=chablink';

Dans le manuel de PDO,
on voit la partie "dbname" AVANT la partie "host".
Je ne sais pas si c'est important ou si on peut le faire des 2 manières.
Si tu as toujours une erreur, essaie d'inverser quand même pour voir

Par contre si on regarde plus précisément cette partie : host=sql,
là il y a clairement un problème, le "host" ne peut pas être "sql", c'est censé être une adresse (ou "localhost")

Corrige ça,
laisse les $e->getMessage,
réessaie, et regarde le message d'erreur (et si tu es dans le "catch 1" ou "catch 2")

Indente mieux le code hein,
même pour toi,
mais en particulirer sur un forum quand tu demandes a des gens de lire/comprendre ton code.

le "dbname", c'est "chabaya_onelink", ou "chablink" ?

Et est-ce qu'on voit affiché "FIN" ?

c'est pas PDO_ERRMODE_EXCEPTION mais PDO::ERRMODE_EXCEPTION
de plus Pour passer PDO en mode Exception, il faut le faire lors de l'instanciation de l'objet en lui passant un 4em paramètre sinon c'est trop tard. Si la connection ne peut pas se faire, le setAttribute ne se fera pas

        $db = new PDO($a, $b, $c,  array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
        //$db->setAttribute(PDO::ATTR_ERRMODE, PDO_ERRMODE_EXCEPTION);  

Bien vu l'erreur de syntaxe.

Pour le mode Exception, tu es sur ?
moi j'ai un truc comme ça :

$pdo = new PDO($this->db_type . ':dbname=' . $this->db_name . ';host=' . $this->db_host, $this->db_user, $this->db_pass);
$pdo->exec("SET CHARACTER SET utf8");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Ça semble fonctionner.

@Slk tu as raison ça fonctionne même si setAttribute est fait après la connexion (c'est magique)
PS : maintenant on peut passer le charset directement dans la connectionString

$strConnection = "mysql:host=$db_host;dbname=$db_base;charset=utf8";

Ah ben très bien, je vais faire comme ça. ;)
Merci.

westernz
Auteur

MErci pour tout ça.
Il est vrai que j'était étonné d'entendre qu'un return dans une fonction casé une page entière.

Je vais étudier tout ce que vous avez noté.

Mon host c'ets pas une adresse, c'est un nom d'hote, certainement une gestion propre à mon hebergeur.
Pour l'ordre idem, ca ne cause aucun souci.
Sans le try tout fonctionne nikel.

J'ai pus qu'à vous relire pour tout remettre propre.
MErci.