php扩展mysqli并准备语句

时间:2015-08-20 05:50:42

标签: php mysqli

所以我从另一个stackoverflow帖子的代码中复制了一个类:

class db extends mysqli{
  protected static $instance;
  protected static $options = array();

  private function __construct() { $o = self::$options;
    // turn of error reporting
    mysqli_report(MYSQLI_REPORT_OFF);

    // connect to database
    @parent::__construct(isset($o['host'])   ? $o['host']   : 'localhost',
      isset($o['user'])   ? $o['user']   : 'root',
      isset($o['pass'])   ? $o['pass']   : 'password',
      isset($o['dbname']) ? $o['dbname'] : 'database',
      isset($o['port'])   ? $o['port']   : 3306,
      isset($o['sock'])   ? $o['sock']   : false );
    if( mysqli_connect_errno() ) {
      throw new exception(mysqli_connect_error(), mysqli_connect_errno());
    }
  } 

  public static function getInstance(){
    if(!self::$instance ){
      self::$instance = new self();
    }
    return self::$instance;
  }

  /** OTHER METHOD NOT SHOWN FOR CLARITY **/
}

这个课程很好,我可以按如下方式编写语句:

$sql = db::getInstance();
$sql->query($dropExampleTable);
$sql->query($ExampleTable);

$title = 'this is an example';

if($stmt = $sql->prepare($exampleQuery)){
  $stmt->bind_param("s",$title);   

  if(!$stmt->execute()){
    echo "example: successful <br />";
  }
}else{
  echo "example: failed <br />";
}

这将成功将项目添加到数据库中。现在这就是我的问题所在:为什么如果我将以下方法添加到 db 类中,我无法创建并成功执行语句?

  public function func(){    

    if($stmt = self::$instance->prepare($exampleQuery)){    
      $name = 'func';   
      $stmt->bind_param("s",$name);    
      if(!$stmt->execute()){   
        echo "example: successful <br />";  
      }
    }else{  
      echo "example: failed <br />";
    }                                                  
  }

即使我将使用 getInstance()创建的sql对象作为参考传递,我仍然无法成功准备语句:

  public function func2(&$sql){    

    if($stmt = $sql->prepare($exampleQuery)){    
      $name = 'func2';   
      $stmt->bind_param("s",$name);    
      if(!$stmt->execute()){   
        echo "example: successful <br />";  
      }
    }else{  
      echo "example: failed <br />";
    }                                                  
  }

但是我能够像在帖子顶部那样创建一个语句,并将其作为引用传递,并在我在 db 类中创建的方法中执行该语句:

  public function func3(&$stmt){    

    $name = 'func3';   
    $stmt->bind_param("s",$name);    
    if(!$stmt->execute()){   
      echo "example: successful <br />";  
    }
  }                                                  

但我不想把准备好的陈述传递给我的班级;似乎打败了它的目的。我的最终目标是能够将需要添加到数据库的项目数组传递给我的 db 实例,并在方法中准备语句。

1 个答案:

答案 0 :(得分:0)

单例对象的想法是只有一个对象的实例,这就是构造函数方法是私有的原因。这意味着您不能调用任何非静态方法,在您的情况下,func函数实际上不是静态函数 - 需要更改。然后,在该方法中,您似乎已将else语句放在第一个if上,如果您真的想查看语句是否正确执行,则应将其移至另一个{{1} }}。这是您的方法的略微更新版本,它工作正常:

if

用法

public static function func($exampleQuery)
{
    if ($stmt = self::$instance->prepare($exampleQuery)) {    
        $name = 'some name'; // search criteria
        $stmt->bind_param("s", $name);
        if ($stmt->execute()) {   
            echo "example: successful <br />";  
        } else {
            echo "example: failed <br />";
        }
    }
}