關於XXX.php?id=,XXX.php中的變數id可用的條件是什嗎?
初學php,遇到很多問題,這個問題實在暫時沒想明白,希望大家幫看看。
include("conn.php");
if(!empty($_GET['id']))
{
$id=$_GET['id'];
$sql="select * from `user` where `id`='$id'";
$query=mysql_query($sql);
$result=mysql_fetch_array($query);
}
if(!empty($_POST['sub']))
{
//$id=$_GET['id'];
$title=$_POST['title'];
$content=$_POST['content'];
$id=$_POST['hid'];
$sql="update `user` set `title` = '$title', `content` = '$content' where id='$id limit 1'";
mysql_query($sql);
echo "";
}
?>
剛看了php100的視頻,講解關於微型部落格。其中實現部落格的編輯功能,在index.php中放入一個編輯的連結,如下:
|">編輯
">刪除|
問題是,為什麼當我在edit.php中的第二個if裡不能直接用這個id調用(如代碼中被注釋的一行,如果這樣,會報Undefined index id而且編輯不生效),而是要在表單裡再重新插入hidden?
------解決方案--------------------
">編輯
這個應該是列表頁面進入編輯頁面的url,使用 是用$_GET 擷取的,代碼沒錯。
然後進入到編輯頁面,修改內容後,你按submit提交。表單的method是$_POST。所以$_GET['id']當然沒有資料,因為要用$_POST擷取。但你加了hidden,並用$id=$_POST['hid'];擷取到了。
if(!empty($_POST['sub']))
{
//$id=$_GET['id'];
$title=$_POST['title'];
$content=$_POST['content'];
$id=$_POST['hid'];
$sql="update `user` set `title` = '$title', `content` = '$content' where id='$id limit 1'";
mysql_query($sql);
echo "";
}
代碼可以這樣最佳化:
include("conn.php");
if(isset($_POST['sub'])){ // 判斷是否提交表單
$title=$_POST['title'];
$content=$_POST['content'];
$id=$_POST['hid'];
$sql="update `user` set `title` = '$title', `content` = '$content' where id='$id limit 1'";
mysql_query($sql);
echo "";
exit();
}else{ // 不是提交表單,表示是從列表頁過來
$id=$_GET['id'];
$sql="select * from `user` where `id`='$id'";
$query=mysql_query($sql);
$result=mysql_fetch_array($query);
}
?>
------解決方案--------------------
edit.php 具有兩個不同的功能,在修改微博的過程中將執行兩次
第一次:edit.php?id=nnn
有 url 參數,程式走 if(!empty($_GET['id'])) 真 分支
完成查詢資料
並充填表單
第二次 表單提交 edit.php
沒有 url 參數,程式走 if(!empty($_POST['sub'])) 真 分支
完成資料修改後跳轉至目錄頁
由於兩個條件不會同時成立,所以 $id=$_GET['id'] 在第二個 if 中不可用
此程式有一個潛在的問題:
當直接瀏覽器訪問 edit.php 時,因為兩個條件都不成立。會在充填表單時發生錯誤,而暴露伺服器布局
如果忽略錯誤檢查,此時應為新微博輸入。但 edit.php 並無新增微博的處理代碼
而當做修改的話,又因缺少 id 造成修改失敗。還會給出'更新完成'的虛假資訊