MySQLi连接超时,有两个连续的SELECT

时间:2014-05-05 19:14:39

标签: php mysqli

我正在尝试使用PHP从数组结构中获取数据库的结果。为此,我使用以下代码:

的config.php

$mysqli = new mysqli("localhost", "root", "root", "databasename");

if ($mysqli->connect_errno) {
    echo "Failed to connect to MySQL: " . $mysqli->connect_error;
}

database.class.php

class database
    {
        function __construct($mysqli)
        {
            $this->mysqli = $mysqli;
        }


        /*
         * Utility function to automatically bind columns from selects in prepared statements to
         * an array
         */
        function bind_result_array($stmt)
        {
            $meta = $stmt->result_metadata();
            $result = array();
            while ($field = $meta->fetch_field())
            {
                $result[$field->name] = NULL;
                $params[] = &$result[$field->name];
            }

            call_user_func_array(array($stmt, 'bind_result'), $params);

            return $result;

        }

        /**
         * Returns a copy of an array of references
         */
        function getCopy($row)
        {
            return array_map(create_function('$a', 'return $a;'), $row);
        }

        function select($campos, $tabela, $condicao='')
        {
            $query = 'SELECT '.$campos.' FROM '.$tabela;
            if(trim($condicao!='')){
                $query.=' WHERE '.$condicao;
            }
            $stmt = $this->mysqli->prepare($query);
            $stmt->execute();
            $row = $this->bind_result_array($stmt);
            if(!$stmt->error)
            {
                while($stmt->fetch())
                    $dados[] = $this->getCopy($row);
            }

            return $dados;
        }

要使用它,我会执行以下操作:

$data = $db->select('*', 'users', 'idlevel = 1 LIMIT 10');

这个$data将返回一个数组,如下所示:

 [1]=>
  array(6) {
    ["id"]=>
    int(17)
    ["nome"]=>
    string(13) "Gareth Barlow"
    ["email"]=>
    string(30) "sit.amet@semPellentesqueut.net"
    ["idnivel"]=>
    int(1)
    ["password"]=>
    string(0) ""
    ["departamento"]=>
    NULL
  }
  [2]=>
  array(6) {
    ["id"]=>
    int(20)
    ["nome"]=>
    string(9) "John Lara"
    ["email"]=>
    string(13) "odio@arcu.net"
    ["idnivel"]=>
    int(1)
    ["password"]=>
    string(0) ""
    ["departamento"]=>
    NULL
  }

但是,如果我在$data"行之后立即执行另一个数据库调用,请执行以下操作:

$foo = $db->select('*', 'users', 'idlevel = 2 LIMIT 10');

浏览器尝试返回数据,但在短时间内,它会给我“连接已重置(...)”。

有没有办法执行这些查询并返回两个这样的数组?


更新1

好的,我想我找到了解决方案。

function select($campos, $tabela, $condicao='')
        {
            $query = 'SELECT '.$campos.' FROM '.$tabela;
            if(trim($condicao!='')){
                $query.=' WHERE '.$condicao;
            }
            $result = $this->mysqli->query($query);
            if ($result = $this->mysqli->query($query)) {
                while ($row = $result->fetch_assoc()) {
                    $dados[] = $this->getCopy($row);
                }
                return $dados;
                $result->free();
            }
        }

这允许我用来做同样的事情,没有错误。 谢谢大家;)

2 个答案:

答案 0 :(得分:0)

我认为您需要关闭声明对象...

在选择功能中,

之前
return $dados; 

制作

$stmt->close();

答案 1 :(得分:0)

如何简单地使用不同的对象?

$db1 = new Database($mysqli);
$data1 = $db->select('*', 'users', 'idlevel = 1 LIMIT 10');

$db2 = new Database($mysqli);
$data2 = $db->select('*', 'users', 'idlevel = 1 LIMIT 10');

class Post extends Eloquent {

它没有解决数据库类中的潜在问题,但它应该花时间寻找替代方案。说实话,你使用的那个看起来并不是很有用。