MySQL-ссылка сбрасывается - PullRequest
       4

MySQL-ссылка сбрасывается

2 голосов
/ 08 января 2010

У меня есть функция, которая принимает 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 

[Пт, 08 января 08:12:43 2010] [ошибка] [клиент 127.0.0.1] Предупреждение PHP: mysqli :: multi_query (): не удалось получить mysqli в C: \ Program Files \ Apache Software Foundation \ Apache2 .2 \ htdocs \ test \ 1.php в строке 24

[Пт, 08 января 08:12:43 2010] [ошибка] [клиент 127.0.0.1] Предупреждение PHP: mysqli :: close (): не удалось получить mysqli в C: \ Program Files \ Apache Software Foundation \ Apache2 .2 \ htdocs \ test \ 1.php в строке 38 [пт, 08 января 08:12:43 2010]

[ошибка] [клиент 127.0.0.1] Предупреждение PHP: mysqli :: multi_query (): не удалось получить mysqli в C: \ Program Files \ Apache Software Foundation \ Apache2.2 \ htdocs \ test \ 1.php on строка 24 [пт янв 08 08:12:43 2010]

[ошибка] [клиент 127.0.0.1] Предупреждение PHP: mysqli :: close (): не удалось получить mysqli в C: \ Program Files \ Apache Software Foundation \ Apache2.2 \ htdocs \ test \ 1.php on строка 38 [пт янв 08 08:12:43 2010]

[ошибка] [клиент 127.0.0.1] Предупреждение PHP: mysqli :: multi_query (): не удалось получить mysqli в C: \ Program Files \ Apache Software Foundation \ Apache2.2 \ htdocs \ test \ 1.php on строка 24 [пт янв 08 08:12:43 2010]

[ошибка] [клиент 127.0.0.1] Предупреждение PHP: mysqli :: close (): не удалось получить mysqli в C: \ Program Files \ Apache Software Foundation \ Apache2.2 \ htdocs \ test \ 1.php on строка 38 [пт янв 08 08:12:43 2010]

[ошибка] [клиент 127.0.0.1] Предупреждение PHP: mysqli :: multi_query (): не удалось получить mysqli в C: \ Program Files \ Apache Software Foundation \ Apache2.2 \ htdocs \ test \ 1.php on строка 24 [пт янв 08 08:12:43 2010]

[ошибка] [клиент 127.0.0.1] Предупреждение PHP: mysqli :: close (): не удалось получить mysqli в C: \ Program Files \ Apache Software Foundation \ Apache2.2 \ htdocs \ test \ 1.php on линия 38


Вот то, что я запускаю сейчас, но все еще только возвращает один запрос, который оказывается первым из перечисленных «Заметок»

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();");

ОК, очень просто .. Мы запрашиваем базу данных 2 раза. Один раз, чтобы получить все телефоны, затем присвойте возвращаемое значение переменной $ f1. Мы делаем то же самое для $ f2. Когда я запускаю этот код, $ f2 никогда не дает результата. это всегда пусто Однако когда я выполняю print_r для каждого вызова независимо, я получаю правильные результаты. Это действительно странно! Вы должны быть в состоянии повторить то же самое поведение с кодом, который мы разместили ниже. Просто попробуйте назначить возвращаемый набор каждой переменной, а затем попытайтесь повторить результаты.

1 Ответ

1 голос
/ 08 января 2010

Соединение закрывается после первого вызова этой функции, поэтому вы не получаете результатов от второго вызова.

Кроме того, почему вы используете multi_query, если вы не передаете два или более запросов одновременно? У вас есть два варианта:

Вы можете объединить две строки SQL и вызвать функцию ONCE с объединенными запросами. Вот почему мы используем multi_query здесь.

ИЛИ (это то, что я предпочитаю делать):

Избавьтесь от строки $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/>';
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...