有一個頁面,特定使用者登入後,可以在該頁面中輸入mysql查詢命令.
php伺服器接收到該命令後,直接將該命令字串傳給mysql執行,再將結果顯示在該頁面上.
剛開始在javascript中將該可編輯控制項的內容直接傳向伺服器,不行,該命令字串中的">"或者"<"等符號不正常.
後又將該字串用javascript的encodeURIComponent函數轉換後發送,在伺服器端再用php的html_entity_decode函數轉換回來,這樣子呢,我所使用的大部分命令可以了,只是命令中的引號就不正常了.
查來查去,找不到方法了,一個字串,在網路中傳送竟然太多的麻煩了.
請解惑!
回複討論(解決方案)
encodeURIComponent用它轉碼後,php直接接收即可吧!不需要再轉了吧!
將html_entity_decode()換成rawurldecode();
htmlspecialchars_decode 試試這個函數
各種轉碼函數試一遍
1、你的總是要輸入在文本控制項中的,無論是表單提交還是ajax發送,均不需要做處理
2、在用ajax發送時,如果頁面不是 utf-8 的,且發送的串中可能有中文。則應考慮在設計ajax組件時加入 encodeURIComponent 做 url 編碼,服務端需做字元集轉換
3、服務端在收到資料後,應根據 get_magic_quotes_gpc 的狀態進行去轉義操作(stripslashes)
php5.3以後 magic_quotes_gpc 開關預設關閉和取消,已不再需要這一步了
4、encodeURIComponent 是按utf-8字元集做 url 編碼處理,即無論頁面是什麼字元集的,服務端得到的都是 utf-8 的資料
5、html_entity_decode 是 htmlentities 的逆函數,與 url 編碼無關
瞭解了這些基礎知識以後,我想你應該可以繼續了
感謝各位大俠的協助!
我認真看完後,詳細作了測試.
只是我的輸入是一個可編輯的DIV,只是,在測試時,也換為文字框試過.
不作任何轉換,如果只是在輸入框輸入:select * from tablename這樣的查詢沒問題,如果是:select * from tablename where id>5,就出錯了.
在發送時加encodeURIComponent函數,伺服器用html_entity_decode後,可以select * from tablename where id>5正常出結果.
當初用這個encodeURIComponent時,只是找啊找,找到這個試了試,只是在php下卻沒有相應的解碼函數,就用的html_entity_decode試.
下面是我的測試代碼:
用戶端
測試
服務端
測試getconnect_error){printf("串連失敗:%s\n",$mysqli->connect_error);exit();}$mysqli->query("set names 'utf8'");//$sqlstr=$_POST['str'];$sqlstr=html_entity_decode($_POST['str'],ENT_COMPAT,'UTF-8');//$sqlstr=html_entity_decode($_POST['str']);echo "sqlstr=".$sqlstr."
";$res=$mysqli->query($sqlstr);if (!$res){echo $mysqli->error;exit;}$finfo=$res->fetch_fields();echo "
";foreach($finfo as $val){echo "
| ".$val->name." | ";}echo "
";while($row=$res->fetch_row()){echo "
";for ($i=0;$i<$res->field_count;$i++){echo "
| ".$row[$i]." | ";}echo "
";}echo "
";?>
建議直接用封裝好的jquery來實現ajax的功能需求
初學,不懂jquery.
只是,我這個程式不複雜,應該javascript沒問題吧.
初學,不懂jquery.
只是,我這個程式不複雜,應該javascript沒問題吧.
初學就直接上jquery吧...嘿嘿 研究一下 2小時就通了.
把服務端改作
運行後可看到
鬱悶了!
同樣的代碼,我的卻是下面這個樣子:
會不會和apache及php的版本有問題,或者有什麼設定不對.
我的apache是2.2.4,
php是5.2.3
再附測試代碼:
測試
t2_1get.php:
如果在用戶端加上encodeURIComponent轉換,又成了這個樣子:
如果 >'5'
變成了 >\'5\'
則表示 magic_quotes_gpc 開關是開啟的,自動進行了轉義處理
所以你需要有
if(get_magic_quotes_gpc()) { $_POST['str'] = stripslashes($_POST['str']);} 感謝xuzuning版主的協助!
可以了,感謝感謝!