0

我为 PHP 制作了一个单例数据库类。我认为它工作得很好,但实际上并非如此。我现在制作一个有 3 个查询的页面。1检查相册是否存在,1检查用户是否拥有相册,另一个人从相册中获取照片。

现在在我的第三个查询中,我填充了一个对象,但是第一个 2 个查询的结果也在该数组中,所以我得到了通知!

这是一个例子:

Array
(
[0] => Array
    (
        [id] => 2
        [name] => My new album 1
        [slug] => my-new-album-1
        [user_id] => 1
        [views] => 0
        [datecreated] => 2013/03/23 16:00:43
    )

[1] => Array
    (
        [id] => 3
        [name] => My new album 1
        [slug] => my-new-album-1
        [user_id] => 1
        [views] => 0
        [datecreated] => 2013/03/23 23:51:58
    )

[2] => Array
    (
        [id] => 2
    )

[3] => Array
    (
        [id] => 117
        [title] => 
        [location_id] => 
        [date] => 2013-03-30 00:42:26
        [user_id] => 1
        [album_id] => 2
    )

这就是我进行查询并返回数组的方式:

mysqli_conn::getInstance()->query($sql)->all_assoc()

这是我的数据库类的一部分,它执行查询并返回结果:

public function query( $sql ){

 $starttime = $this->time_to_float();        
 $this->query = mysqli_query($this->connection, $sql);          
 $endtime = $this->time_to_float();
 $exectime = ($endtime - $starttime);


 if (!$this->query){        
    throw new Exception(mysqli_error($this->connection));        
 } else {

    $this->arQueryLog[] = array ( 'query' => $sql, 
                                  'exectime' => $exectime, 
                                  'affected_rows' => mysqli_affected_rows($this->connection),
                                  'last_insert_id' => $this->lastID() );                                      


 }

 return $this;

}

public function all_assoc ()
{
    while($result = mysqli_fetch_assoc($this->query)){
        $this->result[] = $result;
    }

    return $this->result;

}

怎么可能只有最后一个查询结果在结果数组中?

谢谢!!

4

3 回答 3

0

您正在将结果推送到类的结果属性。由于它是单例,以前的值保留在结果属性中,每次调用 all_assoc() 方法时,新结果都会被推送到属性中。

在推送新结果之前,您应该取消设置 all_assoc() 方法中的结果属性。

于 2013-04-01T04:50:20.853 回答
0

2大故障,与数据库类无关

  • 每个变量都必须在使用前进行初始化。这段代码失败了。
  • 如果您对本地数据使用局部变量,PHP 甚至会原谅上述错误

所以,正确的代码必须是

public function all_assoc ()
{
   $result = array(); //initializing a local variable 
   while($result = mysqli_fetch_assoc($this->query)){
        $result[] = $result;
    }
    return $result;
}

这个 all_assoc 函数最好使用 $result 变量而不是使用类属性。

1 与数据库类相关的主要故障。

  • 您没有使用占位符,因此您的查询容易受到 SQL 注入的影响。

所以,既然你已经开始上课了,那就看看SafeMysql 吧。它将使您的代码更短且更安全。

于 2013-04-01T05:14:53.863 回答
0

我认为@Jueecy 在设计方面可能有一个有效的观点,但是由于我们无法访问您的完整实现,所以让我们使用我们所拥有的。

尽管将数据库连接存储在单例中是有意义的,但将查询结果存储在单例中(当然也不是数据库连接单例)并不合适,因为每个请求很可能会有多个查询。

从您共享的代码中,我最好的建议是直接返回$query值(不将其存储在 $this 上),并让all_assoc()(和相关函数)直接接受$query并返回$result(不将其存储在 $this 上)。

如果您需要提供自定义逻辑(也就是函数中的and逻辑),您可以创建一个Query用于包装的类$query和一个用于包装单个结果集的类,但是您还没有提供任何表明这是必要的代码。ResultexectimearQueryLogquery()

祝你好运,

——大卫·法瑞尔

于 2013-04-01T07:00:09.787 回答