【问题标题】:PHP OOP with mysqli class带有 mysqli 类的 PHP OOP
【发布时间】:2012-11-02 01:43:18
【问题描述】:

好的,我到处寻找答案,但我没有找到任何真正的答案,我认为这对于任何人来说都是一个不错的要求:

使用mysqli的“mysqli_query”成员函数的我的班级成员函数:

    class mysqlidbconn extends mysqli {

        protected $conn;  //Or private $conn;  
        function dbconnect(){
            $localHost = false;
            $link = new mysqli("server","database username","password","databasename")   
               or ($die = true);
            if ($link->connect_error){
                die("Database selection failed: " . $link->connect_error);
            }else{
                $this->conn = $link;
            }

         }

以及用于执行插入/更新/删除/截断查询的相关成员函数:

    // To Execute Sql Query with no return result
    function xQuery($sql) {
        $this->conn->query($sql) or die("MySQL Query Execute Error: " . 
            $this->invDBConn->errorno . "<br>" . $this->conn->error . "<br>" . $sql 
            . "<br>");
    }

在对表进行插入和截断时,上述情况与将 $conn 初始化为类 mysqlidbconn 的 PRIVATE 或 PROTECTED 成员变量完美配合,如以下代码中使用 mysqlidbconn 类的示例,不会产生错误,但也, mysql 表没有更新:

  <?php
      require('path to php file containing mysqlidbconn class');
      $msqli = new mysqlidbconn;
      $msqli->dbconnect();

      //This works
      $sqlinsert = "insert into foo (foo_id, foo_field1...) values ('foo_id value',  
          'foo_field1 value',...);    
      $msqli->xQuery($sqlinsert);  

      //As does this
      $sqltruncate = "truncate foo"; 
      $msqli->xQuery($sqltruncate);

      //But the below does not work, giving no error, result, etc.
      $sqlupdate = "update foo set foo_field1='another foo_field1 value'";
      $msqli->xQuery($sqlupdate);

但是,当使用 $conn 变量作为 PUBLIC 编写类时,上述

    $sqlupdate = "update foo set foo_field1='another foo_field1 value'";
    $msqli->xQuery($sqlupdate);

成功更新表。

在编写我的 mysqlidbconn 类时我错过了 OOP 方面的情况?

感谢您的帮助,对于未根据论坛规则发布的任何代码,我深表歉意。

【问题讨论】:

  • 几件事: 1. 您需要将 MySQLi 对象分配给一个变量才能使用它。换句话说,$blah = new mysqli(/* args */); 2. $die = true; 应该做什么? $die你刚刚创建的自定义变量与die脚本杀戮语句不同。老实说,我从来没有看到扩展 MySQLi 有什么意义。已经是一堂课了。您的 xQuery() 方法与您实际委托给的现有 query() 方法没有明显不同。
  • 关于你的 1) -- 已修复,在我的帖子中我只是没有提到 $link 初始化为新的 mysqli(...)。在你的 2) $die 在下面的 if-else 语句中处理。我知道 $die != die()。 3)是的,你是对的,但我想在我自己的类中坚持使用成员变量作为 mysqli,因为我使用的与 mysqli 相关的其他几个函数在所有版本的 mysql 中都不可用,即加载 xml 文件是
  • SQJ注射多?您实际上应该使用参数化查询。如果你这样做,请忽略我的评论。
  • @sinni800 -- 他们在进入的过程中被转义。问题强调了为什么更新查询在 $conn 受保护或私有时不更新表(没有任何错误),但在更新表时更新表$conn 是公开的。
  • @user1793027 好的,这就是我指出它作为评论的原因。但是,是的,我也发生了同样的事情。我不记得我是怎么解决的...

标签: php class properties mysqli


【解决方案1】:

尝试:

$link = new mysqli("server","database username","password","databasename") or
             ($die = true);


// To Execute Sql Query with no return result
     function xQuery($sql) {
         $result = $this->conn->query($sql);
         if(!empty($result))
         {
             return $result->fetch_assoc();
         } else {
             return $this->conn->errno;
         }
     }

【讨论】:

  • 是的,我实际上在我的原始代码中有这个,所以这里没有答案——相应地进行了编辑。这实际上会引发错误,并且脚本将永远不会运行。我很抱歉。
  • 我不明白你的意思,我是通过英语翻译见你,我正在努力学习英语
  • 没问题,罗——你做得很好,并指出了我错过的东西。
【解决方案2】:

没有任何面向 OOP 的问题,而且问题也不是真正的问题,因为它仅仅是由测量误差引起的,就像这里有数十万个问题一样。

没有任何与 OOP 相关的东西可以干扰 SQL,从而使一些查询运行而另一些则不运行。然而,许多 PHP 用户在更新查询、更新已经更新的数据或检查错误数据库的结果等方面存在困难。

【讨论】:

    猜你喜欢
    • 2015-05-05
    • 2010-11-17
    • 2013-11-16
    • 2015-08-01
    • 2016-04-14
    • 1970-01-01
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多