Probleme de variable avec google charts

Résolu
Bonjour a tous

J ai le script suivant qui fonctionne très bien quand je renseigne la variable $mes_opcion = 03;
Mais quand je veux utiliser $mes_opcion = $_SESSION['mes']; j ai l'erruer suivante: Notice: Array to string conversion in C:\wamp\www\PW\LCDC\fr\new3.php on line 15 et Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in C:\wamp\www\PW\LCDC\fr\new3.php on line 21.
Merci pour votre aide.
voici le code

<?php
//Démarrage des sessions
session_start ();

// Conectamos base de datos
$conexion = mysql_connect('localhost', 'root', '')
or die('No se pudo conectar: ' . mysql_error());
mysql_select_db('meteo_test_3') or die('No se pudo seleccionar la base de datos');
 
$_SESSION['mes'] = $_POST['mes'];
$mes_opcion = $_SESSION['mes'];
//$mes_opcion = 03;
print_r(array_values($mes_opcion)); // donne Array ( [0] => 03 ) 

//preparamos la consulta
$SQLDatos = "SELECT * FROM meteo WHERE MONTH(fecha) = $mes_opcion";

 
//ejecutamos la consulta
$result = mysql_query($SQLDatos);
//obtenemos número filas
$numFilas = mysql_num_rows($result);
 
//cargamos array con los nombres de las métricas a visualizar
$datos[0] = array('lluvia','fecha');
 
//recorremos filas
for ($i=1; $i<($numFilas+1); $i++)
{
    $datos[$i] = array(mysql_result($result, $i-1, "fecha"),
    (int) mysql_result($result, $i-1, "lluvia"));
}

print_r(array_values($datos)); //donne ce resultat avec mes_opcion =03 ==>   Array ( [0] => Array ( [0] => lluvia [1] => fecha ) [1] => Array ( [0] => 2017-03-14 [1] => 10 ) [2] => Array ( [0] => 2017-03-14 [1] => 40 ) [3] => Array ( [0] => 2017-03-15 [1] => 5 ) [4] => Array ( [0] => 2017-03-17 [1] => 5 ) [5] => Array ( [0] => 2017-03-30 [1] => 20 ) [6] => Array ( [0] => 2017-03-31 [1] => 91 ) )

mysql_close($conexion);
?>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js" > </script>
<!-- Load the AJAX API -->
<script type="text/javascript" src="https://www.google.com/jsapi" > </script>
<script type="text/javascript"
src="https://www.google.com/jsapi?autoload={
'modules':[{
'name':'visualization',
'version':'1',
'packages':['corechart']
}]
}"></script>
 
<script type="text/javascript">
google.setOnLoadCallback(drawChart);
 
function drawChart() {
 
//cargamos nuestro array $datos creado en PHP para que se puede utilizar en JavaScript
var cargaDatos = <?php echo json_encode($datos); ?>;
 
var datosFinales = google.visualization.arrayToDataTable(cargaDatos);
 
var options = {
title: 'Ejemplo gráfica',
curveType: 'function',
legend: { position: 'bottom' }
};
 
var chart = new google.visualization.LineChart(document.getElementById('curve_chart'));
 
chart.draw(datosFinales, options);
}
 
</script>
</head>
<body>
<div id="curve_chart" style="width: 900px; height: 500px"></div>
</body>
</html>

