Mysqli_error()要求参数1为mysqli,在自己的db类中给出的值为空

时间:2020-08-05 作者:berndhs

我创建了一个插件并在那里定义了一个短代码。这包括我自己的PHP脚本(页面)。数据位于第二个数据库中。直接mysql查询工作正常(testcode),但db。类在调试中创建警告。日志:PHP Warning: mysqli_query() expects parameter 1 to be mysqli, null given in /usr/www/users/samtgt/2019-Wordpress/wp-content/eigeneScripte/Classes/db.class.php on line 47

sql。股份有限公司

$con = mysqli_connect($data["host"],$data["user"],$data["pwd"],$data["db"]);
if ( !$con) die(\'Die SQL-Datenbank ist ausgefallen, bitte versuchen Sie es zu einem späteren Zeitpunkt noch einmal\'.mysqli_connect_error());
mysqli_set_charset($con,"utf8");
测试。php此代码工作正常。

$dir = __DIR__."/";
include_once($dir."sql.inc.php");

// Testcode Anfang
if ($result = mysqli_query($con,"SELECT Aemter FROM Aemter")) {
    while($obj = $result->fetch_object()){
        $line.=$obj->Aemter."<br>";
    }
    echo $line;
    
    $result->close();
}
// Testcode Ende
此代码创建错误

$dir = __DIR__."/";
require_once($dir."sql.inc.php");//die("ja");
require_once($dir."Classes/db.class.php");

function lebenslage() {
    $DB = new db_query();
    $DB->execute("SELECT * FROM Lebenslagen ORDER BY Lebenslagen");
    echo "<center>\\n";
    echo "<form style=\\"padding-top:20px\\" action=\\"".$_SERVER["PHP_SELF"]."\\">\\n";
    echo "<select name=\\"Lebenslagen\\">\\n";
    echo "<option selected>Lebenslage</option>\\n";
    while($DB->next()){
        echo "<option value=\\"".$DB->value("Lebenslagen_id")."\\">".$DB->value("Lebenslagen")."</option>\\n";
    } // while
    echo "</select>&nbsp;&nbsp;&nbsp;";
    echo "<input type=\\"SUBMIT\\" name=\\"step\\" value=\\"anzeigen\\" />\\n";
    echo "</form>\\n</center>\\n";
}
数据库。班php

class db_query
{
        /**
         * Das Handle der DB-Connection
         */
      public $con;

        /**
         * Pointer innerhalb der aktuellen Query
         */
      public $queryptr;

        /**
         * Anzahl der Ergebniszeilen
         */
      public $rowcount;

        /**
         * Ergebnis der Query-Operation als assoziatives Array
         */
      public $result;

        /**
         * Ausfhren eines SQL-Befehls
         *
         * Speichert den Pointer auf das Ergebnis des Befehls in $queryptr
         * und die Anzahl der erhaltenen Zeilen in $rowcount
         */
      function execute($sql)
    {
            global $debug;
            global $con;
// here is line 47
            $this->queryptr = mysqli_query($con,$sql)
                or die ("<br></tr></table>Fehler beim Absetzen des SQL-Statements:<br><b>$sql</b><br><i>".mysqli_error($con))."</i>";
            $this->rowcount = mysqli_affected_rows($con);


      } 
      
        /**
         * Ausf¸hren von INSERT oder UPDATE ohne R¸ckgabewerte
         *
         */
      function exec($sql)
      {
            global $con;
            mysqli_query($con,$sql)
                or die ("<br></tr></table>Fehler beim Absetzen des SQL-Statements:<br><b>$sql</b><br><i>".mysqli_error($con));
      }

      /**
         * Holen der nÔøΩhsten Resultat-Zeile der Query
         *
         * Speichern der Inhalte der Resultat-Zeile im assoziativen Array $result
         */
      function next()
      {
            global $con;
            $this->result = mysqli_fetch_array($this->queryptr);
            if (!$this->result) {
            return (false); } else {
            return (true); };
      }

      /**
         * R¸ckgabe des gewnschten Wertes aus der aktuellen Resultat-Zeile
         */
      function value($col)
      {
            return($this->result["$col"]);
      }
      

        /**
         * In die Result-Zeile $jmp springen (klappt nicht so ganz)
         */
      function jump($jmp)
      {
              $this->result = mysql_data_seek($this->queryptr,$jmp);
      }
    
    /**
     * die zuletzt eingegebene id zurückliefern
     */
    function last_id()
    {
        global $con;
        return mysqli_insert_id($con);
        //or die ("<br></tr></table>Fehler beim Absetzen des SQL-Statements:<br><b>$sql</b><br><i>".mysqli_error($con));
    }
}
谁能帮忙?伯纳德

1 个回复
SO网友:mozboz

这不是Wordpress的问题,而是PHP的问题,但可能发生的是您需要声明global $con 在使用和设置之前的任何地方$con.

因此,在sql中。inc.php将global $con; 在你第一次设定之前。那么很明显你一定要这么做global con; 在你使用它的每个地方之前。

编辑:

当您可以在一个自包含但功能类似的系统中控制所有代码时,以这种方式使用globals是相当混乱的。最好是将变量直接传递到所需的位置。在这种情况下,您可能应该通过$con 在类的构造函数中,将其另存为类的私有属性,然后使用$this->con 而不是global正在删除它。

这样做的原因是,在调试或更改代码时,使用全局变量会使您很难跟踪需要更改或调试的位置。从短期来看这很方便,但从长期来看,以后更改和调试要花费更多的时间。