我有一个带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时,我得到了正确的结果。这真是太奇怪了!您应该能够使用我们在下面发布的代码复制这种相同的行为。只需尝试将返回的集合分配给每个变量,然后尝试回显结果。
答案 0 :(得分:1)
第一次调用此函数后关闭连接,这就是为什么你没有从第二次调用中得到结果。
另外,如果您一次不传递两个或更多查询,为什么使用multi_query
?
您有两种选择:
您可以连接两个SQL字符串并使用连接在一起的查询调用函数ONCE。这就是我们在这里使用multi_query
的原因。
OR(这是我喜欢的):
摆脱$link->close();
行,并根据需要多次调用该函数。 ;)
这样,该函数可以充当query
和multi_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/>';
}
}