Bir MySQLi sorgu kapalı olması gerekiyorsa PHP nasıl denetlenecek?

5 Cevap php

Ben den çekin ve DB itmek daha kolay ve daha akıcı hale getirmek için üzerinde çalışıyorum bir proje için basit bir MySQLi sınıfı oluşturuldu. (also to get more familiar with OOP in PHP)

Ben doğru çekiliyorum bir sorun, mümkün olduğunca verimli kılmak için bir çaba olduğunu. Ben özgür / her sorgu / deyim / sonuç kümesini kapatmak için deneyin. Bunu yaparken aşağıdaki hatayı bir çok olsun:

Warning: mysqli_result::close(): Couldn't fetch mysqli_result

Ben iki kez üst üste sorguyu kapatmak için çalışıyor çünkü özellikle yukarıda olsun düşünüyorum.

Şu anda benim sınıf hazırlıklı ve hazırlıksız ifadeler yapabilirsiniz. Yani 2 yerde sorgular / ifadeleri kapatmaya çalışın. Bir bildiri hazırlarken zaten bir açıklama hazırladık, ben yeni bir tane ve son sınıf yıkıcı yapmadan önce bu yüzden eskisini kapatmak gerekiyorsa ben kontrol edin.

Ben çekti ve saklanan sonuç ama bu bir kaç nedenden dolayı dağınık gibi görünüyor ettik sonra ben sadece sorgu / deyimi yakın olabilir biliyoruz. Biri için hazırlanmış deyimi yeniden olasılığını ortadan kaldırır. Bunun yanı sıra etkilenen satırlar ve benzeri gibi çalıştırmak oldu sonra sorgu hakkında bazı bilgileri çekmek için bana izin vermeme.

Ben sadece her sorgu ve ne için bu bilgi depolamak olabilir biliyorum ama bu sorun hakkında gitmek için doğru yolu başka biri yapmak gerekirse / serbest sorgu / deyimi kapatın ve tekrar sonunda olurdu gibi sadece görünüyor script.

Ben etrafa ve düzgün bu görevi nasıl işleneceğini üzerinde okuma denedi ama bir şey ile gelip mümkün olmuştur.

Bir sorgu veya deyim kapalı veya serbest gerekiyor Yani benim soru testi için yine de, orada mı? Yoksa bu sorunu çözmek için çalışıyor olmalıdır daha iyi bir yolu var mı?

Herhangi bir yardım veya fikir için teşekkürler herkes sunabilir.

5 Cevap

Ben sonuç kümesinde kalan hiçbir satır varsa, otomatik olarak kapalı gerektiğini düşünüyorum. Eğer tüm sonuç kümesi yineleme Yani, mysqli_result aramaya gerek yoktur. Eğer getirme Ancak, yaklaşık 100 satır içeren bir sonuç kümesinden diyelim, sadece ilk satırı kapatmak gerekir.

Sen bunu kapattıktan sonra null olarak ayarlayın ve orada kapatmadan önce yıkıcı null kontrol edebilir.

Eğer bunu kullanarak bittiğinde emin olduğunuzda Açıkçası, sadece hazırlanmış deyimi null isterdim.

Sen RAII veya ifadeleri yönetmek için bir fabrika sınıfı + referans sayma kullanabilirsiniz. Bu şekilde o şey kapatmak için zamanı geldiğinde açıkça kontrol etmek gerekmez. Eğer sarıcı kullanarak konum nasıl ayrıntılarını görmeden, o detaya gitmek zor. Objective-C'nin accessor desen de böyle bir şey olmazdı, hangi kullanım olabilir:

private function unsetStatement() {
    if (isset($this->_stmt)) {
        $this->_stmt->close();
        unset($this->_stmt);
    }
}
function getStatement() {
    return $this->_stmt;
}
function setStatement($stmt) {
    $this->unsetStatement();
    $this->_stmt = $stmt;
}

Sadece hiç bile sınıf içinde, yukarıdaki fonksiyonlar aracılığıyla ifadesi üye alanına erişmek istiyorum. Aslında, daha fazla gibi görünüyor:

-(Statement *)statement {
    return stmt_;
}
-(void)setStatement:(Statement *)stmt {
    [stmt_ release];
    stmt = [stmt retain];
}

Bu benim ne kullanın. Herhangi bir sonuç tablosunda varsa, ben sonucu serbest gerekiyor biliyorum:

if($stmt->num_rows() != 0)
{
    $stmt->free_result();

    return FALSE;
}

mysqli query result zaten ise null, PHP 5 de aşağıdaki uyarıyı alırsınız:

 Warning: myfunction(): Property access is not allowed yet in ....

Asıl birinde bir özel hata işleyicisi bu davalarını ya da sadece uyarı / hata, yani is_object($mysqliqresult) && @$mysqliqresult->free() bastırabilir

Alternatif olarak, aşağıdaki gibi, daha sonra da doğrudan mysqlidblink-> sorgu çalışırken prepare yöntemi ile mysqli-statements kullanılmaktadır:

$query = "SELECT heptagon,hexagon FROM pentagon ORDER BY hexagon";
$stmt = $dblink->prepare($query);
$stmt->execute();
!$stmt->field_count() && $stmt->free_result();

Justin 'nin önerisi çok iyi.