【问题标题】:php + Highcharts.js + convert from mysql to mysqli causes error [duplicate]php + Highcharts.js +从mysql转换为mysqli导致错误[重复]
【发布时间】:2014-05-29 07:56:37
【问题描述】:

有人可以帮我把那些 mysql 的东西转换成 mysqli 吗?
我需要这个,因为 mysql-extention 会导致此警报:
"mysql 扩展已弃用,将在...中删除"

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

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

但如果我尝试使用 mysqli 扩展,则图表不会出现。

  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>
    

【问题讨论】:

  • @Phil 老实说,来自已接受答案的链接导致了一个糟糕的“转换器工具”,它甚至无法正常工作
  • @YourCommonSense 我想。 OP 可以只搜索 "php mysql mysqli migration guide" 代替
  • 我已经尝试在 google 和 w3schools 的帮助下解决它。但它没有按应有的方式工作。连接有效,但图表不再出现

标签: php mysql mysqli


【解决方案1】:

如果您要将代码转换为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 */

?>

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

【讨论】:

  • 这并没有为我解决任何问题
  • 您尝试我的答案时出现什么错误?
  • 使用已弃用的 mysql-extention 看起来像这样:Picture 但它在我的页面上给了我一个 php 输出。如果我尝试您的版本,则不会绘制图表
  • 您尝试我的答案时没有错误?但是图表没有显示?仔细检查连接到图表的变量。
【解决方案2】:

我需要这个,因为 mysql-extention 会导致此警报:
"mysql 扩展已弃用,将在...中删除"

只需在配置/引导文件中添加/更改此代码

error_reporting(E_ALL & ~E_DEPRECATED);

这个错误就会消失。

“它不能解决问题”? - 哦,是的。

但问题不在于您认为的问题所在。

要解决真正的问题,您必须花费大量时间,因为您需要几年时间先学习编程,然后再花一些时间来完成重写代码。因为此代码的唯一问题是其过时且不安全的设计。

您真正需要更改的是设计,而不是简单的 API 调用。

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

【讨论】:

  • 这并没有解决问题 =/ 那只是禁用错误输出
  • 此代码确实解决了弃用问题,而“不再支持”则没有问题。
  • 您的回答告诉 OP 如何使错误消息消失。它没有回答他的问题:如何从mysql() 迁移到mysqli()
  • @YourCommonSense 也许吧。但是告诉某人只是禁用错误消息是 IMO 不负责任的。我已经处理了足够多的 PHP 代码,这些 PHP 代码是由关闭错误而不是正确编写的人编写的。
  • @staticsan 再次,并非所有错误都是相同的。为什么您谈论的是一般性的关闭错误,而它是有问题的特定错误类?而且我没有说他不应该写得很好。恰恰相反,我告诉他完全不同。
猜你喜欢
  • 1970-01-01
  • 2013-12-06
  • 1970-01-01
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-26
  • 2014-01-22
相关资源
最近更新 更多