8722 sujets

Développement web côté serveur, CMS

Bonjour ,

Si j'ai une erreur de connexion à une base de données due à une erreur dans la variable DSN comme dans l'exemple ci-dessous où le host est faux
$host = "localhost1";
    $dbname = "tableTest";    
    $dsn = "mysql:host=". $host.";dbname=".$dbname;
    $username = 'root';
    $password = '';
        $dbConnect = new PDO($dsn, $username, $password, $options);


Coté JS, cela est traité en ERROR car la responseText est polluée par des infos qui font que les données ne sont plus au format JSON (cf. ci-dessous)
<br />
<font size='1'><table class='xdebug-error xe-warning' dir='ltr' border='1' cellspacing='0' cellpadding='1'>
<tr><th align='left' bgcolor='#f57900' colspan="5"><span style='background-color: #cc0000; color: #fce94f; font-size: x-large;'>( ! )</span> Warning: PDO::__construct():  in C:\wamp\www\projetLaPaire\dbConnect.php on line <i>24</i></th></tr>
<tr><th align='left' bgcolor='#e9b96e' colspan='5'>Call Stack</th></tr>
<tr><th align='center' bgcolor='#eeeeec'>#</th><th align='left' bgcolor='#eeeeec'>Time</th><th align='left' bgcolor='#eeeeec'>Memory</th><th align='left' bgcolor='#eeeeec'>Function</th><th align='left' bgcolor='#eeeeec'>Location</th></tr>
<tr><td bgcolor='#eeeeec' align='center'>1</td><td bgcolor='#eeeeec' align='center'>0.2268</td><td bgcolor='#eeeeec' align='right'>147384</td><td bgcolor='#eeeeec'>{main}(  )</td><td title='C:\wamp\www\projetLaPaire\logInTest.php' bgcolor='#eeeeec'>..\logInTest.php<b>:</b>0</td></tr>
<tr><td bgcolor='#eeeeec' align='center'>2</td><td bgcolor='#eeeeec' align='center'>21.8945</td><td bgcolor='#eeeeec' align='right'>151784</td><td bgcolor='#eeeeec'>dbConnection(  )</td><td title='C:\wamp\www\projetLaPaire\logInTest.php' bgcolor='#eeeeec'>..\logInTest.php<b>:</b>17</td></tr>
<tr><td bgcolor='#eeeeec' align='center'>3</td><td bgcolor='#eeeeec' align='center'>21.8946</td><td bgcolor='#eeeeec' align='right'>152872</td><td bgcolor='#eeeeec'><a href='http://www.php.net/PDO.construct' target='_new'>__construct</a>
( ???, ???, ???, ??? )</td><td title='C:\wamp\www\projet\dbConnect.php' bgcolor='#eeeeec'>..\dbConnect.php<b>:</b>24</td></tr>
</table></font>
{"message":"SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Hôte inconnu. "}"

Même si le message d'erreur est bien au format JSON {"message":"SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Hôte inconnu. "}"

Ma question est comment nettoyer au niveau serveur (PHP) la variable retournée via echo pour n'avoir que mon message d'erreur au format JSON {"message":"SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Hôte inconnu. "}"

Merci pour vos retours

Modifié par informer (26 Jun 2014 - 08:27)
Tu as plusieurs solutions. De la plus propre à la plus crado, il y a :

1 - Demander à PDO pour que les erreurs soient transmises sous forme d'exceptions
Voir les options passables au constructeur de PDO dans le tableau supplémentaire des options, je n'ai pas de moyen de faire une URL automatique, et je ne connais pas par coeur le nom de l'option.

2 - Désactiver l'affichage automatique de toutes les erreurs
error_reporting

3 - Buffériser la sortie et nettoyer manuellement le contenu à postériori
ob_start
ob_get_contents
ob_end_clean

4 - Passer en mode vraiment crado&craignos / quick&dirty
echo '/*';
...
echo '*/';

Bien entendu je te recommande d'appliquer en priorité la première.
Modifié par QuentinC (26 Jun 2014 - 10:03)
bonjour à tous,

