1. python正則表達式問題,為什麼圖中這樣寫會返回字元串中間的部分,不是應該返回整個字元串嗎
對於findall方法,如果模式中出現了一個或多個分組,則返回的是一個分組的列表。
因為你的模式中有一個分組(.*),返回的自然是這個分組匹配到的內容。要返回整個字元串,去掉(.*)中的括弧就行了,這樣寫:'lift.*python'。
2. php referer怎麼過濾
php安全篇值過濾用戶輸入的人參數
規則 1:絕不要信任外部數據或輸入
關於Web應用程序安全性,必須認識到的第一件事是不應該信任外部數據。外部數據(outside data) 包括不是由程序員在PHP代碼中直接輸入的任何數據。在採取措施確保安全之前,來自任何其他來源(比如 GET 變數、表單 POST、資料庫、配置文件、會話變數或 cookie)的任何數據都是不可信任的。
例如,下面的數據元素可以被認為是安全的,因為它們是在PHP中設置的。
復制代碼 代碼如下:
<?php
$myUsername = 'tmyer';
$arrayUsers = array('tmyer', 'tom', 'tommy');define(」GREETING」, 'hello there' . $myUsername);?>
但是,下面的數據元素都是有瑕疵的。
清單 2. 不安全、有瑕疵的代碼
復制代碼 代碼如下:
<?php
$myUsername = $_POST['username']; //tainted!
$arrayUsers = array($myUsername, 'tom', 'tommy'); //tainted!
define(」GREETING」, 'hello there' . $myUsername); //tainted!
?>
為 什麼第一個變數 $myUsername 是有瑕疵的?因為它直接來自表單 POST。用戶可以在這個輸入域中輸入任何字元串,包括用來清除文件或運行以前上傳的文件的惡意命令。您可能會問,「難道不能使用只接受字母 A-Z 的客戶端(Javascrīpt)表單檢驗腳本來避免這種危險嗎?」是的,這總是一個有好處的步驟,但是正如在後面會看到的,任何人都可以將任何錶單下載 到自己的機器上,修改它,然後重新提交他們需要的任何內容。
解決方案很簡單:必須對 $_POST['username'] 運行清理代碼。如果不這么做,那麼在使用 $myUsername 的任何其他時候(比如在數組或常量中),就可能污染這些對象。
對用戶輸入進行清理的一個簡單方法是,使用正則表達式來處理它。在這個示例中,只希望接受字母。將字元串限制為特定數量的字元,或者要求所有字母都是小寫的,這可能也是個好主意。
清單 3. 使用戶輸入變得安全
復制代碼 代碼如下:
<?php
$myUsername = cleanInput($_POST['username']); //clean!
$arrayUsers = array($myUsername, 'tom', 'tommy'); //clean!
define(」GREETING」, 'hello there' . $myUsername); //clean!
function cleanInput($input){
$clean = strtolower($input);
$clean = preg_replace(」/[^a-z]/」, 「」, $clean);$clean = substr($clean,0,12);
return $clean;
}
?>
規則 2:禁用那些使安全性難以實施的 PHP 設置已經知道了不能信任用戶輸入,還應該知道不應該信任機器上配置 PHP 的方式。例如,要確保禁用 register_globals。如果啟用了 register_globals,就可能做一些粗心的事情,比如使用 $variable 替換同名的 GET 或 POST 字元串。通過禁用這個設置,PHP 強迫您在正確的名稱空間中引用正確的變數。要使用來自表單 POST 的變數,應該引用 $_POST['variable']。這樣就不會將這個特定變數誤會成 cookie、會話或 GET 變數。
規則 3:如果不能理解它,就不能保護它
一些開發人員使用奇怪的語法,或者將語句組織得很緊湊,形成簡短但是含義模糊的代碼。這種方式可能效率高,但是如果您不理解代碼正在做什麼,那麼就無法決定如何保護它。
例如,您喜歡下面兩段代碼中的哪一段?
清單 4. 使代碼容易得到保護
復制代碼 代碼如下:
<?php
//obfuscated code
$input = (isset($_POST['username']) ? $_POST['username']:」);//unobfuscated code
$input = 」;
if (isset($_POST['username'])){
$input = $_POST['username'];
}else{
$input = 」;
}
?>
在第二個比較清晰的代碼段中,很容易看出 $input 是有瑕疵的,需要進行清理,然後才能安全地處理。
規則 4:「縱深防禦」 是新的法寶
本教程將用示例來說明如何保護在線表單,同時在處理表單的 PHP 代碼中採用必要的措施。同樣,即使使用 PHP regex 來確保 GET 變數完全是數字的,仍然可以採取措施確保 SQL 查詢使用轉義的用戶輸入。
縱深防禦不只是一種好思想,它可以確保您不會陷入嚴重的麻煩。
既然已經討論了基本規則,現在就來研究第一種威脅:SQL 注入攻擊。
防止 SQL 注入攻擊
在 SQL 注入攻擊 中,用戶通過操縱表單或 GET 查詢字元串,將信息添加到資料庫查詢中。例如,假設有一個簡單的登錄資料庫。這個資料庫中的每個記錄都有一個用戶名欄位和一個密碼欄位。構建一個登錄表單,讓用戶能夠登錄。
清單 5. 簡單的登錄表單
復制代碼 代碼如下:
<html>
<head>
<title>Login</title>
</head>
<body>
<form action=」verify.php」 method=」post」>
<p><label for='user'>Username</label>
<input type='text' name='user' id='user'/>
</p>
<p><label for='pw'>Password</label>
<input type='password' name='pw' id='pw'/>
</p>
<p><input type='submit' value='login'/></p>
</form>
</body>
</html>
這個表單接受用戶輸入的用戶名和密碼,並將用戶輸入提交給名為 verify.php 的文件。在這個文件中,PHP 處理來自登錄表單的數據,如下所示:
清單 6. 不安全的 PHP 表單處理代碼
復制代碼 代碼如下:
<?php
$okay = 0;
$username = $_POST['user'];
$pw = $_POST['pw'];
$sql = 「select count(*) as ctr from users where username='」.$username.」' and password='」. $pw.」' limit 1″;$result = mysql_query($sql);
while ($data = mysql_fetch_object($result)){if ($data->ctr == 1){
//they're okay to enter the application!
$okay = 1;
}
}
if ($okay){
$_SESSION['loginokay'] = true;
header(」index.php」);
}else{
header(」login.php」);
}
?>
這 段代碼看起來沒問題,對嗎?世界各地成百(甚至成千)的 PHP/MySQL 站點都在使用這樣的代碼。它錯在哪裡?好,記住 「不能信任用戶輸入」。這里沒有對來自用戶的任何信息進行轉義,因此使應用程序容易受到攻擊。具體來說,可能會出現任何類型的 SQL 注入攻擊。
例如,如果用戶輸入 foo 作為用戶名,輸入 ' or '1′='1 作為密碼,那麼實際上會將以下字元串傳遞給 PHP,然後將查詢傳遞給 MySQL:
復制代碼 代碼如下:
<?php
$sql = 「select count(*) as ctr from users where username='foo' and password=」 or '1′='1′ limit 1″;?>
這個查詢總是返回計數值 1,因此 PHP 會允許進行訪問。通過在密碼字元串的末章節附註入某些惡意 SQL,黑客就能裝扮成合法的用戶。
解 決這個問題的辦法是,將 PHP 的內置 mysql_real_escape_string() 函數用作任何用戶輸入的包裝器。這個函數對字元串中的字元進行轉義,使字元串不可能傳遞撇號等特殊字元並讓 MySQL 根據特殊字元進行操作。清單 7 展示了帶轉義處理的代碼。
清單 7. 安全的 PHP 表單處理代碼
復制代碼 代碼如下:
<?php
$okay = 0;
$username = $_POST['user'];
$pw = $_POST['pw'];
$sql = 「select count(*) as ctr from users where username='」.mysql_real_escape_string($username).」' and password='」. mysql_real_escape_string($pw).」' limit 1″;$result = mysql_query($sql);
while ($data = mysql_fetch_object($result)){if ($data->ctr == 1){
//they're okay to enter the application!
$okay = 1;
}
}
if ($okay){
$_SESSION['loginokay'] = true;
header(」index.php」);
}else{
header(」login.php」);
}
?>
使用 mysql_real_escape_string() 作為用戶輸入的包裝器,就可以避免用戶輸入中的任何惡意 SQL 注入。如果用戶嘗試通過 SQL 注入傳遞畸形的密碼,那麼會將以下查詢傳遞給資料庫:
select count(*) as ctr from users where username='foo' and password='\' or \'1\'=\'1′ limit 1″資料庫中沒有任何東西與這樣的密碼匹配。僅僅採用一個簡單的步驟,就堵住了 Web 應用程序中的一個大漏洞。這里得出的經驗是,總是應該對 SQL 查詢的用戶輸入進行轉義。
但是,還有幾個安全漏洞需要堵住。下一項是操縱 GET 變數。
防止用戶操縱 GET 變數
在前一節中,防止了用戶使用畸形的密碼進行登錄。如果您很聰明,應該應用您學到的方法,確保對 SQL 語句的所有用戶輸入進行轉義。
但 是,用戶現在已經安全地登錄了。用戶擁有有效的密碼,並不意味著他將按照規則行事 —— 他有很多機會能夠造成損害。例如,應用程序可能允許用戶查看特殊的內容。所有鏈接指向 template.php?pid=33 或 template.php?pid=321 這樣的位置。URL 中問號後面的部分稱為查詢字元串。因為查詢字元串直接放在 URL 中,所以也稱為 GET 查詢字元串。
在 PHP 中,如果禁用了 register_globals,那麼可以用 $_GET['pid'] 訪問這個字元串。在 template.php 頁面中,可能會執行與清單 8 相似的操作。
清單 8. 示例 template.php
復制代碼 代碼如下:
<?php
$pid = $_GET['pid'];
//we create an object of a fictional class Page$obj = new Page;
$content = $obj->fetchPage($pid);
//and now we have a bunch of PHP that displays the page?>
這 里有什麼錯嗎?首先,這里隱含地相信來自瀏覽器的 GET 變數 pid 是安全的。這會怎麼樣呢?大多數用戶沒那麼聰明,無法構造出語義攻擊。但是,如果他們注意到瀏覽器的 URL 位置域中的 pid=33,就可能開始搗亂。如果他們輸入另一個數字,那麼可能沒問題;但是如果輸入別的東西,比如輸入 SQL 命令或某個文件的名稱(比如 /etc/passwd),或者搞別的惡作劇,比如輸入長達 3,000 個字元的數值,那麼會發生什麼呢?
在這種情況下,要記住基本規則,不要信任用戶輸入。應用程序開發人員知道 template.php 接受的個人標識符(PID)應該是數字,所以可以使用 PHP 的 is_numeric()函數確保不接受非數字的 PID,如下所示:
清單 9. 使用 is_numeric() 來限制 GET 變數復制代碼 代碼如下:
<?php
$pid = $_GET['pid'];
if (is_numeric($pid)){
//we create an object of a fictional class Page$obj = new Page;
$content = $obj->fetchPage($pid);
//and now we have a bunch of PHP that displays the page}else{
//didn't pass the is_numeric() test, do something else!
}
?>
這個方法似乎是有效的,但是以下這些輸入都能夠輕松地通過 is_numeric() 的檢查:
100 (有效)
100.1 (不應該有小數位)
+0123.45e6 (科學計數法 —— 不好)
0xff33669f (十六進制 —— 危險!危險!)那麼,有安全意識的 PHP 開發人員應該怎麼做呢?多年的經驗表明,最好的做法是使用正則表達式來確保整個 GET 變數由數字組成,如下所示:
清單 10. 使用正則表達式限制 GET 變數
復制代碼 代碼如下:
<?php
$pid = $_GET['pid'];
if (strlen($pid)){
if (!ereg(」^[0-9]+$」,$pid)){
//do something appropriate, like maybe logging them out or sending them back to home page}
}else{
//empty $pid, so send them back to the home page}
//we create an object of a fictional class Page, which is now//moderately protected from evil user input$obj = new Page;
$content = $obj->fetchPage($pid);
//and now we have a bunch of PHP that displays the page?>
需 要做的只是使用 strlen() 檢查變數的長度是否非零;如果是,就使用一個全數字正則表達式來確保數據元素是有效的。如果 PID 包含字母、斜線、點號或任何與十六進制相似的內容,那麼這個常式捕獲它並將頁面從用戶活動中屏蔽。如果看一下 Page 類幕後的情況,就會看到有安全意識的 PHP 開發人員已經對用戶輸入 $pid 進行了轉義,從而保護了 fetchPage() 方法,如下所示:
清單 11. 對 fetchPage() 方法進行轉義
復制代碼 代碼如下:
<?php
class Page{
function fetchPage($pid){
$sql = 「select pid,title,desc,kw,content,status from page where pid='」.mysql_real_escape_string($pid).」'」;}
}
?>
您可能會問,「既然已經確保 PID 是數字,那麼為什麼還要進行轉義?」 因為不知道在多少不同的上下文和情況中會使用 fetchPage() 方法。必須在調用這個方法的所有地方進行保護,而方法中的轉義體現了縱深防禦的意義。
如 果用戶嘗試輸入非常長的數值,比如長達 1000 個字元,試圖發起緩沖區溢出攻擊,那麼會發生什麼呢?下一節更詳細地討論這個問題,但是目前可以添加另一個檢查,確保輸入的 PID 具有正確的長度。您知道資料庫的 pid 欄位的最大長度是 5 位,所以可以添加下面的檢查。
清單 12. 使用正則表達式和長度檢查來限制 GET 變數復制代碼 代碼如下:
<?php
$pid = $_GET['pid'];
if (strlen($pid)){
if (!ereg(」^[0-9]+$」,$pid) && strlen($pid) > 5){//do something appropriate, like maybe logging them out or sending them back to home page}
} else {
//empty $pid, so send them back to the home page}
//we create an object of a fictional class Page, which is now//even more protected from evil user input$obj = new Page;
$content = $obj->fetchPage($pid);
//and now we have a bunch of PHP that displays the page?>
現在,任何人都無法在資料庫應用程序中塞進一個 5,000 位的數值 —— 至少在涉及 GET 字元串的地方不會有這種情況。想像一下黑客在試圖突破您的應用程序而遭到挫折時咬牙切齒的樣子吧!而且因為關閉了錯誤報告,黑客更難進行偵察。
緩沖區溢出攻擊
緩沖區溢出攻擊 試圖使 PHP 應用程序中(或者更精確地說,在 Apache 或底層操作系統中)的內存分配緩沖區發生溢出。請記住,您可能是使用 PHP 這樣的高級語言來編寫 Web 應用程序,但是最終還是要調用 C(在 Apache 的情況下)。與大多數低級語言一樣,C 對於內存分配有嚴格的規則。
緩沖區溢出攻擊向緩沖區發送大量數據,使部分數據溢出到相鄰的內存緩沖區,從而破壞緩沖區或者重寫邏輯。這樣就能夠造成拒絕服務、破壞數據或者在遠程伺服器上執行惡意代碼。
防止緩沖區溢出攻擊的惟一方法是檢查所有用戶輸入的長度。例如,如果有一個表單元素要求輸入用戶的名字,那麼在這個域上添加值為 40 的 maxlength 屬性,並在後端使用 substr() 進行檢查。清單 13 給出表單和 PHP 代碼的簡短示例。
3. str_getcsv — 解析 CSV 字元串為一個數組
這是整理後的答案,希望能幫到你!
str_getcsv
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
str_getcsv — 解析 CSV 字元串為一個數組
說明
str_getcsv ( string $input , string $delimiter = "," , string $enclosure = '"' , string $escape = "\\" ) : array
以 CSV 欄位格式解析字元串輸入,並返回包含讀取欄位的數組。
參數
input
待解析的字元串。
delimiter
設定欄位界定符(僅單個字元)。
enclosure
設定欄位包裹字元(僅單個字元)。
escape
設置轉義字元(僅單個字元)。默認為反斜線(\)。
返回值
返回一個包含讀取到的欄位的索引數組。
4. PHP 提交表格 插入數據
if($submit)
你改成
if($_POST['submit'])
試試,看看行不行
5. 關於php中mysql mysqli 區別
PHP中mysql有兩個概念,一個是mysql資料庫,一個是用於操作mysql資料庫的擴展(PHP的各種功能都是通過這些底層擴展來實現的)。而你這個問題中的mysql,就指的是擴展。
PHP5開始有了mysqli,按照PHP官方描述,它是mysql增強版擴展。事實上它確實更搞笑更安全,並推薦大家使用。到PHP5.3的時候,原來的mysql擴展已經被標注為過時。而到了PHP7,原mysql擴展被徹底廢棄。
所以不管是否使用PHP7,都建議使用mysqli或pdo擴展來操作mysql資料庫。
另外,mysqli並不是簡單的在原來mysql的方法上加一個i,它是自己一套方法。mysqli同時支持面向過程和面向對象的方式,強烈建議你學者使用面向對象的方式。
6. addslashes — 使用反斜線引用字元串
addslashes
(PHP 4, PHP 5, PHP 7, PHP 8)
addslashes — 使用反斜線引用字元串
說明
addslashes ( string $str ) : string
返回字元串,該字元串為了資料庫查詢語句等的需要在某些字元前加上了反斜線。這些字元是單引號(')、雙引號(")、反斜線(\)與 NUL(null 字元)。
一個使用 addslashes() 的例子是當你要往資料庫中輸入數據時。 例如,將名字 O'reilly 插入到資料庫中,這就需要對其進行轉義。 強烈建議使用 DBMS 指定的轉義函數 (比如 MySQL 是 mysqli_real_escape_string(),PostgreSQL 是 pg_escape_string()),但是如果你使用的 DBMS 沒有一個轉義函數,並且使用 \ 來轉義特殊字元,你可以使用這個函數。 僅僅是為了獲取插入資料庫的數據,額外的 \ 並不會插入。 當 PHP 指令 magic_quotes_sybase 被設置成 on 時,意味著插入 ' 時將使用 ' 進行轉義。
PHP 5.4 之前 PHP 指令 magic_quotes_gpc 默認是 on, 實際上所有的 GET、POST 和 COOKIE 數據都用被 addslashes() 了。 不要對已經被 magic_quotes_gpc 轉義過的字元串使用 addslashes(),因為這樣會導致雙層轉義。 遇到這種情況時可以使用函數 get_magic_quotes_gpc() 進行檢測。
參數
str
要轉義的字元。
返回值
返回轉義後的字元。
範例
示例 #1 一個 addslashes() 例子
參見
stripcslashes() - 反引用一個使用 addcslashes 轉義的字元串
stripslashes() - 反引用一個引用字元串
addcslashes() - 以 C 語言風格使用反斜線轉義字元串中的字元
htmlspecialchars() - 將特殊字元轉換為 HTML 實體
quotemeta() - 轉義元字元集
get_magic_quotes_gpc() - 獲取當前 magic_quotes_gpc 的配置選項設置
7. php用戶登錄為什麼只能使用第一個用戶登錄,而之後創建的用戶則顯示不存在用戶,資料庫里則有創的用戶。
登錄這么驗證,你那樣肯定是錯的。就兩個表:一個t_admin,一個t_session表。
db.conf這個的:
db.conf
{
"type":"mysql",
"host":"ip",
"port":3306,
"username":"root",
"password":"root"
}
<?php
function getDbConnection($conf="../conf/db.conf")
{
$c = file_get_contents($conf);
if(!$c){
throw newException("get conf failed:" . $conf);
}
$dbconf = json_decode($c,true);
if($dbconf["type"] !="mysql")
{
throw new Exception("db type" . $dbconf["type"] . " not support yet",-1);
}
$port = $dbconf['port'];
if(!$port){
$port = '3306';
}
$db = mysql_connect($dbconf['host'] . ':' .$port,
$dbconf['username'],
$dbconf['password']);
if(!$db){
throw new Exception(mysql_error());
}
return $db;
}
function login(){
$usr = $_REQUEST['name'];
$pwd = $_REQUEST['pwd'];
if(!$usr || !$pwd){
return '{code:-1,msg:"useror pwd not correct"}';
}
$db = getDbConnection();
$usr = mysql_escape_string($usr);
$pwd = mysql_escape_string($pwd);
$sql = 'select user_name,password,authfrom db_stat.t_admin where user_name = "'
. $usr . '" and password ="'
. $pwd . '"';
$rlt = mysql_query($sql) ;
if(!$rlt){
$ret =array("code"=>-1,"msg"=>mysql_error());
return json_encode($ret);
}
$rows = array();
while($row =mysql_fetch_array($rlt,MYSQL_NUM)){
array_push($rows,$row);
}
mysql_free_result($rlt);
if(count($rows) != 1){
return '{code:-1,msg:"user or pwdnot correct"}';
}
$sk = md5($usr . $pwd . time());
$ip = $_SERVER["REMOTE_ADDR"];
$sql = 'insert db_stat.t_sessions(user_name,tocken,login_time,update_time,ip) values("'
. $usr . '","'
. $sk . '",'
. time() . ','
. time() . ',"'
. $ip . '") on plicate keyupdate '
. 'tocken="' . $sk . '",'
. 'login_time=' . time() . ','
. 'update_time=' . time() . ','
. 'ip="' . $ip . '"';
if(!mysql_query($sql)){
$ret =array("code"=>-1,"msg"=>mysql_error());
return json_encode($ret);
}
mysql_close();
$ret =array("code"=>0,"msg"=>"success","auth"=>$rows[0][2]);
$et = time() + 7 * 24 * 3600;
setcookie('usr',$usr,$et,"/");
setcookie('sk',$sk,$et,"/");
return json_encode($ret);
}
function verify(){
if(!isset($_COOKIE['usr']) ||!isset($_COOKIE['sk'])){
return'{code:-1,msg:"verify failed"}';
}
$db = getDbConnection();
$usr =mysql_escape_string($_COOKIE['usr']);
$sk =mysql_escape_string($_COOKIE['sk']);
$sql = 'select login_time from
db_stat.t_sessions where user_name = "' . $usr . '" and tocken =
"' . $sk . '"';
$rlt = mysql_query($sql) ;
if(!$rlt){
mysql_close();
$ret =array("code"=>-1,"msg"=>mysql_error());
return json_encode($ret);
}
$rows = array();
while($row = mysql_fetch_array($rlt,MYSQL_NUM)){
array_push($rows,$row);
}
mysql_free_result($rlt);
if(count($rows) != 1){
mysql_close();
return '{code:-1,msg:"user or pwdnot correct"}';
}
$loginTime = $rows[0][0];
return '{code:0,msg:"success"}';
}
try{
if($_REQUEST['act'] =="login"){
echo login();
}
else if($_REQUEST['act'] =="verify"){
echo verify();
}
}
catch(Exception$e){
$ret =array("code"=>-1,"msg"=>$e->getMessage());
echo json_encode($ret);
}
8. 如何寫出好的 PHP 代碼
編寫良好的代碼是一種藝術。如果一個程序員遵循一些良好的編程習慣,那麼他就可以成為一個優秀的程序員。實際上,相對於你寫代碼的時間,你很可能會花更多的時間在代碼維護上;更不用說整個應用程序的維護。建立良好的編碼習慣,能夠提高像模塊化這樣的設計因素,你的代碼也將更容易理解,因此,維護起來更容易、成本更低。而不良的編碼習慣會在代碼中存在缺陷,並可能導致代碼很難維護。 在本文中,我們將探討一些良好的編程習慣,這將幫助你避免代碼中的缺陷。 1- 編寫模塊化代碼 良好的PHP代碼應該是模塊化代碼。PHP的面向對象的編程功能是一些特別強大的工具,可以把你的應用程序分解成函數或方法。你應該盡可能多的從你的應用程序的伺服器端分開前端的HTML/CSS/JavaScript代碼。你也可以在任何PHP框架上遵循MVC(模型-視圖-控制器)模式。 2- 代碼編寫規范 良好的PHP代碼應該有一套完整的代碼編寫規范。通過對變數和函數的命名,統一的方法訪問資料庫和對錯誤的處理,以及同樣的代碼縮進方式等來達到編程規范,這樣可以使你的代碼更具可讀性。 3- 編寫可移植代碼 良好的PHP代碼應該是可移植的。你可以使用php的現有功能,如魔術引號和短標簽。試著了解你的需求,然後通過適應PHP特性來編寫代碼讓代碼獨立、可移植。 4- 編寫安全代碼 良好的PHP代碼應該是安全的。PHP5提供了出色的性能和靈活性。但是安全問題完全在於開發人員。對於一個專業的PHP開發人員來說,深入理解重大安全漏洞是至關重要的,如:跨站點腳本(XSS)、跨站請求偽造(CSRF)、代碼注入漏洞、字元編碼漏洞。通過使用PHP的特殊功能和函數,如:mysql_real_escape_string等等,你可以編寫出安全的代碼。 6- 避免短標簽 把所有用到短標簽的替換成完整的PHP標簽。 7- 使用單引號代替雙引號 字元串始終使用單引號代替雙引號,以避免PHP搜索字元串內的變數導致的性能下降。 8- 轉義字元串輸出 使用ENT_QUOTES作參數傳遞給htmlspecialchars函數,以確保單引號(')也轉換成HTML實體,這是一個好習慣。 9- 使用逗號分隔字元串輸出 通過echo語句輸出使用逗號(,)分隔的字元串,要比使用字元串連接操作符(.)的性能更好。 10- 輸出前檢查傳來的值輸出前檢查傳過來的值$_GET['query']。使用isset或empty函數,可以用來檢查變數是否為null值。
9. PHP接收URL中的參數的問題
首先 &是網址里的變數分割符合 如果不是必須 強烈不推薦
a.php?x=abc%2Bdefgh&d=123456
這樣就獲取兩個參數
$_GET['x'] 和$_GET['d];
你這樣一搞就全亂了
如果非要這樣的話,我試著幫你寫個
<?
$str= $_SERVER['QUERY_STRING'];
$str=split('=',$str)
$x=urldecode($str[1]);
echo $x;
?>
10. PHP輸出全形空格,導致頁面布局混亂
$str='<ul>';
for($i=0;$i<=10;$i++){
$str.='<li><a href="'.$i.'.php">'.$i.'</a></li>';
}
echo $str.'</ul>';
a標簽忘記結尾了吧,我這里IE6,7,8,9,火狐,chrome測試沒問題