mysqli链接正在下降

时间:2010-01-08 15:10:22

标签: php mysql

我有一个带2个变量的函数,一个用于数据库连接,另一个用于查询。出于某种原因,mysqli链接不满意,除非它在函数内部;仅通过链接是不够的。

是否有其他人发生过这种情况,我该怎么做才能避免在函数内实例化db对象。

这不起作用,但如果我把对象放在函数中,它就会。


function test($db, $query)
{
  if($db->multi_query($query)){
    do{
      if($result = $db->store_result()){
        while($row = $result->fetch_row()){
          print_r($row);
        }
        $result->free_result();
        $result->close();
      }
      if($db->more_results()){
        // print something here.
      }
    }while($db->next_result());
  }
  $db->close();
}

以下是我如何称呼他们

$db = new mysqli('xxxx','xxxx','xxxx','xxxx');
$q1 = ("SELECT * FROM table1");
$q2 = ("SELECT * FROM table2");

test($db,$q1);
test($db,$q2);

不使用函数内部的mysqli链接,我永远不会看到查询#2回来。我唯一得到的是第二个查询的错误。 (multi_query():无法获取mysqli)


I just ran your code and here is what I get from the error log 

[Fri Jan 08 08:12:43 2010] [error] [client 127.0.0.1] PHP警告:mysqli :: multi_query():无法在C:\ Program Files \ Apache Software Foundation \ Apache2中获取mysqli第24行的.2 \ htdocs \ test \ 1.php

[Fri Jan 08 08:12:43 2010] [错误] [client 127.0.0.1] PHP警告:mysqli :: close():无法在C:\ Program Files \ Apache Software Foundation \ Apache2中获取mysqli .2 \ htdocs \ test \ 1.php on the line 38 [Fri Jan 08 08:12:43 2010]

[error] [client 127.0.0.1] PHP警告:mysqli :: multi_query():无法在C:\ Program Files \ Apache Software Foundation \ Apache2.2 \ htdocs \ test \ 1.php上获取mysqli第24行[Fri Jan 08 08:12:43 2010]

[error] [client 127.0.0.1] PHP警告:mysqli :: close():无法在C:\ Program Files \ Apache Software Foundation \ Apache2.2 \ htdocs \ test \ 1.php上获取mysqli第38行[2010年1月8日星期五08:12:43]

[error] [client 127.0.0.1] PHP警告:mysqli :: multi_query():无法在C:\ Program Files \ Apache Software Foundation \ Apache2.2 \ htdocs \ test \ 1.php上获取mysqli第24行[Fri Jan 08 08:12:43 2010]

[error] [client 127.0.0.1] PHP警告:mysqli :: close():无法在C:\ Program Files \ Apache Software Foundation \ Apache2.2 \ htdocs \ test \ 1.php上获取mysqli第38行[2010年1月8日星期五08:12:43]

[error] [client 127.0.0.1] PHP警告:mysqli :: multi_query():无法在C:\ Program Files \ Apache Software Foundation \ Apache2.2 \ htdocs \ test \ 1.php上获取mysqli第24行[Fri Jan 08 08:12:43 2010]

[error] [client 127.0.0.1] PHP警告:mysqli :: close():无法在C:\ Program Files \ Apache Software Foundation \ Apache2.2 \ htdocs \ test \ 1.php上获取mysqli第38行


这是我现在正在运行但仍然只返回一个查询,恰好是列出的第一个'Notes'

function query_db( $link, $query ) {

 /* execute multi query */
 if ( $link->multi_query( $query ) ) {
    do {
        /* store first result set */
        if ($result = $link->store_result() ) {
      while( $row =  $result->fetch_row() ) {
       print_r( $row );
      }
      echo '<br/>';
               $result->close();
        }
     if( $link->more_results() ) {
     // ...
     }
    } while ( $link->next_result() );
 }
}

$db = new mysqli( 'xxxx', 'xxxx', 'xxxx', 'xxxx' );
query_db( $db, 'CALL Notes();'
query_db( $db, 'CALL Users();'
query_db( $db, 'SELECT * FROM test';

$ db = new mysqli('xxxx','xxxx','xxxx','xxxx');

$f1 = fa($db,"CALL phones();");
$f2 = fa($db,"CALL users();");

好的,非常简单..我们查询数据库2x。一旦获得所有手机,然后将返回集分配给var $ f1。我们为$ f2做同样的事情。当我运行此代码时,$ f2永远不会有结果。它总是空的。但是,当我在每次调用时独立执行print_r时,我得到了正确的结果。这真是太奇怪了!您应该能够使用我们在下面发布的代码复制这种相同的行为。只需尝试将返回的集合分配给每个变量,然后尝试回显结果。

1 个答案:

答案 0 :(得分:1)

第一次调用此函数后关闭连接,这就是为什么你没有从第二次调用中得到结果。

另外,如果您一次不传递两个或更多查询,为什么使用multi_query? 您有两种选择:

您可以连接两个SQL字符串并使用连接在一起的查询调用函数ONCE。这就是我们在这里使用multi_query的原因。

OR(这是我喜欢的):

摆脱$link->close();行,并根据需要多次调用该函数。 ;)

这样,该函数可以充当querymulti_query的包装函数,因为您可以根据需要传入尽可能多的查询,但也可以只传递一个查询

使用存储过程时,next_result()方法返回函数的返回值,如果再次调用它,则返回实际的结果集,这就是为什么我有一个名为$sp的可选参数的原因。

这是更新后的代码:

$db = new mysqli( 'xxxx', 'xxxx', 'xxxx', 'xxxx' );

function query_db( $link, $query, $sp = false ) {
 $set_array = array();
 /* execute multi query */
 if ( $link->multi_query( $query ) ) {
    do {
        /* store result set */
        if ($result = $link->store_result() ) {
            $set_array[] = $result;
        }
        if( $link->more_results() ) {
            // ...
        }
    } while ( $link->next_result() && ( $sp ? $link->next_result() : true ) );
 }
 if( count( $set_array ) ) 
     return $set_array;
 return false;
}

$table_set = query_db( $db, 'show tables;');
$notes_set = query_db( $db, 'CALL Notes();', true ); // stored procedure.
$users_set = query_db( $db, 'CALL Users();', true ); // stored procedure.

用法:

foreach( $users_set as $set ) {
    while( $row = $set->fetch_row() ) {
        print_r( $row );
        echo '<br/>';
    }
}