簡體   English   中英

錯誤查詢 - INNER JOIN

[英]Bad query - INNER JOIN

當我從 SQL 查詢中打印出我的數據時,我收到一堆未定義的索引警告,當我刪除 INNER JOINS 時,大多數警告都消失了。 我不確定是什么導致了該錯誤。

我的代碼在這里:

<?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>

知道我能做什么嗎? 我有 CLIENTS 的 INNER JOIN 的原因是因為“fname”和“lname”存儲在那里

clients.c_id = updates.c_id

我有:“p_url”“p_title”這些存儲在表項目中,這也是:

clients.c_id = projects.c_id

編輯新問題

我的代碼在這里:

$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";

錯誤是:

不是唯一的表/別名:“客戶”

編輯答案:

啊,我錯誤地認為它與 SQL 索引有關。 看起來它實際上是一個 PHP 錯誤,與您嘗試打印出不存在的數組元素有關。

對於包含$row元素( $row['deadline']等)的所有打印,您需要確保查詢返回的實際列名。 如果沒有名為“deadline”的列,則嘗試打印它會生成警告。


再次編輯:因為這被撞了,我想我會 go 更詳細一點。

首先,正如 bobince 指出的那樣,您可以進行 SQL 注入。 第一行應該是:

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

如果 $id 將始終是 integer 和mysql_real_escape_string()如果它可以是字符串。

其次, SELECT *通常是錯誤的形式,尤其是在有連接的情況下。 我不確切知道特定字段來自哪些表,但您的查詢應該看起來更像這樣,您 select 只有您實際要使用的字段:

$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";

接下來, $u_id被設置為與$id已經擁有的值完全相同的值,因此它是一種毫無意義的變量。

最后,在最后一行,您有:

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

我不確定你期望它做什么,但它會分配date("F j, Y, g:ia"); $row['date_submitted']然后最終打印出“true”或“1”之類的東西,這可能不是你想要的。


最新問題:你們都嘗試從客戶 select 並加入客戶,你不能同時做這兩個,至少不給其中一個別名。

我不認為這與 SQL 有任何關系(但我可能是錯的)。 你可以先看看這個線程。

SELECT * FROM 更新 INNER JOIN 客戶端

當您“選擇 *”時,您會從兩個表中獲取每一列。 因為列可以具有相同的名稱,所以由 '*' 自動生成的列名以表名作為前綴。 因此,您的關聯數組將包含以下索引:

updates.u_id
clients.c_id
...

因此,當您嘗試使用不帶前綴的列名(例如“page_name”)訪問數組時,它會失敗,因為該索引不存在。

您可以使用完整的列名('pages.page_name'),也可以通過以下方式明確給出自己的列名:

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

u_id='$id'

哎呀,SQL 注入孔。 恭喜,您是本周第 1000 位強制性 xkcd 鏈接的獲勝者。

mysql_real_escape_string() 是你的朋友。 (更好的是:mysqli 參數化查詢。)

<? 回聲 $row['deadline']; ?>

哎呀,HTML 注入孔。 htmlspecialchars() 是你的朋友。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM