[英]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.