PHP寫程式中經常需要用到一些伺服器的一些資料,特把$_SERVER的詳細參數整理下,方便以後使用。
$_SERVER['PHP_SELF'] #現用的正在執行腳本的檔名,與 document root關聯。
$_SERVER['argv'] #傳遞給該腳本的參數。
$_SERVER['argc'] #包括傳遞給程式的指令行參數的個數(如果運行在指令行模式)。
$_SERVER['GATEWAY_INTERFACE'] #伺服器使用的 CGI 規範的版本。例如,「CGI/1.1」。
$_SERVER['SERVER_NAME'] #現用的運行腳本所在伺服器主電腦的名稱。
$_SERVER['SERVER_SOFTWARE'] #伺服器標識的字串,在響應請求時的頭部中給出。
$_SERVER['SERVER_PROTOCOL'] #請求頁面時通信協定的名稱和版本。例如,「HTTP/1.0」。
$_SERVER['REQUEST_METHOD'] #訪問頁面時的請求方法。例如:「GET」、「HEAD」,「POST」,「PUT」。
$_SERVER['QUERY_STRING'] #查詢(query)的字串。
$_SERVER['DOCUMENT_ROOT'] #現用的運行腳本所在的文件根目錄。在伺服器配置檔案中定義。
$_SERVER['HTTP_ACCEPT'] #現用的請求的 Accept: 頭部的內容。
$_SERVER['HTTP_ACCEPT_CHARSET'] #現用的請求的 Accept-Charset: 頭部的內容。例如:「iso-8859-1,*,utf-8」。
$_SERVER['HTTP_ACCEPT_ENCODING'] #現用的請求的 Accept-Encoding: 頭部的內容。例如:「gzip」。
$_SERVER['HTTP_ACCEPT_LANGUAGE']#現用的請求的 Accept-Language: 頭部的內容。例如:「en」。
$_SERVER['HTTP_CONNECTION'] #現用的請求的 Connection: 頭部的內容。例如:「Keep-Alive」。
$_SERVER['HTTP_HOST'] #現用的請求的 Host: 頭部的內容。
$_SERVER['HTTP_REFERER'] #連結到現用的頁面的前一頁面的 URL 位址。
$_SERVER['HTTP_USER_AGENT'] #現用的請求的 User_Agent: 頭部的內容。
$_SERVER['HTTPS'] — 如果通過https訪問,則被設為一個非空的值(on),否則返回off
$_SERVER['REMOTE_ADDR'] #正在瀏覽現用的頁面使用者的 IP 位址。
$_SERVER['REMOTE_HOST'] #正在瀏覽現用的頁面使用者的主電腦名。
$_SERVER['REMOTE_PORT'] #使用者連線到伺服器時所使用的連接埠。
$_SERVER['SCRIPT_FILENAME'] #現用的執行腳本的絕對路徑名。
$_SERVER['SERVER_ADMIN'] #管理員訊息
$_SERVER['SERVER_PORT'] #伺服器所使用的連接埠
$_SERVER['SERVER_SIGNATURE'] #包括伺服器版本和虛擬主電腦名的字串。
$_SERVER['PATH_TRANSLATED'] #現用的腳本所在檔案系統(不是文件根目錄)的基本路徑。
$_SERVER['SCRIPT_NAME'] #包括現用的腳本的路徑。這在頁面需要指向自己時非常有用。
$_SERVER['REQUEST_URI'] #訪問此頁面所需的 URI。例如,「/index.html」。
$_SERVER['PHP_AUTH_USER'] #當 PHP 運行在 Apache 模組模式下,並且正在使用 HTTP 認證功能,這個變量便是使用者輸入的使用者名。
$_SERVER['PHP_AUTH_PW'] #當 PHP 運行在 Apache 模組模式下,並且正在使用 HTTP 認證功能,這個變量便是使用者輸入的密碼。
$_SERVER['AUTH_TYPE'] #當 PHP 運行在 Apache 模組模式下,並且正在使用 HTTP 認證功能,這個變量便是認證的類型。
php程式教學
PHP程式設計問題諮詢:
請問,如何修改MySQL的使用者帳號與密碼?
———————————————————
PHP程式設計問題回覆:
您要修改MySQL的使用者帳號與密碼,可以參考以下的說明:
首先要聲明一點,大部分情況下,修改MySQL是需要有mysql裏的root許可權的,
所以一般使用者無法變更密碼,除非請求管理員.
方法一
使用phpmyadmin,這是最簡單的了,修改mysql庫的user表,
不過別忘了使用PASSWORD函數。
方法二
使用mysqladmin,這是前面聲明的一個特例。
mysqladmin -u root -p password mypasswd
輸入這個指令後,需要輸入root的原密碼,然後root的密碼將改為mypasswd。
把指令裏的root改為你的使用者名,你就可以改你自己的密碼了。
當然如果你的mysqladmin連線不上mysql server,或是你沒有辦法執行mysqladmin,
那麼這種方法就是無效的。
而且mysqladmin無法把密碼清理。
下面的方法都在mysql提示符下使用,且必須有mysql的root許可權:
方法三
mysql> INSERT INTO mysql.user (Host,User,Password)
VALUES('%','jeffrey',PASSWORD('biscuit'));
mysql> FLUSH PRIVILEGES
確切地說這是在增加一個使用者,使用者名為jeffrey,密碼為biscuit。
在《mysql中文參考手冊》裏有這個例子,所以我也就寫出來了。
注意要使用PASSWORD函數,然後還要使用FLUSH PRIVILEGES。
方法四
和方法三一樣,只是使用了REPLACE語句
mysql> REPLACE INTO mysql.user (Host,User,Password)
VALUES('%','jeffrey',PASSWORD('biscuit'));
mysql> FLUSH PRIVILEGES
方法五
使用SET PASSWORD語句,
mysql> SET PASSWORD FOR jeffrey@"%" = PASSWORD('biscuit');
你也必須使用PASSWORD()函數,
但是不需要使用FLUSH PRIVILEGES。
方法六
使用GRANT … IDENTIFIED BY語句
mysql> GRANT USAGE ON *.* TO jeffrey@"%" IDENTIFIED BY 'biscuit';
這裏PASSWORD()函數是不必要的,也不需要使用FLUSH PRIVILEGES。
注意: PASSWORD() [不是]以在Unix密碼加密的同樣方法施行密碼加密。
PHP程式設計問題諮詢:
請問,什麼是範本,怎麼使用範本呢?
———————————————————
PHP程式設計問題回覆:
什麼是範本,怎麼使用範本呢?,可以參考以下的說明:
———————————————————
什麼是範本,怎麼使用範本呢?
這裏有幾篇關於範本的文章
用的是phplib範本
下面是其中幾個函數的使用
$T->Set_File("隨便定義","範本檔.tpl");
$T->Set_Block("在set_file中定義的","<!– 來自範本 –>","隨便定義");
$T->Parse("在Set_Block中定義的","<!– 來自範本 –>",true);
$T->Parse("隨便輸出結果","在Set_File中定義的");
設置迴圈格式為:
<!–(多於一個空格) BEGIN $handle(多於一個空格)–>
如何將範本生成靜態網頁
<?php
//這裏使用phplib範本
…………
…………
$tpl->parse("output","html");
$output = $tpl->get("output");// $output 為整個網頁內容
function wfile($file,$content,$mode='w') {
$oldmask = umask(0);
$fp = fopen($file, $mode);
if (!$fp) return false;
fwrite($fp,$content);
fclose($fp);
umask($oldmask);
return true;
}
// 寫到文件裏
Wfile($FILE,$output);
header("location:$FILE");//重定向到生成的網頁
}
?>
—————————————————–
PHP程式設計問題諮詢:
為什麼我升級PHP後,原來的程式出現滿螢幕的 Notice: Undefined variable:
PHP程式設計問題回覆:
Notice: Undefined variable:
這是警告的意思,由於變數未定義引起的.
打開php.ini,找到最下面的error_reporting,修改為error_reporting = E_ALL & ~E_NOTICE
對於Parse error錯誤
error_reporting(0)無法關閉.
如果你想關閉任何錯誤提示,打開php.ini,找到display_errors,設置為display_errors = Off.以後任何錯誤都不會提示.
網站訂購單系統PHP 5.6升級到PHP7 MySQL資料庫無法讀取!
PHP 5.6之前的資料庫連線檔案 Connections.php 是這樣:
<?php
# FileName=”Connection_php_mysql.htm”
# Type=”MYSQL”
# HTTP=”true”
$hostname_linkmysql = “localhost”;
$database_linkmysql = “ordersdata”;
$username_linkmysql = “root”;
$password_linkmysql = “AG09102556817Gb”;
$linkmysql = mysql_pconnect($hostname_linkmysql, $username_linkmysql, $password_linkmysql) or trigger_error(mysql_error(),E_USER_ERROR);
mysql_query(“SET NAMES UTF8”);
?>
升級到 PHP7 之後,開啟訂購單頁面是:一片空白!
那原因是什麼呢?
相信很多人要升級 PHP7 的第一步就可能遇到:訂購單頁無法開啟….
當然這樣網站開啟訂購單頁面試:一片空白!
那網購生意也沒辦法作了,只好乖乖換回原來的 PHP 5.6版本
死了這條心嗎?為何會如此?
你問當初跟你設計的程式設計師就會知道……
(原來是:PHP 5.6升級PHP7後,之前MySQL的原來語法不能用了!)
原因是:PHP>=5.5 時所有以 mysql_開頭的函數都會作廢 deprecated,改用以 mysqli_開頭的函數取代
所以,你目前使用的網站訂購系統如果從PHP 5.6升級PHP7後,正個系統因為如法連結MySQL資料庫(所以是:一片空白!)
PHP 7 的MySQL資料庫連線應該是這樣的:
1.先要建立資料庫連線:
$DBNAME = “db”;
$DBUSER = “user”;
$DBPASSWD = “password”;
$DBHOST = “localhost”;
$conn = mysqli_connect( $DBHOST, $DBUSER, $DBPASSWD);
if (empty($conn)){
print mysqli_error($conn);
die (“無法連結資料庫”);
exit;
}
備註:第7行 如果$conn=false代表連結不成功
PHP>=5.5 時所有以 mysql_開頭的函數都會作廢 deprecated,改用以 mysqli_開頭的函數取代!
2. 選取資料庫
選擇資料庫使用函數 mysqli_select_db();
if( !mysqli_select_db($conn, $DBNAME)) {
die (“無法選擇資料庫”);
}
// 設定連線編碼
mysqli_query( $conn, “SET NAMES ‘utf8′”);
3.這樣就可以取得資料:
$sql =”select * from `table` where id=1234″;
$result = mysqli_query($conn, $sql);
備註:第2行 mysql_query 的回傳值$result有兩種狀況:
SELECT, SHOW, DESCRIBE, EXPLAIN 等如果成功則取回 resultset ,否則為 false
INSERT, UPDATE, DELETE, DROP 等成功則傳回 true,否則為 false
4.接著是取出資料:
取回行數
$num = mysqli_num_rows($conn, $result);
取回資料
使用mysqli_fetch_array取回資料, 有下列三種常數狀態:
while ($row = mysqli_fetch_array($result, MYSQLI_NUM)) {
print_r( $row);
}
/*
Array
(
[0] => A123456789
[1] => 1234
[2] => 陳麗如
)
*/
while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
print_r( $row);
}
/*
Array
(
[id] => A123456789
[pass] => 1234
[name] => 陳麗如
)
*/
while ($row = mysqli_fetch_array($result, MYSQLI_BOTH)) {
print_r( $row);
}
/*
Array
(
[0] => A123456789
[id] => A123456789
[1] => 1234
[pass] => 1234
[2] => 陳麗如
[name] => 陳麗如
)
*/
常數 MYSQLI_NUM:0 MYSQLI_ASSOC:1 MYSQLI_BOTH:2
取回物件形態資料
while($obj = mysqli_fetch_object($result)){
print ($obj->id);
}
取回最後一筆異動的索引
$last_id=mysqli_insert_id($conn);
要注意的情況:
– 一定要有一個欄位有 auto_increment 屬性,否則回傳0
– 一定之前要有insert或update操作,否則回傳0
5.最後是關閉連線:
雖然PHP, mysql 會自動關閉逾時的連線和記憶體,但也能手動操作
釋放記憶體
mysqli_free_result ( $result )
關閉連線
mysqli_close($conn);
洪總教頭最後結論:
PHP 5.6 升級到 PHP7 是遲早得事情,以執行效率與安全性等諸多理由
(你的網站也不能遲遲在 PHP 5.6等待被淘汰!)
動態網站與購物網站系統使用 PHP + MySQL 大家已經用那麼久了,早就習慣了!
如果你的網站是使用架站程式,那就要注意:PHP 版本是支援那一個版本?
購物車(購物網站架站程式)也一樣,也是要注意:PHP 版本是支援那一個版本?
如果你的程式是花錢請PHP程式設計師或設計公司設計的,那也要回去找他們,看看是否可以升級?
如果你自己會PHP+MySQL的程式設計,那當然就能省去非常多的麻煩!
總教頭的PHP程式設計+MySQL資料庫+Dreamweaver整合教學
(PHPMaker運用設計網站教學):
http://por.tw/php/new-E_learning/index.php
或許是你最好的選擇!自己會,就不需要樣樣事情都要花大錢請人家幫你設計
日後維護也比較能自己掌握!那網路事業的經營也比較順心!
如何避免使用php程式中的require_once語法?
我們知道,在php中使用require_once/include_once雖然方便,但是代價昂貴,據測試資料來看,require_once比require慢3-4倍,所以在php開發中,我們應該盡量使用require/include。
以下是筆者常用的避免require/include的方法。
使用__autoload
php5可以使用__autoload來避免require,用的好的話,代碼裡頭甚至看不到幾個require,實在是安逸啊。測試結果顯示,使用__autoload之後的new Foo; 比require_once 『foo.php』; new Foo; 大概要快3倍左右。
補充:為了避免autoload衝突,可以考慮使用spl_autoload_register(PHP 5 >= 5.1.2)來改變魔術函數__autoload的行為。
使用defined檢驗是否載入過
在代碼開頭使用defined檢驗是否定義過對應的常量,如果有的話,直接return。
<?php
if(!defined('_MYCLASS_'))
return;
define('_MYCLASS_', 1);
class MyClass { … }
?>
測試了一下,defined的效能也不是太好…
require前檢查
用class_exists或是function_exists檢查一下,確認沒有載入過再出手,至少比require_once能快上3倍。php4也可以用上。
class_exists('myClass') or require('/path/to/myClass.class.php');
解決MySQL server has gone away的問題
你是否曾遇見過 「MySql serverhas gone away」,一句讓人其實非常琢磨不透的錯誤訊息。
對這個問題請先別懷疑自己的代碼是否有問題,其實可能只不過是一個小小的設定問題。
我所碰到的情況就是,當你有大資料(資料大小大於1M)儲存到longblob欄位時,會出現這個問題。
起初也查了很久,是不是自己的代碼出錯,但使用的是PHP,不會向哪類編譯型語系有資料越界的可能,百思不得其解。
最終看了下mysql.ini,發現max_allowed_packet=1M,是不是這個預設設定值造成了此問題,把此設定值修改成max_allowed_packet=16M,問題真的解決了。
因此碰到此問題請先檢查自己的設定值是否有問題。
補充一句,不同版本的Mysql,此問題的錯誤訊息可能會不同。
企業架設網站注意事項
第一,企業架設網站類型。
1. 大眾展示型:主要面向客戶、業界人士或是普通瀏覽者,以展示公司產品、樹立企業形象;也可以適當提供行業內的新聞和關聯訊息。
2. 電子商務應用型:主要面向提供者、客戶或是企業產品(服務)的消費群體,借助電子商務平台交易或是以交易為主;這樣的網站可以說是正處於電子商務化的一個中間階段,由於行業特色不同,其電子商務化程度可能處於從比較初級的服務支援、產品清單到比較進階的網上支付的其中某一階段。例如比較成熟的電子商務平台網站:淘寶網
3. 品牌宣傳型:主要面向客戶或是企業產品(服務)的消費群體,以宣傳企業的核心品牌形象或是主要產品(服務)為主。
4. 行業門戶:主要是對某個行業的集中展示,分類訊息匯總。
第二,選取可靠的網建服務商。
1. 美工要有熟練的設計功底。網站的內容應該豐富,版面設計必須要體現出企業的經營理念,進而提高企業在同行業中的競爭優勢,不可乏而無味。
2. 頁面訪問速度要快、伺服器要穩定。據調查,瀏覽使用者等待網頁開啟的忍耐度通常只有8秒,很多訪客常常會因為開啟網頁速度太慢而轉向其他網站,所以網站的瀏覽速度不可忽視,不要以為追求頁面設計,如首頁放了很多flash導致頁面開啟速度很慢。
3. 盡量選取專業做網站、信譽好以及後續服務有保障的服務商。專業的網路公司能提供滿足需求的專業網站,要選取質量好的而不是片面追求價格低廉的,很多客戶追求物美價廉,但是設計這個東西是建立在時間成本和創意理念上的,好的設計很難說做到過低的價格,為了企業的效益,需慎重作出選取。
第三, 企業架設網站完成後注意事項。
1. 功能變數名歸屬權。功能變數名歸屬問題要跟網站建設服務商談好,個別不道德服務商在給企業註冊功能變數名時所有權沒給客戶,企業如果想轉移虛擬空間就直接把網站封掉。所以企業要跟服務商確定是否功能變數名的使用者名、密碼可歸企業所有。
2. 很多的網建公司都是租用虛擬主機,則空間應該是屬於企業自身的。企業需要要回:1.ftp使用者名;2.ftp密碼;3.ip;4.控制台使用者名;5.控制台密碼;6.控制台位址;如果服務商不打算給源程式碼的話,以上這些是不會告訴的。
3. 如果網站程式有管理後台,則需向架設網站服務商要管理位址、使用者名以及密碼。
常用的php正則表達式及語法註解:
符合中文字元的正則表達式: [u4e00-u9fa5] 符合雙位元組字元(內含漢字在內):[^x00-xff] 符合空白行的正則表達式: 符合 HTML旗標的正則表達式:<(S*?)[^>]*>.*?|<.*? /> 符合首尾空白字元的正則表達式:^s*|s*$ 符合Email位址的正則表達式:w+ ([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)* 符合網址URL的正則表達式:[a-zA-z]+://[^s]* 符合帳號是否合法 (字母開頭,容許5-16位元組,容許字母數字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 符合國內電話號碼:d{3}-d{8}|d{4}-d{7} 符合騰訊QQ號:[1-9][0-9]{4,} 符合中國郵政編碼:[1-9]d{5}(?! d) 符合身份證:d{15}|d{18} 符合ip位址:d+.d+.d+.d+ 符合特定數字: 符合特定字串: |
APACHE伺服器出現No input file specified.的完美解決專案
啟用REWRITE的偽靜態功能的時候,首頁可以訪問,而訪問內頁的時候,就提示:“No input file specified.”
原因在於使用的PHP是fast_cgi模式,而在某些情況下,不能正確識別path_info所造成的錯誤,Wordpress的偽靜態也有一樣的問題。
WordPress程式預設的.htaccess裡面的規則:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1 [L]
“No input file specified.”,是沒有得到有效的檔案路徑造成的。
修改偽靜態規則,如下:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?/$1 [L]
有沒有發現不同?
其實就是在正則結果“/$1”前面多加了一個“?”號,問題也就隨之解決了。