mysqli bağlantı düşüyor

1 Cevap php

Ben 2 değişkenleri, bir sorgu için veri tabanı bağlantısı ve diğer için alır bir işlevi var. Bu işlev içinde olmadıkça nedense, mysqli bağlantı mutlu değildir; Sadece linki geçmek için yeterli değildir.

Bunu kimse ve ben işlevin içinde db nesnesini başlatmasını önlemek için ne yapabilirim olmuştur.

Bu işe yaramazsa ama işlevi içinde nesne koyarsanız, öyle.


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

İşte ben onları arıyorum nasıl

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

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

İşlevin içindeki mysqli bağlantıyı kullanarak olmadan, ben sorgu 2. geri gelmek görmek asla. Ben olsun tek şey ikinci sorguyu hatalardır. (Multi_query (): mysqli alınamadı)


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

[Cum 8 Ocak 08:12:43 2010] [error] [client 127.0.0.1] PHP Warning: mysqli :: multi_query (): C mysqli alınamadı: \ Program Files \ Apache Software Foundation \ Apache2.2 \ hat 24 üzerinde htdocs \ test \ 1.php

[Cum 8 Ocak 08:12:43 2010] [error] [client 127.0.0.1] PHP Warning: mysqli :: close (): C mysqli alınamadı: \ Program Files \ Apache Software Foundation \ Apache2.2 \ htdocs \ hat 38 üzerinde test \ 1.php [Fri 8 Ocak 08:12:43 2010]

[Hata] [istemci 127.0.0.1] PHP Warning: mysqli :: multi_query (): C mysqli alınamadı: \ Program Files \ Apache Software Foundation \ Apache2.2 \ htdocs hat 24 üzerinde \ test \ 1.php [ Cum Ocak 8 08:12:43 2010]

[Hata] [istemci 127.0.0.1] PHP Warning: mysqli :: close (): C mysqli alınamadı: \ Program Files \ Apache Software Foundation \ Apache2.2 \ htdocs hat 38 üzerinde test \ 1.PHP \ [ Cum Ocak 8 08:12:43 2010]

[Hata] [istemci 127.0.0.1] PHP Warning: mysqli :: multi_query (): C mysqli alınamadı: \ Program Files \ Apache Software Foundation \ Apache2.2 \ htdocs hat 24 üzerinde \ test \ 1.php [ Cum Ocak 8 08:12:43 2010]

[Hata] [istemci 127.0.0.1] PHP Warning: mysqli :: close (): C mysqli alınamadı: \ Program Files \ Apache Software Foundation \ Apache2.2 \ htdocs hat 38 üzerinde test \ 1.PHP \ [ Cum Ocak 8 08:12:43 2010]

[Hata] [istemci 127.0.0.1] PHP Warning: mysqli :: multi_query (): C mysqli alınamadı: \ Program Files \ Apache Software Foundation \ Apache2.2 \ htdocs hat 24 üzerinde \ test \ 1.php [ Cum Ocak 8 08:12:43 2010]

[Hata] [istemci 127.0.0.1] PHP Warning: mysqli :: close (): C mysqli alınamadı: hattında 38 \ Program Files \ Apache Software Foundation \ Apache2.2 \ htdocs \ test \ 1.php


İşte şimdi çalıştırıyorum ne ama hala sadece 'Notlar' listede ilk olur bir tek sorgu döndürür

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

Tamam, çok basit .. Biz veritabanı 2x sorgulayabilirsiniz. Bir kez tüm telefonlar daha sonra var $ f1 için dönüş kümesi atamak olsun. Biz $ f2 için aynı şeyi yapmak. Bu kodu çalıştırdığınızda, $ f2 bir sonuç asla. hep boş. Ben bağımsız her çağrıda bir print_r Ancak, ne zaman, ben doğru sonuçları almak. Bu gerçekten garip! Eğer aşağıda attılar koduyla bu çok aynı davranışı çoğaltmak gerekir. Sadece deneyin ve her değişkene döndü kümesini atamak, daha sonra deneyin ve sonuçlarını yankı.

1 Cevap

Bağlantısı, ikinci çağrı sonuçlarını almıyorsanız neden bu işlevin ilk çağrıdan sonra, o kapalıdır.

Also, why are you using multi_query if you aren't passing in two or more queries in at a time? You have two options:

Siz iki SQL dizeleri birleştirmek ve birlikte birleştirilmiş sorgu ile ONCE işlevini çağırabilirsiniz. Burada multi_query kullanarak konum neden budur.

OR (bu ben bunu tercih budur):

Istediğiniz gibi birçok kez $link->close(); hattı kurtulmak ve işlevini çağırın olsun. ;)

Bu şekilde, fonksiyon istediğiniz gibi her iki query ve multi_query gibi birçok sorgularda iletebilirsiniz anlamda bir sarıcı fonksiyonu olarak hareket, aynı zamanda olabilir bir sorgu gibi küçük çok.

Saklı yordamları kullanırken, next_result() yöntemi tekrar ararsanız, bu i $sp adlandırılan isteğe bağlı parametre var, bu yüzden gerçek resultset döndürür sonra, işlevin dönüş değerini döndürür .

İşte güncellenmiş kod:

$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.

Kullanımı:

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