Bad sorgu - INNER JOIN

3 Cevap php

I bir SQL sorgusu benim verileri yazdırırken i INNER kaybolur uyarıların çoğu KATILDI kaldırmak zaman, undefinded dizin uyarılar bir demet alıyorum. Ben o hataya neden olduğunu emin değilim.

Benim kodu burada:

<?php
    $id      = $_GET['id'];
    $sql     = "SELECT * FROM updates INNER JOIN clients ON updates.c_id = clients.c_id INNER JOIN pages ON updates.page = pages.p_id INNER JOIN projects ON updates.p_id = projects.p_id WHERE u_id='$id' LIMIT 1";
    echo $sql;
    $result  = mysql_query($sql) or die(mysql_error());
    $row     = mysql_fetch_assoc($result);

    // put update_id in hidden form and pass it to the next page
    $u_id = $row['u_id'];
?>
<h4>Viewing update for <i><? echo $row['fname'] ." ". $row['lname']  ?></i> for their <i><a href="<? echo $row['p_url']; ?>" title="View <? echo $row['p_title']; ?>"><? echo $row['p_title']; ?></a> project</i></h4>
<h4><b>Posted on: </b> <? echo $row['date_submitted'] = date("F j, Y, g:i a"); ?></h4>

Ben ne yapabilirim üzerinde herhangi bir fikir? "Fname" ve "Soyad" orada saklanır çünkü ben INNER JOIN istemciler için var nedeni

clients.c_id = updates.c_id

Ben var burada: "p_url" "p_title" Bu da tabloda projeler depolanır:

clients.c_id = projects.c_id

Edit with new problem

Benim kodu burada:

$sql     = "SELECT 
    updates.u_id AS u_id,
    updates.date_submitted AS date_submitted,
    updates.deadline AS deadline,
    updates.description AS description,
    updates.priority AS priority,
    pages.page_name AS page_name,
    clients.fname AS fname,
    clients.lname AS lname,
    projects.p_url AS p_url,
    projects.p_title AS p_title,
    FROM updates INNER JOIN clients ON updates.c_id = clients.c_id INNER JOIN pages ON updates.page = pages.p_id INNER JOIN projects ON updates.p_id = projects.p_id WHERE u_id='$id' LIMIT 1";

Hata:

Değil eşsiz tablo / rumuz: 'müşteri'

3 Cevap

Düzenlendi cevap:

Ah, yanlış SQL dizinleri ile yapmak zorunda üstlendi. Bu yok dizi öğelerinin yazdırmaya çalışıyorum sizinle ilgili, aslında bir PHP hata, öyle görünür.

$row ($row['deadline'], vb) unsurlarını içerir Baskılarınızda için, sizin sorgu tarafından döndürülen adlı sütun aslında orada olduğundan emin olmak gerekir. "Son" adlı bir sütun, bu uyarıyı oluşturmak için gidiyor yazdırmak için o girişimde değilse.


Edit again: Bu bumped beri, ben biraz daha detaya gitmek sanırım.

Bobince işaret ettiği gibi, her şeyden önce, SQL enjeksiyon mümkün var. Ilk satır olmalıdır:

$id      = intval($_GET['id']);

bir dize olabilir Eğer $ id her zaman bir tamsayı, ve mysql_real_escape_string() olacak eğer.

İkincisi, SELECT *, özellikle birleştiren bir durumda, genellikle kötü şeklidir. Ben belirli alanları geliyor tam olarak hangi tabloları bilmiyorum, ama sen gerçekten kullanmak için gidiyoruz sadece alanları seçin nerede sorgusu, daha bu gibi görünmelidir:

$sql = "SELECT clients.fname, clients.lname, projects.p_url, projects.p_title, updates.date_submitted ".
        "FROM updates ".
            "INNER JOIN clients ON updates.c_id = clients.c_id ".
            "INNER JOIN pages ON updates.page = pages.p_id ".
            "INNER JOIN projects ON updates.p_id = projects.p_id ".
        "WHERE updates.u_id='$id' ".
        "LIMIT 1";

Sonraki, $u_id $id zaten tam olarak aynı değere ayarlanır, bu nedenle anlamsız bir değişken tür alır.

Nihayet, son satırda, sen var:

<? echo $row['date_submitted'] = date("F j, Y, g:i a"); ?>

Bunu yapmak için bekliyorsanız emin değilim, ama date("F j, Y, g:i a"); $row['date_submitted'] atamak ve ardından "true" veya "1" ya da bir şey yazdırmadan sonuna kadar gidiyor, Eğer bu sizin için gittiğini değil muhtemelen.


Newest problem: Her iki istemcileri seçmek için çalışın, ve müşterilerine katılmak, en azından bunlardan birini bir ad vermeden, hem de yapamaz.

Ben bu SQL ile ilgisi olduğunu sanmıyorum (ama yanlış olabilir). Bir başlangıç ​​için this parçacığı bakmak olabilir.

SEÇİN * güncellemeler DAN İÇ müşterilerine JOIN

Eğer 'SELECT *' Ne zaman iki tablodaki her sütun olsun. Sütunlar aynı isimlere sahip olabilir, çünkü tarafından otomatik olarak oluşturulan sütun adları tablo adı öneki '*' vardır. Yani ilişkisel dizi gibi dizinler içerir:

updates.u_id
clients.c_id
...

Böyle 'PAGE_NAME' gibi bir öneksizse sütun adını kullanarak diziyi erişmeye çalıştığınızda bu indeks yoktur çünkü Yani, başarısız olur.

Sen tam sütun adını ('pages.page_name') kullanabilir, ya da açıkça söyleyerek kendi sütun isimlerini verebiliriz:

SELECT updates.u_id AS u_id, pages.page_name AS page_name, ...
FROM updates JOIN client ...

u_id = '$ id'

Tüh, SQL enjeksiyon delik. Tebrikler, obligatory xkcd link bu haftaki 1000'inci kazanan vardır.

() mysql_real_escape_string senin arkadaşın. (Daha da iyisi: mysqli sorguları parameterised.)

Tüh, HTML enjeksiyon delik. htmlspecialchars () senin arkadaşın.