PHP, MySQL tablolarını - Bir kez daha (0) data_seek arayarak fazla çalıştırmak sonuçlarını kullanabilir?

3 Cevap php

Ben bir kez daha iç içe bir döngü daha bir hazır deyimi sonuçlarını kullanmak istediğiniz bir durum var. Dış döngü başka bir sorgunun sonuçlarını işler ve iç döngü hazırlanmış deyimi sorgunun sonuçlanır. Yani kod böyle bir şey (kavramını göstermek için sadece "pseudoish") olacaktır:

// not showing the outer query, it is just a basic SELECT, not prepared statement
// we'll call it $outer_query

$obj_array = array();   // going to save objects in this
$ids = array(18,19,20); // just example id numbers

$query = "SELECT field1, field2 FROM table1 WHERE id=?";
$stmt = $db->prepare($query);

foreach ($ids as $id) {
    $stmt->bind_param("i", $id);
    $stmt->execute();
    $stmt->bind_result($var1, $var2);
    $stmt->store_result(); // I think I need this for data_seek

    while ($q1 = $outer_query->fetch_object()) {
        while ($stmt->fetch()) {
            if ($q1->field1 == $var1) { // looking for a match
               $obj = new stdClass();
               $obj->var1 = $var1;
               $obj->var2 = $var2;

               $obj_array[] = $obj;
               $stmt->data_seek(0); // reset for outer loop
               break;               // found match, so leave inner                
            }
        }
    }
}

Ben yaşıyor gibi görünüyor sorun kullandığım ilk kez iç döngü getir sonra beklediğiniz gibi değerleri değişkenlere bağlı almıyor olmasıdır. Bir örnekte ben foreach için 3 kimlikleri ile koştu Özellikle, ilk id doğru işlendiği ikinci (karşılaşmalar onlar var olsa bile, iç döngü içinde bulunmamıştır) yanlış işlendi ve daha sonra üçüncü doğru işlendi.

Ben yukarıda yapıyorum sırayla hazırlanan statment işlev çağrıları ile yanlış bir şey var mı, yoksa bu hazır deyimi sonuçlarını kullanmak için geçersiz bir yoldur?

Teşekkürler.

3 Cevap

Bu kodu yanlış nereye gittiğini buldum. Bu hazırlanmış deyimi fonksiyonları, data_seek sadece yerleştirme benim kullanımı ile ilgisi yoktu. Ben de yakında SO biraz yardım istedi :)

Aşağıdaki gibi şimdi ben tam olarak istediğim gibi çalışır döngü kodu:

while ($q1 = $outer_query->fetch_object()) {
    while ($stmt->fetch()) {
        if ($q1->field1 == $var1) { // looking for a match
            $obj = new stdClass();
            $obj->var1 = $var1;
            $obj->var2 = $var2;
            $obj_array[] = $obj;
            break;               // found match, so leave inner                
        }
    }
    $stmt->data_seek(0); // reset for outer loop
}
// this was always here, forgot it in original post
$outer_query->data_seek(0) // reset for next iteration of foreach

Ben hazırlanan statment sonuçlarını sıfırlamak için koşullu içinde data_seek çağırıyordu zaman sıfırlama bir maç bulundu yalnızca cereyan ediyordu. Bu hazırlanmış deyimi sonucu belirli durumlarda çalıştırmak için dış döngü sıfırlamak değil neden oldu. Bazen orman ağaçlarıyla gizlidir ;)

Yani, görünüşe göre kolayca hazır deyimi sadece umduğu gibi, data_seek kullanarak birden çok kez sonuçları işleyebilir.

Teşekkürler.

Sen daha iyi tek sorgu ve hiçbir döngüler ile bunu yapmak için JOIN kullanmak istiyorum

Ve sen zaten herhangi data_seek gerekmez.

Bir dizi mysql sonucu dönüştürmek ve sonra dizi gezinmek için dizi işlevlerini kullanabilirsiniz. Data_seek IMO, çok şık değil.