【问题标题】:small php object oriented problemphp面向对象的小问题
【发布时间】:2011-06-07 05:10:47
【问题描述】:

我无法理解我的继承有什么问题。我只是不能调用父级的大部分功能。下面是我被卡住的功能。

class MySQLi_DB  extends mysqli {
    private static $_instance = null;
    private function __construct($db="test",$host="localhost", $user="root", $pass="") 
    {

        parent::__construct($host, $user, $pass, $db);
        if (mysqli_connect_error()) {
            die('Connect Error (' . mysqli_connect_errno() . ') '
                    . mysqli_connect_error());
        }
    }
 static public function getDB()
    {
        if(self::$_instance == null)
        {
            self::$_instance = new MySQLi_DB();
        }
        return self::$_instance;

    }


public function insert($table,$data)
        {
           $sql = $this->getQuery($table,$data);
           print $sql;
        }

        public function getQuery($table, $inserts) 
        {
            $lambda = function($value){
                return $this->real_escape_string($value);
            };

            $values = array_map($lambda,$inserts);
            $keys = array_keys($inserts);

            return 'INSERT INTO `'.$table.'` (`'.implode('`,`', $keys).'`) VALUES (\''.implode('\',\'', $values).'\')';
        }

我在调用 real_escape_string() 函数时遇到问题。我试过使用 $this->real_escape_string() 但我只需要看到这个错误

致命错误:不在时使用 $this 对象上下文 D:\wamp\www\Driver\MySQLi_DB.php 上 第 49 行

好的,这可能是 lambda 函数的限制,但我已经通过声明 array_map 的回调来尝试其他方式,该回调也不允许我调用 real_escape_string。

我正在调用如下函数。

require_once 'MySQLi_DB.php';
        $db = MySQLi_DB::getDB();

        $insert_data = array("cmsId"=>444,"pageName"=>"New Insert");
        $db->insert("cms",$insert_data);

请指出我做错了什么以及最好的方法。谢谢

【问题讨论】:

  • real_escape_string() 函数在哪里?
  • 如果可能的话,你能发布 MySQLi_DB.php 的第 49 行吗?
  • 这是 lambda 函数中的一行

标签: php oop class mysqli


【解决方案1】:
$lambda = function($value){
    return $this->real_escape_string($value);
};

在您的“lambda”函数中,上下文不是您的对象,因此 $this 不可用。

作为替代方案,您可以使用,例如:

$values = array_map('mysql_real_escape_string', $inserts)

甚至尝试:

$values = array_map( array($this, 'real_escape_string'), $inserts)

这是未经测试的,但*应该*工作......

【讨论】:

  • 你摇滚马安。它工作得很好......你能告诉我你的这行是什么意思吗(数组($this,'real_escape_string')?
  • 回调(传递给array_map的内容)可以是:函数、函数名、(对象、函数)数组或(静态类名、静态函数名)数组
【解决方案2】:

您不能将 $this 关键字用于 lambda 函数,因为函数的范围不会扩展到其方法包含 lambda 的对象

尝试不同的方法:

 public function getQuery($table, $inserts) 
 {
      $values = array_map(array($this, 'real_escape_string'),$inserts);
      $keys = array_keys($inserts);

      return sprintf('INSERT INTO %s (`%s`) VALUES ("%s")',
           $table,
           implode('`,`', $keys),
           implode('","', $values)
      );
    }

附录

如果 real_escape_string 不是您的对象的方法,而是标准的 msqli 方法,您应该更改该行

 $values = array_map(array($this, 'real_escape_string'),$inserts);

 $values = array_map(array(self::$_instance, 'real_escape_string'),$inserts);

调用real_escape字符串方法。

数组array(self::$_instance, 'real_escape_string') 是一个callback array,当你想调用一个对象方法时使用它。

php 手册说明

实例化对象的方法作为数组传递,其中包含索引 0 处的对象和索引 1 处的方法名称

而self::$_instance就是你要调用的mysqli实例

【讨论】:

  • 你能告诉我我还能如何使用 mysqli 的 real_escape_string。
  • @g-molvi:编辑答案以回复您的评论
  • 感谢 Eineki,这才是真正的解决方案
猜你喜欢
  • 2011-07-25
  • 2011-11-29
  • 2017-07-05
  • 2011-06-18
  • 2014-07-10
  • 1970-01-01
  • 2010-10-01
  • 1970-01-01
  • 2010-12-27
相关资源
最近更新 更多