merci pour votre aide mais mon code a toujours été avec try/catch et c'et pourquoi je ne comprends pas comment du code polluant est ajouté aux données au format JSON
<?php
start_session();
require("dbconnect.php"); 

try {
     $db = dbConnect(); // dans dbconnect.php et correspondant au code du 1er post 
    dRturn = '{"message":"OK"}';
} catch (Exception $e) {
    dRturn = '{"message":"$e->getMessage()"}'; // message d'erreur = SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Hôte inconnu.
}
echo dRturn;
php>


Et sous xdebug avec NetBean, j'ai bien pour dRturn
{"message":"SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Hôte inconnu. "}"


alors pourquoi in fine sous JS, j'ai des données polluantes en plus des données au format JSON?

Faut-il regarder le fichier php.ini ou ailleurs ???
Modifié par informer (26 Jun 2014 - 19:45)
Non, il faut explicitement indiquer à PDO que tu ne veux que des exceptions et pas des warnings à l'ancienne. Ca se fait avec une option à passer dans le tableau des options au constructeur de PDO.
informer a écrit :

alors pourquoi in fine sous JS, j'ai des données polluantes en plus des données au format JSON?


Quentin t'as donné la réponse.
salut QuentinC

merci pour cette info, mais quelle est cette option svp car mon code est :
<?php
function dbConnection()
{   $options = array( 
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_EMULATE_PREPARES => false,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",
    );
    $host = "localhost1";
    $dbname = "questionnaire1";    
    $dsn = "mysql:host=". $host.";dbname=".$dbname; 
    $username = 'root';
    $password = '';
        $dbConnect = new PDO($dsn, $username, $password, $options);
    return $dbConnect;
 }
?>
Bonsoir FraiseTagada99

Bon, faut m'expliquer car
1 - Je veux récupérer le message d'erreur "SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Hôte incon nu", renvoyé par la gestio d'erreur PDO;
2- Il faut donc PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ce qui signifie que ERRMODE_WARNING est désactivé car je pense a priori que les 3 modes sont exclusifs

De plus utilisant X-Debug avec NetBean, j'ai pu vérifier que $e->getMessage() ne renvoie que le message "SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Hôte inconnu", sans code HTML

Il faut donc développer un peu plus pour m'expliquer pourquoi dans le responseText, il y a du code HTML EN PLUS de mes données au format JSON (Cf. 1er post de cette discussion) Smiley sweatdrop

Merci
Modifié par informer (27 Jun 2014 - 00:08)
informer a écrit :

Il faut donc développer un peu plus pour m'expliquer pourquoi dans le responseText, il y a du code HTML EN PLUS de mes données au format JSON (Cf. 1er post de cette discussion) Smiley sweatdrop


Le HTML est rajouté par XDebug pour styliser l'affichage des erreurs PHP dans le navigateur. Et comme tu as une erreur dans ton code tu reçois le message d'erreur au format HTML dans le résultat de ta requête AJAX. C'est pas pour rien qu'on te dis de revoir ta gestion et affichage des erreurs.
Modifié par FraiseTagada99 (27 Jun 2014 - 00:51)
Bonjour FraiseTagada99

Merci pour enfin une réponse simple et qui m'explique d'où provient cet ajout de texte !!!

Mais voilà avec une erreur de host sur mon hébergeur One.com et donc SANS XDEBUG, le message d'erreur est celui-ci
" Warning: PDO::__construct(): php_network_getaddresses: getaddrinfo failed: Name or service not known in /customers/3/6/0/itglobalsolution.fr/httpd.www/web/dbConnect.php on line 24Warning: PDO::__construct(): [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known (trying to connect via tcp://itglobalsolution1.fr.mysql:3306) in /customers/3/6/0/itglobalsolution.fr/httpd.www/web/dbConnect.php on line 24{"message":"SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known"}"


Le warning me fait penser aux paramètres à passer lors de la connexion PDO.

Quand je passe PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, le ERRMODE_WARNING est il d’emblée désactivé ou faut-il le rendre EXPLICITEMENT inactif. Si je dois le faire explicitement, là je ne sais pas comment faire?

