PHP關於修改會員資料
目前我做了一個會員系統,然而裡面的修改update
我已做出,可是每當使用者要修改資料
假設他只需要修改電話,地址
如果只打入電話地址,那原本的其他資料就會消失
也就是說,他不管是要修改哪一欄
都得把所有的資料重打一次
我想請問各位大大,我該如何下判斷式
讓使用者可以只輸入他要修改的欄位就好呢?
TO 緊衣喂
我目前就是用這個語法
update table set aaa='$aaa', bbb='$bbb',......where id = '登入的會員'
但是我的問題是在
假設使用者可以修改 姓名 電話 地址
但是使用者僅只要修改電話的話
按下修改
而資料庫內的姓名跟地址會不見,因為使用者在修改時並沒輸入
這樣的話 我需要個判斷式來判斷使用者修改時沒修改的欄位要帶入原值
我是在詢問該怎麼下這個判斷式
不過也謝謝你的回答
TO 緊衣喂
我目前 update_finish.php的語法如下
無標題文件
include("mysql_connect.php");
$studentnumber = $_POST['studentnumber'];
$name = $_POST['name'];
$indate = $_POST['indate'];
$effectivedate = $_POST['effective date'];
$outdate = $_POST['outdate'];
$other = $_POST['other'];
不知為何無法貼上來完整的= =
我現在想知道的是,該如何叫出資料庫裡原有的值帶入到欄位裡
然而目前在member.php
這頁面
我讓會員顯示在頁面上
比如
姓名:XXX 電話:XXX 地址:XXX
這是頁面看的見的
那我現在在前方加入了
修改 姓名:XXX 電話:XXX 地址:XXX
這樣的話我想知道 如何讓那個修改按鈕按下去後
可以對應到那個會員的資料進而修改
也就是
修改 姓名:001 電話:001 地址:001
我點修改進去後
能帶出001會員的資料
接著修改
這樣的話我是要再member頁做修改還是在update頁做修改呢
麻煩各位大大了
TO 流浪玩家
不知大大是否有及時通或MSN
讓我直接請教你呢
在這邊真的有點說不太清楚ˊˋ
目前以上問題已經解決,謝謝各位大大
我想請問新的問題
目前我用dreamweaver做了一個一階下拉選單
舉例來說
選單內容為班級
甲乙丙丁
假設我選甲後
會跳入member頁面
並且顯示出甲班內的所有學生資料 如下
修改 學生:XXX 座號:XXX ←前方修改為超連結
因此我想詢問該如何將下拉選單連進資料庫搜尋資料後抓出顯示在頁面上
希望能有範例提供我參考
謝謝
TO 流浪玩家
是否有單純以PHP來寫的方式呢?
TO 流浪玩家
我有去看你的程式碼
那段應該沒有連資料庫的部份對吧
我現在想知道 我該怎麼連資料庫
用$_GET['semester']嗎
5 個解答
- 流浪玩家Lv 61 0 年前最佳解答
我想您要的應該是表單內有些資料是必填,
而表單內的資料要帶出他原始的資料是嗎?
如果是的話,
當然您可以使用 JavaScript 先作一次提醒的動作,
但是 JavaScript 是可以被使用者手動關閉的,
而且有些瀏覽器是不支援 JavaScript 的。
所以您的 PHP 還是要處理,
先檢查一些必填的資料欄位,
若是有填才更新,
未填就不處理。
我提供的程式碼姓名、電話與地址是必填,
而嗜好這一項是非必填。
示範程式碼如下:
<?php
$member = 'tester';
$note = '';
if($_POST) {
$name = htmlspecialchars($_POST['name'] , ENT_QUOTES);
$phone = htmlspecialchars($_POST['phone'] , ENT_QUOTES);
$address = htmlspecialchars($_POST['address'] , ENT_QUOTES);
$hobby = htmlspecialchars($_POST['hobby'] , ENT_QUOTES);
$columns = '';
if($name != '')
$columns .= '`name` = "' . $name . '",';
if($phone != '')
$columns .= '`phone` = "' . $phone . '",';
if($address != '')
$columns .= '`address` = "' . $address . '",';
$columns .= '`hobby` = "' . $hobby . '",';
if($columns != '') {
$columns = substr($columns , 0 , -1);
$str = 'UPDATE `users` SET ' . $columns . ' WHERE `id` = "' . $member . '"';
$sql = mysql_query($str);
if($sql) {
$note = '更新成功';
} else {
$note = '更新失敗';
}
}
}
$str = 'SELECT `name` , `phone` , `address` , `hobby` FROM `users` WHERE `id` = "' . $member . '"';
$sql = mysql_query($str);
$ary = mysql_fetch_array($sql , MYSQL_ASSOC);
?>
<?=$note?>
<form name="data" action="" method="post">
姓名:<input type="text" name="name" value="<?=$ary['name']?>" /><br />
電話:<input type="text" name="phone" value="<?=$ary['phone']?>" /><br />
住址:<input type="text" name="address" value="<?=$ary['address']?>" /><br />
嗜好:<input type="text" name="hobby" value="<?=$ary['hobby']?>" /><br />
<input type="submit" value="送出" />
</form>
<script type="text/javascript">
var data=document.data;
data.onsubmit=function(){
if(data['name'].value==''){
alert('姓名未填');
data['name'].focus();
return false;
}else if(data['phone'].value==''){
alert('電話未填');
data['phone'].focus();
return false;
}else if(data['address'].value==''){
alert('地址未填');
data['address'].focus();
return false;
}
}
</script>
2010-10-11 14:47:30 補充:
不好意思,
因為字數限制,
所以將一些程式碼移除了。
2010-10-14 14:40:33 補充:
不見得任何時候都要使用物件或函式吧!
我只是希望發問者比較能夠了解我的回答而已!
而我的解題通常都是將邏輯呈現,
這個學得好學不好一點關係都沒有吧!
況且,
您的作法也有些問題,
您怎麼如此的 "篤定" 每一個 POST 變數都是必填,
而且也要寫入資料庫呢?
解決問題的第一步,
要先去想問題要如何 "正確的" 被解決,
而不是去想程式碼如何去建置,
那些都只是 "方法" 而已。
問題的 "本質" 有時比 "物件" 還要重要些!
2010-10-14 14:50:38 補充:
物件的確是有它的優點,
但是無論如何都想要用物件是不是就有點 "over" 了呢?
2010-10-14 18:20:51 補充:
……
如果可以讓發問者了解問題所在的話,
何需重構?
先去了解問題必需是絕對優先的。
我只是用一個比較簡單的方式回答問題而已,
何需每件事都看的如此嚴重呢?
已經告訴發問者這個邏輯了,
之後要如何去建置程式,
就看他自己了。
而且我也並不認為使用物件是唯一表達自己專業的方式。
2010-10-14 18:25:43 補充:
這就是為何我使用 "示範程式碼" 這個詞的原因 ~~~
留下一些空間讓發問者去思考,
不把問題答到滿,
這也是我一直以來的原則。
2010-10-14 20:15:38 補充:
我想您所補充的問題,
您可以使用 onchange 事件以使 javascript 的 location 。
2010-10-14 23:23:36 補充:
不行喔!
這個部份原則上只能用 javascript 。
2010-10-15 17:47:35 補充:
http://tw.myblog.yahoo.com/jw!MCNlvWSBHwMWeZ6nwyUY...
select 選單示範程式碼。
與本題無關的討論希望就此打住,
希望這篇 "意見" 能夠讓問題回到正軌。
其它的問題應該在別的地方作進一步的討論,
否則容易讓問題失焦。
接下來除了發問者的問題之外一概不再回應。
2010-10-16 11:44:10 補充:
我這篇只是回答如何使用 select & javascript 作換頁,
而在連到頁面之後(例如:test.php),
當然連接資料庫的動作就會在這一頁(test.php),
我想這個部份您應該是沒有問題的。
您當然可以使用 $_GET['semester'] 來作判斷,
問題就是要傳遞給 test.php 這個 GET 變數。
2010-10-16 12:39:47 補充:
當然您的寫法是不錯的,
但是可能沒有考慮到其它不同的情況。
這樣的重構會導致一些情況喔!
就是有些表單予許把之前填的清掉。
而且很可能會有一些 $_POST 的值是不需要寫入資料庫的,
因為它們只是作一些值的判斷,
這樣的話,
是不是就一定要先將不要寫入資料庫的值從 $_POST 當中清除?
或者是這些 HTML 的 input tag 就不能有 name 這個屬性。
如果不這樣作,
這些 $_POST 若是有值,
都會被編寫成 SQL ,
這樣的 SQL 可能就會發生錯誤!
2010-10-16 12:40:28 補充:
這樣寫是還不錯,
但是對於整個 $_POST 的依賴性過強!
或許可能還不如 $_POST['val'] 這樣子取值來的彈性。
要這樣寫,
基本上我是認同的,
但是可能會產生其它問題,
反而會在別的地方多作工。
2010-10-16 21:07:14 補充:
您的說法我基本上也是認同!
不過據我所知,
$_POST 的 $key & $value ,
有人會自己寫個表單或其它的方式(Curl or LWP 等等)亂設 input 的 name or value 傳值喔(就是把 name 亂設成不在資料庫的欄位名稱)!
故意去引發 SQL 的失敗喔!
目的是什麼不用想也知道!
只取那些需要的不就好了?
當然您的寫法不錯!
但是就如我所說會引發其它的問題。
2010-10-17 18:28:54 補充:
好啦!
懂您的意思了!
這些討論我想應該可以就此打住了!
這個問題是一定有解決方式的!
不過我想出來的方式並不是用程式的方式來作。
我想說的是:
看事情不要用只專注在某一個角度,
有的時候要去想一想這個方式會引發什麼問題?
如果可以解決是 OK 的!
那如果不行或是解決了這個問題又引發了下一個,
這個方法是不是一定要用?
因為任何的方法都是有優缺點的!
2010-11-11 12:01:26 補充:
容我再說最後一次,
程式不是寫得快或是能運作或將其組織好就好,
同時也要注意安全性以及效能等等的問題,
而且也要有流量的概念!
這也是我想說的,
寫程式的人心不能完全在 "程式碼" 上。
參考資料: 自己 - SamLv 61 0 年前
to 流浪玩家:
給您一個不錯的建議:您的程式碼需要重構。
能重複使用而不需要重複編寫的東西太多了。
既然您已經具備有函式和物件的技術能力。
為何不用呢?
2010-10-13 23:14:45 補充:
另外就是給原po的建議。
我是一個比較重視程式設計編程的人。
也因此在我眼下只有教好沒學過的人。
而沒有「初學者」這種字眼。
這有一篇我寫的文章,關於基本的php程式和顯示架構分離的方法。
或許有一些你看不懂的技術。我歡迎你來信詢問。
正確而良好的編程比過長而複雜的程式更顯的重要許多。
原諒我個人並不喜歡把任何人都當初學者。
我會當你們都有學過,如果不會,那就是發問或找資料。
網址補在下一個意見。
2010-10-13 23:16:40 補充:
請參照:php純view樣板載入器。
另外也回一下CY的意見。
基本上我設計的功能都包在物件中了。
包含特殊空白情況要使用與否的過濾功能。
請原諒我個人本身就不喜歡直譯式編程。
2010-10-14 17:18:49 補充:
一點都不over.........
否則為什麼要有codeigniter或是cakephp或是一些php用的framework的存在呢?
又為什麼我們要不斷的探討所謂的程式編程呢?
又為什麼我邀請您來參加研討會您都沒下文呢?
2010-10-14 17:22:23 補充:
所謂的「邏輯」呈現。可不是只是讓程式看起來很有「邏輯」這麼簡單。
編程的意思在於良好的結構讓「邏輯」更加的容易掌握。
更多的時候把複雜的邏緝簡化成單純的「邏輯」集合體。
這反而讓程式變得更加易讀易懂。
大多時候只想著讓別人維持現狀,以為他們就只能懂到這樣的程度。
那麼大家就不會求進步。
你的東西經過「重構」後會複雜難懂嗎?
我想不會。
我們不要去小看任何一個人的學習能力。
而何況「物件」或是「函式」卻也只是基礎能力而已。
所以請您:重構吧!
2010-10-14 17:23:53 補充:
最後我想您一直對我有些誤會的樣子。
所以我還是很誠心誠意的繼續邀請您來參加我們的程式設計研討會。
你不用擔心,主講人是一位20年資歷的程式設計師。不是我。
2010-10-14 21:42:40 補充:
to 流浪玩家:
會用「物件」不代表「專業」。
物件導向不過只是程式設計的一項基本而已。
你在學java的時候,會因為第一堂課就是在教你物件導向而會去排斥他?
還是就把物件導向這件事視為理所當然?
其實php的物件我們是可以視其為理所當然。
對於初學者也可以讓他們認為這就是理所當然。
究竟我們是要花七天學會php,卻寫了一個改一年也改不完的code?
還是花多一點的時間學好物件和編程。
改一個code只要一個工作天甚至更短?
去理解這樣的事,那才叫專業。
2010-10-14 21:46:28 補充:
七天!就是我去年三月時學會php的時間。
然後今天我改不動去年我寫的code。
但我很輕易的可以去改我最近半年寫的東西。
我不相信一個函式或方法裡頭就只有個三行、五行,最多不超過十行。
這種東西會無法維護。
但一個直譯式300行以上的程式。就會變得難以維護。
如果把物件或函式只視為功能性的重用(大多數人似乎很喜歡這樣看待
物件導向。)這完全是小看了物件的功能。
2010-10-14 21:52:43 補充:
函式提取、單一職責、多層結構提取、物件的繼承、介面、虛擬類別、抽象層。講這麼多都還是基本。
因為學校不教,補習班不教,會的人又愛教不教。
於是這些東西被貼上「進階」技術的標籤。
初學者也不懂,聽大家說那很難或是聽說那是基礎要會再來學的東西。
有幾個人知道就算學到這樣的階段也不過就是整個編程技術的5%可能都還不到?
MVC也被一堆人視為較高階的技術......我是不曉得他到底高階在那。
MVC的V我已經實作出樣板引擎。
M的部份也只差SQL的JOIN尚未決定使用的方法。
2010-10-14 21:59:04 補充:
我有比較天才嗎?並沒有。至少我32歲才開始學PHP。比起各位年輕人都算晚的。但一個成就在於你執著於程式的熱誠所在。
指導我精進的那個人,聽說我要學PHP,在我還是初學者時,就放我自己學習了半年。
我遇到很多挫折,知道寫程式為什麼痛了之後。
他才教我正確的編程。
最終掌握的就是目前所掌握的技術能力→僅管他根本就只是基礎。
今日不學,明日不學,我們依舊停滯不前。
看到越多外國人寫的技術書籍。卻依然發現書上的東西別人不用。
自己看過了,也學了,卻沒有想辦法去用。
有時燈泡亮起來時,才會驚覺那些編程的妙用之處。
2010-10-14 22:04:49 補充:
很多時候,有些難懂的技術問題只是出在教學者使用的語意不好。
我們要改善的,是將那些技術的教學改成簡單容易明白的語意。
而不是放任那些技術空在那,還去想說用並非良好只是看似簡單的編程。
來我家上過課的,在我講解完物件導向的方法時。
都驚訝於為什麼這樣的一個技術明明就很簡單,他們看書學卻總是學不懂?
他不是毒蛇猛獸,編程技術也不是。
真的要怪,就是怪翻譯的人文筆不是很好嗎?倒也不是。
真正要怪的,是國內那些出書的作者,永遠都在教所謂的「初學者」。
程式設計這塊領域永遠都不會有初學者。
有的只有兩種人:會的人。跟不會的人。
2010-10-14 22:13:33 補充:
我們的目標,在提倡良性的編程技術。
在於提倡快速而敏捷有效率的開發程式。
在於讓想學習程式入這個業界的人了解這一行的本質或特質。
對程式的熱情,在於絕對不能得過且過。
在於不論任何的新技術、方向,都必須學習和嚐試。
說句實在話。
前二個小時為了想就這一題來結合我之前寫的功能時。
不論你們信不信→他再差一點點就變成一個小型的framework了。
嗯!理解所謂的技術、原則之後。
有些東西並不如表面看到的如此難懂。
程式設計師還是先學會相信自己。
2010-10-14 22:15:29 補充:
這一題我想講的東西都在意見發表完了。
只差沒寫成論文。
賺取知識點數不是我的目的。
教學才是我的目的。
我也無意跟幾位去要最佳解答,所以這一題我就自刪了。
反正我相信原po也多少學到一些東西才是。
2010-10-16 07:44:29 補充:
foreach($_POST as $key => $value){
if($value != null){
$value = htmlspecialchars($value,ENT_QUOTES)
$setdata_array[] = "{$key} = '{$value}";
}
}
2010-10-16 07:45:06 補充:
$setdata = implode(",",$setdata_array);
$str = "UPDATE `users` SET {$setdata} WHERE `id` = '{$member}'";
嗯咳!
小小一個重構!獲取一個大大的妙用。
2010-10-16 13:55:00 補充:
我覺得流浪玩家你對一些細節太鑽牛角尖了些。
功能性的判斷,要加些什麼,少些什麼,做些什麼。
你知。我知。
$_POST['val']的彈性力非常不足,這你自己心裡應該很明白才是。
簡單來說,如果使者的表單今天從5個欄位增加成10個欄位時。
依照你的方式每多一個欄位就要多增加二三行程式碼。
事實上!本來就只針對要傳的資料給他name值的定義。
而就你所說的,這不過只是一個範例。
2010-10-16 13:58:16 補充:
若你真的需要就多欄位name去做設計(也就是非得去動程式!事實上我們
應該針對末端介面去修改他的配置,但不應該去動我們的程式。)
也不過就增加一個需要的或是不需要的欄位給他陣列再用foreach判斷。
然後我們就會發現這樣的功能包成函式物件的話,日後要使用他就叫出來
直接用就好了。
我們要學習的,不是為了增加一個功能而去動程式。
應該要的是,就算增加100個功能,都能夠僅可能的不要動到程式。
「介面」為是一個很好的解決方式。
「抽象」也是。
2010-10-16 23:55:10 補充:
所以我不是也說了,這只是個「範例」。
所以你所說的引發$_POST的問題自然會有函式能夠去處理掉。
AND,只取那些需要的萬一真的是龐大的輸入資料。
我們就得改程式碼了嗎?
相信我講了這麼多,你很清楚我講的重點是什麼。
我們不能因噎廢食。而程式都有他的解決之道。
2010-10-17 21:07:07 補充:
看事情是不該專注在某一個角度。
正因為如此,很多東西都會透過各種的函式、物件甚至於模組化功能來處理掉大量的資料。
問題一個接著一個引發,表示你的程式相關連性過高!
也就是所謂的「耦合性」過強。
越是單純化的東西越能降低耦合性而避免環環相扣的錯誤。
也因此我相說的是:
有空多看一些程式設計結構的書籍吧。不要只是會php而已!
2010-10-17 21:09:35 補充:
and .............
我老闆說歡迎流浪玩家你來上我們的程式設計結構課程喔!
原則上要上我們的程式設計結構課程前都必須經過我的認證才行。
好避免上課的東西會讓人難以理解。
不過以流浪玩家你的情況看起來,應該不用過問我了。
只要開課前我就會直接通知到你。
反正從你的資料看來你是住台北沒錯。
- CYLv 51 0 年前
插一句嘴
>要更新的欄位帶舊的資料進去,填好之後送出就用第二種方法做更新資料庫的動作
如果使用者就是要將某些資料刪除 (改成空白) "用第二種方法做更新資料庫的動作" 反而無法讓使用者達到目的
- 您覺得這個回答如何?您可以登入為回答投票。
- 緊衣喂Lv 51 0 年前
update table set tel='$tel', addr = '$addr' where id = '登入的會員'
這樣只會修改電話與地址而已,如果只能修改這二項的話
基本上修改時,還是要將該會員的基本資料全部載入到你的form中,待會員修改完送出後如新增會員一樣就不是用insert語法,而是用update語法,只是要判斷一下必要欄位是否都有輸入
變成如下範例
update table set aaa='$aaa', bbb='$bbb',......where id = '登入的會員'
希望有幫到你
2010-10-07 14:03:55 補充:
我上面的意思是你
修改時,還是要將該會員的基本資料全部載入到你的form中,待會員修改完送出後如新增會員一樣就不是用insert語法,而是用update語法,只是要判斷一下必要欄位是否都有輸入
所以使用者在修改時,姓名與地址還是會帶出來的,並不會不見,所以更新至資料庫時,會是正常的,如同黃金小狐狸大大的第一種方式,你可以參考一下,比較常見的是你去一個論壇或部落格或網站,當你有註冊資料時,你要修改時,他一定是把你的所有資料帶入form中,當你只更改了其中一或二個欄位,他也會正常的更新
2010-10-07 14:12:27 補充:
另有一做法,如先刪除,再用新增的方式,但前提都是要先帶入全部的資料至你的form中,或用黃金小狐狸大大的第二種方式
重點是先帶入全部的資料至你的form中