所以我从另一个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 实例,并在方法中准备语句。
答案 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 />";
}
}
}