Merci pour ton aide et ta réponse Smiley bawling
D'après le message d'erreur tu as un problème lorsque tu instancie l'objet PDO. Tu peux nous montrer ton code (dbconnect.php) ?
Modifié par FraiseTagada99 (01 Jul 2014 - 18:38)
D'après le message d'erreur, c'est l'URL de connexion qui semble mauvaise.
Pour MySQL, elle doit ressembler à: "mysql:host=$host;dbname=$dbname"
En tout cas c'est la variante qui fonctionne chez moi, php 5.4, mysql 5.5.
Bonjour tout le monde,

Le problème n'est pas d'identifier la cause de l'erreur car elle provient bien de la chaine de caractère affectée à ma variable host que j'ai volontairement erroné.

Mon problème est de forcer par je sais quelle méthode la disparition du code polluant des informations passées au format JSON lors de l'appel de la commande ECHO
echo $returnData;

Mon code est le suivant
function logIn()
{   alert("connexion debut");
    try
    {	/* Manipuler un objet avec JQuery : $(#idObject).propriétés/méthodes  */
            var serialData = $( "#frmLogIn" ).serialize();
            $.ajax
            (   {   type: "POST",
                    url: "logIn.php",
                    data: serialData,
                    dataType: "json",
                    success: function(dataSQL, statut)
                    {   if (dataSQL.length>0)
                        {   var page = "formulaire.html" ;
                            window.location.replace(page);
                        }else
                        {   var msgText = "Profil ou mot de passe invalide"
                            $("#txtError").val(msgText);
                        }
                    },
                    error: function(dataSQL, statut)
                    {   alert ("Erreur : " + statut);
                    }
                }
            );
    }
    catch (e)
    {   alert ('Erreur : '+ e.message);
    }
}


J'avais dans la page php ci-dessus les instructions suivantes.
error_reporting(E_ALL);
ini_set( 'display_errors','1');

Puis je les ai supprimées. Mais cela suffit-il à les désactiver ou faut-il le désactiver de façon explicite au moins une fois avec :
error_reporting(NULL);
ini_set( 'display_errors','0');

Même si le help desk de mon hébergeur me précise que ces 2 instructions ne modifie que le configuration.php et sont valides que pour du Joomla, et enfin que pour inhiber ces 2 instructions il suffit de les supprimer du code.

et logIn.php
<?php
session_start();

require "dbConnect.php";

$user = urldecode($_POST["txtUser"]);
$pwd = urldecode($_POST["txtpwd"]);

$sqlSelect = " SELECT * FROM participant WHERE USER = '$user' AND PWD = '$pwd'";

try
{   $dbConnect = dbConnection();
    $dataSet = $dbConnect->query($sqlSelect);
    $rowsArray = $dataSet->fetchAll();
    $returnData =  json_encode($rowsArray);	
    if (count($rowsArray)>0)
    {   $_SESSION["userID"] = $rowsArray[0]["IDPARTICIPANT"];  
    }
 
}catch (PDOException $e)
{   $stringVar = utf8_encode($e->getMessage());
    $msg =  array("message" =>  $stringVar);
    $returnData = preg_replace("/\\\\u([a-f0-9]{4})/e", "iconv('UCS-4LE','UTF-8',pack('V', hexdec('U$1')))", json_encode($msg));
}
$dbConnect = null;// Fermeture connexion
file_put_contents('log.txt', "log : ".$returnData);
echo $returnData;
?>


avec dbConnect.php
 <?php
function dbConnection()
{   $options = array( 
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_EMULATE_PREPARES => false,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",
    );

    $host = "XXXXX.fr.mysql";
    $dbname = "XXXX";	
    $dsn = "mysql:host=". $host.";dbname=".$dbname; 
    $username = 'XXXXX';
    $password = 'XXXX';

    $dbConnect = new PDO($dsn, $username, $password, $options);
    return $dbConnect;
 }
?>

Modifié par informer (02 Jul 2014 - 09:54)