PHP &

5 Cevap php

Ben ise döngü deyimi içinde ikinci bir sorgu çalıştırdıktan sonra nasıl tekrar ilk sorgunun id değerini $row['id'] kullanabilir? Size göstermek için burada ne demek ben yapmaya çalışıyorum ne aşağıda bir örnek kod.

Ben doğru açıkladı umuyoruz.

İşte kodudur.

    $mysqli = mysqli_connect("localhost", "root", "", "sitename");
    $dbc = mysqli_query($mysqli,"SELECT users.*
                                 FROM users
                                 WHERE user_id = 4");

    if (!$dbc) {
        // There was an error...do something about it here...
        print mysqli_error($mysqli);
    }

    while($row = mysqli_fetch_assoc($dbc)) {

     echo '<div>User: ' . $row['id'] . '</div>';
     echo '<div>Link To User' . $row['id'] . '</div>';


            $mysqli = mysqli_connect("localhost", "root", "", "sitename");
            $dbc2 = mysqli_query($mysqli,"SELECT COUNT(cid) as num
                                          FROM comments
                                          WHERE comments_id = $row[id]");

            if (!$dbc2) {
                // There was an error...do something about it here...
                print mysqli_error($mysqli);
            }  else {
                while($row = mysqli_fetch_array($dbc2)){ 
                    $num = $row['num'];
                }
            }

     echo '<div>User ' . $row['id'] . ' Comments# ' . $num . '</div>';

    }

5 Cevap

Uh .... neden sadece başka ikinci "sıra" değişken bir şey yapmazlar? $ ROW2? Ben sorunuzun tarafından karıştı biraz ben ...

Gördüğünüz her zaman iç içe sorgu - Eğer you'rе yanlış bir şey yaptığını biliyorum. İstisna yok.

Sizin sorgu (I sütun adları hakkında emin değilim ama bir fikrim var umarım) bu gibi olmalı:

$sql = "SELECT users.*, COUNT(cid) as num 
    FROM users LEFT JOIN comments ON comments_id = id 
    WHERE user_id = 4
    GROUP BY cid";
$dbc = mysqli_query($sql);
if (!$dbc) trigger_error(mysqli_error($mysqli).$sql);

(Önce bir değişken bir sorgu atamış olduğunu unutmayın. Bu hata ayıklama amaçları için harika. Her zaman bu şekilde yapmak)

Ben de tüm birinci döngünün anlamını anlamıyorum bile. İlk sorgu tek bir satır dönmüyor? Neden o zaman döngü? Sadece bir satır getirme ve daha sonra çıkışı kullanın.

And your main problem, as Jan noted in comments, is you reopen a database connection. While it must be opened only once. You don't have to connect to the database every time you run a query. Do it only once.
What is the book you're learning from?

Şahsen, ben $ satır gibi genel değişken adlarını kullanarak önlemek ve $ çok bu nedenle sonucu - Eğer böyle karmaşık döngüler yapıyorsun zaman ayrılmak gelmek için gidiyoruz, ve $ kullanıcı ya da benzeri açıklayıcı adlarla değişkenleri için genellikle iyi bir uygulamadır $ comment.

Ayrıca - bir alt sorgu önemli ölçüde veritabanı yapmak zorunda sorgu sayısını azaltmaya yardımcı olacak kullanımı hakkında Keyo bakış @.

I think you are asking the wrong question here. Yes you could use $row['id'] in the nested query. You can concatenate it to the query string using the '.' operator.

$dbc2 = mysqli_query($mysqli,"SELECT COUNT(cid) as num
                                      FROM comments
                                      WHERE comments_id = ".$row['id']);

Ancak bu horible. Ayrıca sadece tek bir bağlantı kullanıyorsanız ve merkezi bir yerde değişkenleri saklamak gerekir.

Böyle bir şey (test değil) için size sorguyu değiştirmek gerekir:

SELECT 
  users.*, 
  (SELECT count(*) 
  FROM comments 
  WHERE comments.user_id = users.user_id) AS 'comment_count'
FROM users
LEFT JOIN comments ON 
  comments.user_id = user.user_id
WHERE users.user_id = 4;

By adding a select statement as the count field you are getting everything you want in a single query. That should avoid all those ugly loops. If you are doing these queries inside loops it will be very slow and there is usually a way to do the same thing in one more complex query.

Ben senin tabloların yapısı ne bilmiyorum, ben onun yorumlarla kullanıcıyı ilişkilendirmek için çalışıyoruz inanıyorum beri id aslında user_id üstlenecek. Belki burada yazılan kodu yeniden bir hata yaptım? Her neyse, benim son nokta bu varsayımlara dayalı olacaktır.

  1. Döngü içinde aynı veritabanına bağlanmayı gerek yoktur.

  2. Sizin ikinci döngü $ satır dizi üzerine yazmak gerekir. Baş ağrıları önlemek için $ yerine ROW2 kullanın.

  3. LEFT JOIN veya alt sorgular ile yukarıda belirtildiği gibi tek bir sorguda tüm işleri yapabilir.

  4. İlk sorgu döngü gerek içinden, orada tek bir kayıt verir, bu yüzden.

  5. İşte Tamamen yenilenen kod, test edilmiş ve ilk paragrafta benim varsayımlara dayalı kullanıcı verilerini görüntülemek istediğinizi varsayarak değildir.

    $mysqli = mysqli_connect("localhost", "root", "", "sitename"); $dbc = mysqli_query($mysqli,"SELECT users.*, COUNT(cid) AS num FROM users LEFT JOIN comments ON comments_id = user_id WHERE user_id = 4 GROUP BY users.user_id");

    if (!$dbc) { // There was an error...do something about it here... print mysqli_error($mysqli); }

    if($row = mysqli_fetch_assoc($dbc)){ echo 'User: ' . $row['user_id'] . ''; echo 'Link To User' . $row['user_id'] . ''; echo 'User ' . $row['user_id'] . ' Comments# ' . $num . ''; }

Biz soruna daha doğru bir çözüm verebilir böylece bir dahaki sefere tablo yapıları veriniz.

Quick Reference: Using Quotes

Sana bazı bu yazı için yanıtlarda tırnak birkaç kez aynı hatayı yapmak gördüğümden beri burada bir şey açıklayacağım.

Bu tırnak kullandığınızda PHP söylemek budur:

Single Quotes: Do not parse here.
Double Quotes: Parse the contents inside the quotes, please.
No Quotes: This is a constant or number, please parse if it's a constant only.

Diziler ile çalışırken orada ayrıştırılması şey varsa, köşeli parantez içindeki eleman tek tırnaklı olmalıdır. Bir sayı veya bir sabit varsa, sen tırnak bırakabilirsiniz. Örneğin:

// If your string is double quoted, you use regular brackets to encapsulate the array
$sql = "SELECT * FROM tableA WHERE id = {$myarray['id']}";

Veya, başka benzer bir yaklaşım var:

$sql = "SELECT * FROM tableA WHERE id = ".$myarray['id'];

Ayrıca gibi yazılabilir: Hangi

$sql = 'SELECT * FROM tableA WHERE id = '.$myarray['id'];

Örnekler başka bir çift:

// This is correct
echo $myarray[5];

// If you are using constants, this is correct too
define('MYCONSTANT', 5);  
echo $myarray[MYCONSTANT];

// This shouldn't be used, because 'name' isn't a constant...
echo $myarray[name];

// Use this instead...
echo $myarray['name'];

// Or, like I explained above, escape the array
echo "My name is {$myarray['name']}";

Umarım yardımcı olur.