php + Highcharts.js +从mysql转换为mysqli会导致错误

时间:2014-04-15 05:54:14

标签: php mysql mysqli

有人可以帮助我如何将这些mysql转换为mysqli吗?
我需要这个,因为mysql-extention导致这个警告:
“不推荐使用mysql扩展,将在...中删除”

我尝试了ConvertingTool,但它会响应警告/错误。 我还尝试在google und w3school的帮助下进行转换。

使用旧的已弃用的mysql版本,它看起来像THAT

但如果我尝试使用mysqli-extention,那么图表就不会出现了。

  1. 这是连接器。

    <?php
    define('DB_SERVER',"localhost");
    define('DB_NAME',"Datenbank-Name");
    define('DB_USER',"Datenbank-Username");
    define('DB_PASSWORD',"Datenbank-Passwort");
    
    $conn = mysql_connect(DB_SERVER, DB_USER, DB_PASSWORD);
    if(is_resource($conn))
    {
    mysql_select_db(DB_NAME, $conn);
    mysql_query("SET NAMES 'utf8'", $conn);
    mysql_query("SET CHARACTER SET 'utf8'", $conn);
    }
    
    define("listViewTempPeriod", 24); // Anzeige der Stunden die ausgegeben werden sollen
    define("NUMSENSORS", 2);          // Anzahl der Sensoren deren Werte in der Datenbank stehen
    ?>
    
  2. 功能。

    <?php
    
    function delLastChar($string="")
    {
    $t = substr($string, 0, -1);
    return($t);
    }
    
    function getChartValues($sensorID=0, $timePeriodInHours=24)
    {
    $q_data  = mysql_query("SELECT DATE_FORMAT(datumzeit,'%H') AS STUNDE, sensorwert 
                    FROM arduino_sensorwerte 
                    WHERE sensorid = ".$sensorID." AND datumzeit >= date_sub(now(), interval ".$timePeriodInHours." hour) and datumzeit <= now() 
                    GROUP BY DATE_FORMAT(datumzeit, '%Y-%m-%d %H') 
                    ORDER BY datumzeit DESC") or die(mysql_error()); 
    $n_data = mysql_num_rows($q_data);
    if($n_data > 0)
    {
    $chartValues   = '';
    $stundenValues = '';
    
    while($r_data = mysql_fetch_array($q_data))
    {
    $chartValues   .= $r_data['sensorwert'].',';  // Einzelne Werte durch Komma trennen
    $stundenValues .= $r_data['STUNDE'].',';      // Einzelne Werte durch Komma trennen
    }
    
    $chartValues   = delLastChar($chartValues);     // Komma hinter dem letzten Temperaturwert entfernen
    $stundenValues = delLastChar($stundenValues);   // Komma hinter letzter Stunde entfernen
    
    return array($chartValues, $stundenValues);
    }
    }
    
    function getSensorSettings($sensorID=0)
    {
    $q_data  = mysql_query("SELECT mpcharttype, mplinetype, mpname, mpdescription, mplinecolor 
                      FROM arduino_messpunkte 
                      WHERE messpunktid = ".mysql_real_escape_string($sensorID)) or die(mysql_error()); 
    $n_data = mysql_num_rows($q_data);
    if($n_data > 0)
    {
    $r_data = mysql_fetch_array($q_data);
    
    switch ($r_data['mpcharttype']) 
    {
    case 1:
    $mpChartType = 'spline';
    break;
    case 2:
    $mpChartType = 'line';
    break;
    case 3:
    $mpChartType = 'areaspline';
    break;
    case 4:
    $mpChartType = 'area';
    break;
    case 5:
    $mpChartType = 'column';
    break;    
    case 6:
    $mpChartType = 'bar';
    break;    
    }
    
    switch ($r_data['mplinetype']) 
    {
    case 1:
    $mpLineType = 'solid';
    break;
    case 2:
    $mpLineType = 'ShortDash';
    break;
    case 3:
    $mpLineType = 'ShortDot';
    break;
    case 4:
    $mpLineType = 'ShortDashDot';
    break;
    case 5:
    $mpLineType = 'ShortDashDotDot';
    break;    
    case 6:
    $mpLineType = 'Dot';
    break;
    case 7:
    $mpLineType = 'Dash';
    break;
    case 8:
    $mpLineType = 'LongDash';
    break;
    case 9:
    $mpLineType = 'DashDot';
    break;
    case 10:
    $mpLineType = 'LongDashDot';
    break;
    case 11:
    $mpLineType = 'LongDashDotDot';
    break;              
    }
    
    $mpName = $r_data['mpname'];
    $mpDescription = $r_data['mpdescription'];
    $mpLineColor = $r_data['mplinecolor'];
    
    return array($mpChartType, $mpLineType, $mpName, $mpDescription, $mpLineColor);
    }
    }
    ?>
    
  3. 主页上的“示例”调用:

     <?php
    
     include_once("inc/db.inc.php");
     include_once("inc/functions.inc.php");
    
     if(!isset($_GET['timePeriodInHours'])) $_GET['timePeriodInHours'] = 24; else $_GET['timePeriodInHours'] = $_GET['timePeriodInHours'];
     if(!isset($_GET['chartStyle'])) $_GET['chartStyle'] = 1; else $_GET['chartStyle'] = $_GET['chartStyle'];
    
     $colors = array('#89A54E','#80699B','#3D96AE','#DB843D','#92A8CD','#A47D7C','#B5CA92');
    
     for($i=0;$i<NUMSENSORS;$i++)
     {
       list($chartValues[], $stundenValues[]) = getChartValues($i+1, $_GET['timePeriodInHours'], 1);
     }
    
     $stundenValues = $stundenValues[0];
     ?>
     <!DOCTYPE html>
     <html>
       <head>
         <title>Sensoren &Uuml;bersicht</title>
         <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
         <meta http-equiv="refresh" content="300">
         <meta name="Robots" content="index,follow">
         <link rel="stylesheet" type="text/css" href="css/highcharts.css">
         <script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
    
     <script type="text/javascript">
     $(function () 
     {
       var chart;
    
       $(document).ready(function() 
       {        
         chart = new Highcharts.Chart(
         {
           chart: 
           {
             renderTo: 'container'
           },
           title: 
           {
             text: 'Temperaturwerte der letzten <?php echo $_GET['timePeriodInHours'];?> Stunden'
           },
           subtitle: 
           {
             text: 'Alle Messstellen'
           },
           xAxis: 
           {
             title:
             {
               text: ''
             },
             categories: [<?php echo $stundenValues;?>]
           },      
           yAxis:
           {   
             title: 
             {
               text: ''         
             },      
             labels: 
             {
               formatter: function() 
               {
                 return this.value +'°C'
               }
             }
           },
           tooltip: 
           {
             crosshairs: true,
             shared: true
           },
           tooltip: 
           {
             formatter: function() 
             {
               return '<b>'+ this.series.name +'</b>'+this.x +' Uhr:  '+ this.y +'°C';
             }
           },  
           legend: 
           {
             enabled: true
           },
           credits:
           {
             enabled: false
           },
           series:
           [
     <?php 
           for($i=0;$i<=NUMSENSORS;$i++)
           {
             if(!empty($chartValues[$i]))
             {
               list($mpChartType, $mpLineType, $mpName, $mpDescription, $mpLineColor) = getSensorSettings($i+1);
     ?>        {
                 type: '<?php echo $mpChartType;?>',
                 dashStyle: '<?php echo $mpLineType;?>',
                 name: '<?php echo $mpName;?>', 
                 color: '#<?php echo $mpLineColor;?>', 
                 data: [<?php echo $chartValues[$i];?>],
                 marker: 
                 {
                   symbol: 'square',
                   enabled: false,
                   states: 
                   {
                     hover: 
                     {
                       symbol: 'square',
                       enabled: true,
                       radius: 8
                     }
                   }
                 }    
               },
     <?php  
             }
           } //for 
     ?>
           ] //series      
         });
       });  
     });
     </script>
    
       </head>
     <body>
    
     <div id="wrapper">
       <script src="es_scripts/highcharts.js"></script>
       <div id="container"></div>
     </div>
    
     </body>
     </html>
    

2 个答案:

答案 0 :(得分:-2)

如果您要将代码转换为mysqli_*,则应采用prepared statement方式。

让我们在db.inc.php中重新建立您的MySQL连接:

<?php

  $conn = new mysqli("localhost", "Datenbank-Username", "Datenbank-Passwort", "Datenbank-Name");

  /* CHECK CONNECTION */
  if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
  }

  /* CHANGE CHARACTER SET TO utf8 */
  if (!$conn->set_charset("utf8")) {
    printf("Error loading character set utf8: %s\n", $mysqli->error);
    exit();
  } else {
    printf("Current character set: %s\n", $mysqli->character_set_name());
  }

  define("listViewTempPeriod", 24); // Anzeige der Stunden die ausgegeben werden sollen
  define("NUMSENSORS", 2);          // Anzahl der Sensoren deren Werte in der Datenbank stehen

?>

存储函数的文件(functions.inc.php):

<?php

  function delLastChar($string="")
  {
    global $conn;
    $t = substr($string, 0, -1);
    return($t);
  }

  function getChartValues($sensorID=0, $timePeriodInHours=24)
  {

    global $conn;

    if($stmt = $conn->prepare("SELECT DATE_FORMAT(datumzeit, '%H') AS STUNDE, sensorwert FROM arduino_sensorwerte WHERE sensorid = ? AND datumzeit >= date_sub(NOW(), interval ? hour) AND datumzeit <= NOW() GROUP BY DATE_FORMAT(datumzeit, '%Y-%m-%d %H') ORDER BY datumzeit DESC")){
      $stmt->bind_param("ii", $sensorID, $timePeriodInHours);
      $stmt->execute();
      $stmt->store_result();
      $n_data = $stmt->num_rows;
      $stmt->bind_result($stunde, $sensorwert);

      $chartValues = '';
      $stundenValues = '';

      while($stmt->fetch()){

        $charValues    = $sensorwert;
        $stundenValues = $stunde;

      } /* END OF WHILE LOOP */
      $stmt->close();
    } /* END OF PREPARED STATEMENT */

    $chartValues   = delLastChar($chartValues);     // Komma hinter dem letzten Temperaturwert entfernen
    $stundenValues = delLastChar($stundenValues);   // Komma hinter letzter Stunde entfernen

    return array($chartValues, $stundenValues);

  } /* END OF getChartValues FUNCTION */

  function getSensorSettings($sensorID=0)
  {

    global $conn;

    $stmt = $conn->prepare("SELECT mpcharttype, mplinetype, mpname, mpdescription, mplinecolor FROM arduino_messpunkte WHERE messpunktid = ?");
    $stmt->bind_param("i", $sensorID);
    $stmt->execute();
    $stmt->store_result();
    $n_data = $stmt->num_rows;
    $stmt->bind_result($mpcharttype, $mplinetype, $mpName, $mpDescription, $mpLineColor);

    if($n_data > 0)
    {
      while($stmt->fetch()){

        switch ($mpcharttype) 
        {
          case 1:
            $mpChartType = 'spline';
            break;
          case 2:
            $mpChartType = 'line';
            break;
          case 3:
            $mpChartType = 'areaspline';
            break;
          case 4:
            $mpChartType = 'area';
            break;
          case 5:
            $mpChartType = 'column';
            break;    
          case 6:
            $mpChartType = 'bar';
            break;    
          } /* END OF FIRST SWITCH */

        switch ($mplinetype) 
        {
          case 1:
            $mpLineType = 'solid';
            break;
          case 2:
            $mpLineType = 'ShortDash';
            break;
          case 3:
            $mpLineType = 'ShortDot';
            break;
          case 4:
            $mpLineType = 'ShortDashDot';
            break;
          case 5:
            $mpLineType = 'ShortDashDotDot';
            break;    
          case 6:
            $mpLineType = 'Dot';
            break;
          case 7:
            $mpLineType = 'Dash';
            break;
          case 8:
            $mpLineType = 'LongDash';
            break;
          case 9:
            $mpLineType = 'DashDot';
            break;
          case 10:
            $mpLineType = 'LongDashDot';
            break;
          case 11:
            $mpLineType = 'LongDashDotDot';
            break;              
        } /* END OF SECOND SWITCH */

      } /* END OF WHILE LOOP */

      return array($mpChartType, $mpLineType, $mpName, $mpDescription, $mpLineColor);

    } /* END OF CHECKING NUMBER OF RESULTS */

  } /* END OF getSensorSettings FUNCTION */

?>

如果您希望查询只有一行结果,则不需要再循环它。

答案 1 :(得分:-2)

  

我需要这个,因为mysql-extention导致这个警告:
  “不推荐使用mysql扩展,将在...中删除”

只需在config / bootstrap文件中添加/更改此代码

即可
error_reporting(E_ALL & ~E_DEPRECATED);

并且此错误将消失。

“它没有解决问题”? - 哦,是的。

但问题不在于你认为的问题。

要解决真正的问题,您必须花费大量时间,因为首先需要花费几年的时间来学习编程,然后花一些时间来完成REWRITE代码。因为这段代码唯一的问题是它过时且不安全的DESIGN。

它的设计是你真正需要改变的,而不是简单的API调用。

  • 如果你准备好了 - 好吧,慢慢来。但是在学习和重写时,您可以使用此选项作为临时解决方案。
  • 如果您不是 - 请保留此选项。因为从一个API到另一个API的机械转换无论如何都不会有任何好处,因此保持这段代码不安全。