7 réponses

  1. Contributeur
    bonsoir, je suggère de remplacer
    $_SESSION['mes'] = $_POST['mes'];
    $mes_opcion = $_SESSION['mes'];
    //$mes_opcion = 03;
    print_r(array_values($mes_opcion)); // donne Array ( [0] => 03 ) 

    par
    $mes_opcion = intval($_POST['mes']);
    print_r($mes_opcion);
    1. Modérateur
      Bonjour,

      1 - On récupère PROPREMENT les variables avant de les utiliser
      $_SESSION['mes'] = $_POST['mes'];
      $mes_opcion = $_SESSION['mes'];
      

      devient :
      $mes = !empty($_POST['mes']) ? $_POST['mes'] : (!empty($_SESSION['mes']) ? $_SESSION['mes'] : NULL);
      $_SESSION['mes'] = $mes;
      
      //la valeur se trouve dans un array...
      // tu le dis toi même dans ton print_r
      //print_r(array_values($mes_opcion)); // donne Array ( [0] => 03 ) 
      //il faut donc extraire la donnée de l'array !
      $mes_opcion = !empty($mes) ? $mes[0] : NULL;
      


      2 - Tu utilises l'ancienne extension mysql considérée comme OBSOLETE !
      Je t'invite vivement à passer à PDO ou mysqli

      3 - En attendant que tu passes à pdo ou mysqli ... pense à gérer les erreurs au niveau des requête...
      par exemple :
      $result = mysql_query($SQLDatos) or die(mysql_error());
      


      4 - Pense à activer l'affichage des erreurs de code...
      Il faut ajouter ces deux lignes au tout début de ton fichier php (juste après le <?php

      //-------------------------------------//
      // Affichage des erreurs PHP
      //-------------------------------------//
      error_reporting(E_ALL);
      ini_set('display-errors','on');
      


      Cordialement, 
      Jordane                                                                 
      1. Bonjour Jordane.

        Merci pour ta réponse.

        J'ai effectué quelques modifications.
        Dans l'array retourné il manque la date(fecha).
        voici le code modifié.

        <?php
        //Démarrage des sessions
        session_start ();
        
        //Affichage des erreurs PHP
        error_reporting(E_ALL);
        ini_set('display-errors','on');
        
        
        // REQUIRE
        
        require_once ('connexion.php');
        
        
        //Récupération des variables AVANT de les utiliser
        $mes_opcion  = !empty($_POST['mes']) ? $_POST['mes'] : (!empty($_SESSION['mes']) ? $_SESSION['mes'] : NULL);
        $_SESSION['mes'] = $mes_opcion ;
        print_r(array_values($mes_opcion)); // renvoi Array ( [0] => 03 ) ==> valeurs correctes
        
        
        //Traitement
        $sql = 'SELECT fecha, lluvia FROM meteo WHERE MONTH(fecha) = 03 ';
        $datas = array($mes_opcion[0]);
        
        try{
          $req = $connexion->prepare($sql);
          $req->execute($datas);
          $row = $req->fetchAll(PDO::FETCH_ASSOC); //on stocke les données dans un ARRAY
        }catch(Exception $e){
          echo "Erreur ! ".$e->getMessage();
        }
        
        $datos_lluvia = array();
        if(!empty($row)){
          //On parcours l'array
          foreach($row as $R)  {
            $datos_lluvia[] = (float)$R['lluvia'];
          }
        }else{
          echo " La requête n'a pas retournée de données.... ";
        }
        
        print_r(array_values($datos_lluvia)); // renvoi Array ( [0] => 10 [1] => 40 [2] => 5 [3] => 5 [4] => 20 [5] => 91 ) ==> valeurs correctes mais il manque la date
        
        $req->closeCursor();
        ?>
        
        
        
        <html>
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js" > </script>
        <!-- Load the AJAX API -->
        <script type="text/javascript" src="https://www.google.com/jsapi" > </script>
        <script type="text/javascript"
        src="https://www.google.com/jsapi?autoload={
        'modules':[{
        'name':'visualization',
        'version':'1',
        'packages':['corechart']
        }]
        }"></script>
         
        <script type="text/javascript">
        google.setOnLoadCallback(drawChart);
         
        function drawChart() {
         
        //cargamos nuestro array $datos_lluvia creado en PHP para que se puede utilizar en JavaScript
        var cargaDatos = <?php echo json_encode($datos_lluvia); ?>;
         
        var datosFinales = google.visualization.arrayToDataTable(cargaDatos);
         
        var options = {
        title: 'Precipitacion',
        curveType: 'function',
        legend: { position: 'bottom' }
        };
         
        var chart = new google.visualization.LineChart(document.getElementById('curve_chart'));
         
        chart.draw(datosFinales, options);
        }
         
        </script>
        </head>
        <body>
        <div id="curve_chart" style="width: 900px; height: 500px"></div>
        </body>
        </html>
        
        1. Modérateur
          Donc c'est bon ??
          Tu mettras le sujet en RESOLU dans ce cas.
      2. Nonn. Le graphique ne s'affiche pas
        1. Modérateur
          Mais là c'est peut-être bien un souci côté javascript ....
          As tu regardé dans la console si tu n'avais pas de message d'erreur ???
          As tu regardé (via un console.log) ce que vaut ta variable cargaDatos dans ton code js ?
          As tu regardé (via un console.log) ce que vaut ta variable datosFinales ?
      3. effectivement, console.log(cargaDatos); ne renvoi rien.
        1. Modérateur
          et , si dans ton code, avant le javascript tu ajoutes
           
          echo "<pre>datos_lluvia :<br>";
          print_r($datos_lluvia);
          echo " en Json => " . json_encode($datos_lluvia);
          echo "</pre>";
          


          Qu'est-ce que ça t'affiche ?
      4. J ai mis ta partie de code juste avant $req->closeCursor();

        ca m'affiche

        datos_lluvia :
        Array
        (
        [0] => 10
        [1] => 40
        [2] => 5
        [3] => 5
        [4] => 20
        [5] => 91
        )
        en Json => [10,40,5,5,20,91]
        1. Modérateur
          Et le
          console.log(cargaDatos);
          placé juste après la déclaration de la variable dans ton js ne donne rien ??
        2. @jordane45Non console.log(cargaDatos); placé juste après la déclaration de la variable ne donne rien.

          //cargamos nuestro array $datos_lluvia creado en PHP para que se puede utilizar en JavaScript
          var cargaDatos = <?php echo json_encode($datos_lluvia); ?>;
          console.log(cargaDatos);
          var datosFinales = google.visualization.arrayToDataTable(cargaDatos);
        3. Modérateur
          @mont_dani
          //cargamos nuestro array $datos_lluvia creado en PHP para que se puede utilizar en JavaScript
          var cargaDatos = <?php echo json_encode($datos_lluvia); ?>;
          console.log( " cargaDatos : " );
          console.log(cargaDatos);
          var datosFinales = google.visualization.arrayToDataTable(cargaDatos);
          

          et comme ça ? Tu vois quelque chose ou non ? Tu n'as pas messages d'erreurs dans la console ?
        4. @jordane45C est pareil.

          Excuse moi parceque tu me l'avait dit dans le mesage precedent et je ne l'avait pas regardé.

          En faisant F12, j ai cela:

          jsapi:22 A Parser-blocking, cross site (i.e. different eTLD+1) script, https://www.google.com/uds/api/visualization/1.0/40ff64b1d9d6b3213524485974f36cc0/format+es,default+es,ui+es,corechart+es.I.js is invoked via document.write. The network request for this script MAY be blocked by the browser in this or a future page load due to poor network connectivity. If blocked in this page load, it will be confirmed in a subsequent console message.See https://www.chromestatus.com/feature/5718547946799104 for more details.

          new3.php:52 Array(6)
          new3.php:53 cargaDatos :

          Uncaught Error: First row is not an array.
          at gvjs_oba (format+es,default+es,ui+es,corechart+es.I.js:272)
          at Object.gvjs_Cl [as arrayToDataTable] (format+es,default+es,ui+es,corechart+es.I.js:274)
          at drawChart (new3.php:54)
      5. Modérateur
        Bonjour,

        J'ai trouvé le souci je pense....
        Tu as placé l'initialisation de ta variable dans ta fonction ....
        Essayes de la placer en dehors...
         <?php
        //Démarrage des sessions
        session_start ();
        
        //Affichage des erreurs PHP
        error_reporting(E_ALL);
        ini_set('display-errors','on');
        
        
        // REQUIRE
        
        require_once ('connexion.php');
        
        
        //Récupération des variables AVANT de les utiliser
        $mes_opcion  = !empty($_POST['mes']) ? $_POST['mes'] : (!empty($_SESSION['mes']) ? $_SESSION['mes'] : NULL);
        $_SESSION['mes'] = $mes_opcion ;
        print_r(array_values($mes_opcion)); 
        
        
        //Traitement
        $sql = 'SELECT fecha, lluvia FROM meteo WHERE MONTH(fecha) = ? ';
        $datas = array($mes_opcion[0]);
        
        try{
          $req = $connexion->prepare($sql);
          $req->execute($datas);
          $row = $req->fetchAll(PDO::FETCH_ASSOC); //on stocke les données dans un ARRAY
        }catch(Exception $e){
          echo "Erreur ! ".$e->getMessage();
        }
        
        $datos_lluvia = array();
        if(!empty($row)){
          //On parcours l'array
          foreach($row as $R)  {
            $datos_lluvia[] = (float)$R['lluvia'];
          }
        }else{
          echo " La requête n'a pas retournée de données.... ";
        }
        
        print_r(array_values($datos_lluvia));
        echo "<pre>datos_lluvia :<br>";
        
        print_r($datos_lluvia);
        echo " en Json => " . json_encode($datos_lluvia);
        echo "</pre>";
        $req->closeCursor();
        ?>
        
        
        
        <html>
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js" > </script>
        
        <!-- Load the AJAX API -->
        <script type="text/javascript" src="https://www.google.com/jsapi" > </script>
        <script type="text/javascript"
        src="https://www.google.com/jsapi?autoload={
        'modules':[{
        'name':'visualization',
        'version':'1',
        'packages':['corechart']
        }]
        }"></script>
         
        <script type="text/javascript">
         var cargaDatos = <?php echo json_encode($datos_lluvia); ?>;
          console.log(cargaDatos);
          console.log( " cargaDatos : " );
         
         google.setOnLoadCallback(drawChart);
        
        function drawChart() {
         
          var datosFinales = google.visualization.arrayToDataTable(cargaDatos);
         
          var options = {
                 title: 'Precipitacion',
                 curveType: 'function',
                 legend: { position: 'bottom' }
               };
         
         var chart = new google.visualization.LineChart(document.getElementById('curve_chart'));
         
         chart.draw(datosFinales, options);
         }
          </script>
        </head>
        <body>
        <div id="curve_chart" style="width: 900px; height: 500px"></div>
        </body>
        </html>
        


        Peux-tu également t'assurer que ton fichier est bien encodé en utf8 sans bom ( voir chapitre 1 : https://forums.commentcamarche.net/forum/affich-37584944-php-html-caracteres-accentues-et-l-utf8 )
        1. Modérateur
          Sinon tu peux aussi essayer avec cette syntaxe
          var cargaDatos ="<?php print(json_encode($datos_lluvia)); ?>";
          
          
        2. @jordane45Merci pour ton aide.

          J'ai trouvé le souci je pense....
          Tu as placé l'initialisation de ta variable dans ta fonction ....
          Essayes de la placer en dehors...

          Cela ne change rien. même message en console.

          Peux-tu également t'assurer que ton fichier est bien encodé en utf8 sans bom
          Je te confirme que mon fichier est bien en utf8.

          Sinon tu peux aussi essayer avec cette syntaxe
          var cargaDatos ="<?php print(json_encode($datos_lluvia)); ?>";

          Cela ne change rien. même message en console.

          J'ai passé la journée a fiare des recherches et essais, mais en vain.

          Aurais-tu une autre idée?
        3. Modérateur
          Première chose :
          pourrais tu tester ce script et me dire ce que ça te donne ?
          <?php
          
          $datos_lluvia = array();
          foreach($R=1;$R<=10;$R++)  {
              $datos_lluvia[] = $R * 10;
          }
          
          ?>
          
          <!doctype html>
          <html lang="<?=$langDefaut?>">
           <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
           </head>
           <body>
           
           <script type="text/javascript">
            var datos_lluvia = <?php echo json_encode($datos_lluvia); ?>;
            console.log("datos_lluvia :");
            console.log(datos_lluvia);
           </script>
           </body>
           </html>
          


          Deuxième chose .... place ton code javascript à la fin de ta page (avant le </body>) et non dans le head....
        4. Modérateur
          @jordane45ah.. et puis... au lieu d'aller charger les librairies javascript sur le site de google... je te conseille de tes télécharger dans ton site et de les instancier directement...
          donc au lieu d'avoir :
          <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js" > </script>
          <!-- Load the AJAX API -->
          <script type="text/javascript" src="https://www.google.com/jsapi" > </script>
          

          Tu place le contenus des scripts en "local" sur ton serveur.. et tu modifies les lignes de code pour pointer dessus
          <script src="chemin_vers_le_fichier/jquery.min.js" > </script>
          <!-- Load the AJAX API -->
          <script type="text/javascript" src="chemin_vers_le_fichier/jsapi" > </script>