Bu bir PHP veya MySQL hata mı?

5 Cevap php
$allUsersResult = mysql_query("SELECT * FROM users");

// the purpose of this line was to grab the first row for use 
// separately in a different area than the while loop
$user = mysql_fetch_assoc($allUsersResult);


while($users = mysql_fetch_assoc($allUsersResult)){

 // the first row is not available here

}

Yani bu bir hata ya da bunu yanlış yapıyorsun benim suçum mu?

Not: Bu, sadece örnek içindir. Böyle hemen yanındaki birbirlerine $ kullanıcı ve while döngüsü her ikisini de kullanarak değilim, onlar komut farklı yerlerde kullanılır.

5 Cevap

Sen damla gerekir

$allUsers = mysql_fetch_assoc($allUsersResult);

Bu sizin ilk sonuç satırı alıyor.

Yeni sorusuna cevap: Hayır PHP bir tasarım kusur değildir. Bu program tasarımında bir kusur. Sen ne yapıyorsun düşünmek gerekiyor.

Neden ilk değer ayrılır gerekiyor? Eğer zaman tüm tablosundan belirli bir satır olması için ona güvenmek? Eğer tablo şemasını değiştirmek eğer 'very possible sonuçları diğer bazı sıralı sırasını kullanarak size iade edilecektir.

Yapmanız çalıştığınız ne söylersen belki size bazı tasarım öneriler verebilir.

Bu senin hatan. $allUsers = mysql_fetch_assoc($allUsersResult); İlk arayarak, zaten sonuç kümesinden ilk satırı getir. Dolayısıyla, sadece bu satırı kaldırın, ve beklendiği gibi çalışması gerekir.

edit: yorumda Başına istek.

$user = mysql_fetch_assoc($allUsersResult);
if ( $user ) // check if we actually have a result
{
    // do something special with first $user

    do
    {
        // do the general stuff with user
    }
    while( $user = mysql_fetch_assoc($allUsersResult) );
}

Bazı IDE (bir satırda iki ifadeleri) tarafından kötü kod kabul edilir. Daha iyi:

$allUsersResult = mysql_query("SELECT * FROM users");
$user = mysql_fetch_assoc($allUsersResult);

while($user){

    // do stuff
    doStuff($user)

    // at last: get next result
    $user = mysql_fetch_assoc($allUsersResult)


}

Eğer mysql_fetch_assoc() kullandığınızda, temelde satır alınıyor ve daha sonra iç sonuç göstericisi +1 ilerlemektedir.

Daha iyi açıklamak için, burada kodu:

$allUsersResult = mysql_query("SELECT * FROM users");
//Result is into $allUsersResult... Pointer at 0


$user = mysql_fetch_assoc($allUsersResult);
// $user now holds first row (0), advancing pointer to 1 


// Here, it will fetch second row as pointer is at 1...
while($users = mysql_fetch_assoc($allUsersResult)){

 // the first row is not available here

}

Eğer, yine ilk satır getirme sen do not need sorguyu yeniden çalıştırmak istiyorsanız ilk satırı okudum kez, sadece 0'a geri resetle ...

$allUsersResult = mysql_query("SELECT * FROM users");
//Result is into $allUsersResult... Pointer at 0


$user = mysql_fetch_assoc($allUsersResult);
// $user now holds first row (0), advancing pointer to 1 

// Resetting pointer to 0
mysql_data_seek($allUsersResult, 0);

// Here, it will fetch all rows starting with the first one
while($users = mysql_fetch_assoc($allUsersResult)){
  // And the first row IS available
}

PHP Documentation: mysql_data_seek()

Devam edin ve bu benim kendi soruya cevap olacak:

    $allUsersResult = mysql_query("SELECT * FROM users");

    // transfer all rows to your own array immediately
    while($user = mysql_fetch_assoc($allUsersResult)){
       $allUsers[] = $user;
     }

    // use first row however you like anywhere in your code
    $firstRow = $allUsers[0];

    // use all rows however you like anywhere in your code
    foreach($allUsers as $user){
      // do whatever with each row ($user). Hey look they're all here! :)
    }