PHP錯誤總結(jié)-不斷更新(新手必看)
當(dāng)前位置:點(diǎn)晴教程→知識管理交流
→『 技術(shù)文檔交流 』
1:為什么我得不到變量
我在一網(wǎng)頁向另一網(wǎng)頁P(yáng)OST數(shù)據(jù)name,為什么輸出$name時(shí)卻得不到任何值? 在PHP4.2以后的版本中register_global默認(rèn)為off 若想取得從另一頁面提交的變量: 方法一:在PHP.ini中找到register_global,并把它設(shè)置為on. 方法二:在接收網(wǎng)頁最前面放上這個extract($_POST);extract($_GET);(注意extract($_SESSION)前必須要有Session_Start()). 方法三:一個一個讀取變量$a=$_GET["a"];$b=$_POST["b"]等,這種方法雖然麻煩,但比較安全. 2:調(diào)試你的程序 在運(yùn)行時(shí)必須知道某個變量為何值。我是這樣做的,建立一文件debug.php,其內(nèi)容如下: PHP代碼:--------------------------------------------------------------------------------
-------------------------------------------------------------------------------- 然后在php.ini中設(shè)置:include_path = "c:/php",并將debug.php放在此文件夾, 以后就可以在每個網(wǎng)頁里包含此文件,查看得到的變量名和值. 3:如何使用session 凡是與session有關(guān)的,之前必須調(diào)用函數(shù)session_start(); 為session付值很簡單,如: PHP代碼:-------------------------------------------------------------------------------- [php] Session_start(); $Name = "這是一個Session例子"; Session_Register("Name");//注意,不要寫成:Session_Register("$Name"); Echo $_SESSION["Name"]; //之后$_SESSION["Name"]為"這是一個Session例子" [/php] -------------------------------------------------------------------------------- 在php4.2之后,可以為session直接付值: PHP代碼:-------------------------------------------------------------------------------- [php] Session_Start(); $_SESSION["name"]="value"; [/php] -------------------------------------------------------------------------------- 取消session可以這樣: PHP代碼:-------------------------------------------------------------------------------- [php] session_start(); session_unset(); session_destroy(); [/php] -------------------------------------------------------------------------------- 取消某個session變量在php4.2以上還有BUG. 注意: 1:在調(diào)用Session_Start()之前不能有任何輸出.例如下面是錯誤的. ========================================== 1行 2行 [php] 3行 Session_Start();//之前在第一行已經(jīng)有輸出 4行 ..... 5行 [/php] ========================================== 提示1: 凡是出現(xiàn)"........headers already sent..........",就是Session_Start()之前向?yàn)g覽器輸出信息. 去掉輸出就正常,(COOKIE也會出現(xiàn)這種錯誤,錯誤原因一樣) 提示2: 如果你的Session_Start()放在循環(huán)語句里,并且很難確定之前哪里向?yàn)g覽器輸出信息,可以用下面這種方法: 1行 [php] Ob_Start(); [/php] ........這里是你的程序...... 2:這是什么錯誤 Warning: session_start(): open(/tmpsess_7d190aa36b4c5ec13a5c1649cc2da23f, O_RDWR) failed:.... 因?yàn)槟銢]有指定session文件的存放路徑. 解決方法: (1)在c盤建立文件夾tmp (2)打開php.ini,找到session.save_path,修改為session.save_path= "c:/tmp" 4:為什么我向另一網(wǎng)頁傳送變量時(shí),只得到前半部分,以空格開頭的則全部丟失 PHP代碼:-------------------------------------------------------------------------------- [php] $Var="hello php";//修改為$Var=" hello php";試試得到什么結(jié)果 $post= "receive.php?Name=".$Var; header("location:$post"); [/php] -------------------------------------------------------------------------------- receive.php的內(nèi)容: PHP代碼:-------------------------------------------------------------------------------- [php] Echo "<pre>"; Echo $_GET["Name"]; Echo "</pre>"; [/php] -------------------------------------------------------------------------------- 正確的方法是: PHP代碼:-------------------------------------------------------------------------------- [php] $Var="hello php"; $post= "receive.php?Name=".urlencode($Var); header("location:$post"); [/php] -------------------------------------------------------------------------------- 在接收頁面你不需要使用Urldecode(),變量會自動編碼. 5:如何截取指定長度漢字而不會出現(xiàn)以"[/php]"結(jié)尾,超出部分以"..."代替 一般來說,要截取的變量來自Mysql,首先要保證那個字段長度要足夠長,一般為char(200),可以保持100個漢字,包括標(biāo)點(diǎn). PHP代碼:-------------------------------------------------------------------------------- [php] $str="這個字符好長呀,^_^"; $Short_Str=showShort($str,4);//截取前面4個漢字,結(jié)果為:這個字符... Echo "$Short_Str"; Function csubstr($str,$start,$len) { $strlen=strlen($str); $clen=0; for($i=0;$i<$strlen;$i++,$clen++) { if ($clen>=$start+$len) break; if(ord(substr($str,$i,1))>0xa0) { if ($clen>=$start) $tmpstr.=substr($str,$i,2); $i++; } else { if ($clen>=$start) $tmpstr.=substr($str,$i,1); } } return $tmpstr; } Function showShort($str,$len) { $tempstr = csubstr($str,0,$len); if ($str<>$tempstr) $tempstr .= "..."; //要以什么結(jié)尾,修改這里就可以. return $tempstr; } -------------------------------------------------------------------------------- 6:規(guī)范你的SQL語句 在表格,字段前面加上"`",這樣就不會因?yàn)檎`用關(guān)鍵字而出現(xiàn)錯誤, 當(dāng)然我并不推薦你使用關(guān)鍵字. 例如 $Sql="INSERT INTO `xltxlm` (`author`, `title`, `id`, `content`, `date`) VALUES ('xltxlm', 'use`', 1, 'criterion your sql string ', '2003-07-11 00:00:00')" "`"怎么輸入? 在TAB鍵上面. 7:如何使Html/PHP格式的字符串不被解釋,而是照原樣顯示 PHP代碼:-------------------------------------------------------------------------------- [php] $str="<h1>PHP</h1>"; Echo "被解釋過的: ".$str."<br>經(jīng)過處理的:"; Echo htmlentities(nl2br($str)); [/php] -------------------------------------------------------------------------------- 8:怎么在函數(shù)里取得函數(shù)外的變量值 PHP代碼:-------------------------------------------------------------------------------- [php] $a="PHP"; foo(); Function foo() { global $a;//刪除這里看看是什么結(jié)果 Echo "$a"; } [/php] -------------------------------------------------------------------------------- 9:我怎么知道系統(tǒng)默認(rèn)支持什么函數(shù) PHP代碼:-------------------------------------------------------------------------------- [php] $arr = get_defined_functions(); Function php() { } echo "<pre>"; Echo "這里顯示系統(tǒng)所支持的所有函數(shù),和自定以函數(shù)phpn"; print_r($arr); echo "</pre>"; [/php] -------------------------------------------------------------------------------- 10:如何比較兩個日期相差幾天 PHP代碼:-------------------------------------------------------------------------------- [php] $Date_1="2003-7-15";//也可以是:$Date_1="2003-6-25 23:29:14"; $Date_2="1982-10-1"; $Date_List_1=explode("-",$Date_1); $Date_List_2=explode("-",$Date_2); $d1=mktime(0,0,0,$Date_List_1[1],$Date_List_1[2],$Date_List_1[0]); $d2=mktime(0,0,0,$Date_List_2[1],$Date_List_2[2],$Date_List_2[0]); $Days=round(($d1-$d2)/3600/24); Echo "偶已經(jīng)奮斗了 $Days 天^_^"; [/php] -------------------------------------------------------------------------------- 11:為什么我升級PHP后,原來的程序出現(xiàn)滿屏的 Notice: Undefined variable: 這是警告的意思,由于變量未定義引起的. 打開php.ini,找到最下面的error_reporting,修改為error_reporting = E_ALL & ~E_NOTICE 對于Parse error錯誤 error_reporting(0)無法關(guān)閉. 如果你想關(guān)閉任何錯誤提示,打開php.ini,找到display_errors,設(shè)置為display_errors = Off.以后任何錯誤都不會提示. 那什么是error_reporting? 12:我想在每個文件最前,最后面都加上一文件.但一個一個添加很麻煩 1:打開php.ini文件 設(shè)置 include_path= "c:" 2:寫兩個文件 auto_prepend_file.php 和 auto_append_file.php 保存在c盤,他們將自動依附在每個php文件的頭部和尾部. 3:在php.ini中找到: Automatically add files before or after any PHP document. auto_prepend_file = auto_prepend_file.php;依附在頭部 auto_append_file = auto_append_file.php;依附在尾部 以后你每個php文件就相當(dāng)于 PHP代碼:-------------------------------------------------------------------------------- [php] Include "auto_prepend_file.php" ; .......//這里是你的程序 Include "auto_append_file.php"; [/php] -------------------------------------------------------------------------------- 13:如何利用PHP上傳文件 PHP代碼:-------------------------------------------------------------------------------- [php] <html><head> <title>上載文件表單</title></head> <body> <form enctype="multipart/form-data" action="" method="post"> 請選擇文件: <br> <input name="upload_file" type="file"><br> <input type="submit" value="上傳文件"> </form> </body> </html> $upload_file=$_FILES['upload_file']['tmp_name']; $upload_file_name=$_FILES['upload_file']['name']; if($upload_file){ $file_size_max = 1000*1000;// 1M限制文件上傳最大容量(bytes) $store_dir = "d:/";// 上傳文件的儲存位置 $accept_overwrite = 1;//是否允許覆蓋相同文件 // 檢查文件大小 if ($upload_file_size > $file_size_max) { echo "對不起,你的文件容量大于規(guī)定"; exit; } // 檢查讀寫文件 if (file_exists($store_dir . $upload_file_name) && !$accept_overwrite) { Echo "存在相同文件名的文件"; exit; } //復(fù)制文件到指定目錄 if (!move_uploaded_file($upload_file,$store_dir.$upload_file_name)) { echo "復(fù)制文件失敗"; exit; } } Echo "<p>你上傳了文件:"; echo $_FILES['upload_file']['name']; echo "<br>"; //客戶端機(jī)器文件的原名稱。 Echo "文件的 MIME 類型為:"; echo $_FILES['upload_file']['type']; //文件的 MIME 類型,需要瀏覽器提供該信息的支持,例如“image/gif”。 echo "<br>"; Echo "上傳文件大小:"; echo $_FILES['upload_file']['size']; //已上傳文件的大小,單位為字節(jié)。 echo "<br>"; Echo "文件上傳后被臨時(shí)儲存為:"; echo $_FILES['upload_file']['tmp_name']; //文件被上傳后在服務(wù)端儲存的臨時(shí)文件名。 echo "<br>"; $Erroe=$_FILES['upload_file']['error']; switch($Erroe){ case 0: Echo "上傳成功"; break; case 1: Echo "上傳的文件超過了 php.ini 中 upload_max_filesize 選項(xiàng)限制的值."; break; case 2: Echo "上傳文件的大小超過了 HTML 表單中 MAX_FILE_SIZE 選項(xiàng)指定的值。"; break; case 3: Echo "文件只有部分被上傳";break; case 4: Echo "沒有文件被上傳";break; } [/php] -------------------------------------------------------------------------------- 14:如何配置GD庫 下面是我的配置過程 1:用dos命令(也可以手動操作,拷貝dlls文件夾里所有dll文件到system32目錄下) copy c:phpdlls*.dll c:windowssystem32 2:打開php.ini 設(shè)置extension_dir = "c:/php/extensions/"; 3: extension=php_gd2.dll;把extension前面的逗號去掉,如果沒有php_gd2.dll,php_gd.dll也一樣,保證確實(shí)存在這一文件c:/php/extensions/php_gd2.dll 4:運(yùn)行下面程序進(jìn)行測試 PHP代碼:-------------------------------------------------------------------------------- [php] Ob_end_flush(); //注意,在此之前不能向?yàn)g覽器輸出任何信息,要注意是否設(shè)置了 auto_prepend_file. header ("Content-type: image/png"); $im = @imagecreate (200, 100) or die ("無法創(chuàng)建圖像"); $background_color = imagecolorallocate ($im, 0,0, 0); $text_color = imagecolorallocate ($im, 230, 140, 150); imagestring ($im, 3, 30, 50, "A Simple Text String", $text_color); imagepng ($im); [/php] -------------------------------------------------------------------------------- 點(diǎn)擊這里查看結(jié)果 15:什么是UBB代碼 UBB代碼是HTML的一個變種,是Ultimate Bulletin Board (國外一個BBS程序,國內(nèi)也有不少地方使用這個程序)采用的一種特殊的TAG. 即使禁止使用 HTML,你也可以用 UBBCode? 來實(shí)現(xiàn).也許你更希望使用 UBBCode? 而不是 HTML, 即使論壇允許使用 HTML, 因?yàn)槭褂闷饋泶a較少也更安全. Q3boy的UBB里面付有例子,可以直接運(yùn)行測試 16:我想修改MySQL的用戶,密碼 首先要聲明一點(diǎn),大部分情況下,修改MySQL是需要有mysql里的root權(quán)限的, 所以一般用戶無法更改密碼,除非請求管理員. 方法一 使用phpmyadmin,這是最簡單的了,修改mysql庫的user表, 不過別忘了使用PASSWORD函數(shù)。 方法二 使用mysqladmin,這是前面聲明的一個特例。 mysqladmin -u root -p password mypasswd 輸入這個命令后,需要輸入root的原密碼,然后root的密碼將改為mypasswd。 把命令里的root改為你的用戶名,你就可以改你自己的密碼了。 當(dāng)然如果你的mysqladmin連接不上mysql server,或者你沒有辦法執(zhí)行mysqladmin, 那么這種方法就是無效的。 而且mysqladmin無法把密碼清空。 下面的方法都在mysql提示符下使用,且必須有mysql的root權(quán)限: 方法三 mysql> INSERT INTO mysql.user (Host,User,Password) VALUES('%','jeffrey',PASSWORD('biscuit')); mysql> FLUSH PRIVILEGES 確切地說這是在增加一個用戶,用戶名為jeffrey,密碼為biscuit。 在《mysql中文參考手冊》里有這個例子,所以我也就寫出來了。 注意要使用PASSWORD函數(shù),然后還要使用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()函數(shù), 但是不需要使用FLUSH PRIVILEGES。 方法六 使用GRANT ... IDENTIFIED BY語句 mysql> GRANT USAGE ON *.* TO jeffrey@"%" IDENTIFIED BY 'biscuit'; 這里PASSWORD()函數(shù)是不必要的,也不需要使用FLUSH PRIVILEGES。 注意: PASSWORD() [不是]以在Unix口令加密的同樣方法施行口令加密。 17:我想知道他是通過哪個網(wǎng)站連接到本頁 PHP代碼:-------------------------------------------------------------------------------- [php] //必須通過超級連接進(jìn)入才有輸出 Echo $_SERVER['HTTP_REFERER']; [/php] -------------------------------------------------------------------------------- 18:數(shù)據(jù)放入數(shù)據(jù)庫和取出來顯示在頁面需要注意什么 入庫時(shí) $str=addslashes($str); $sql="insert into `tab` (`content`) values('$str')"; 出庫時(shí) $str=stripslashes($str); 顯示時(shí) $str=htmlspecialchars(nl2br($str)) ; 19:如何讀取當(dāng)前地址欄信息 PHP代碼:-------------------------------------------------------------------------------- [php] $s="http://{$_SERVER['HTTP_HOST']}:{$_SERVER["SERVER_PORT"]}{$_SERVER['SCRIPT_NAME']}"; $se=''; foreach ($_GET as $key => $value) { $se.=$key."=".$value."&"; } $se=Preg_Replace("/(.*)&$/","$1",$se); $se?$se="?".$se:""; echo $s."?$se"; [/php] -------------------------------------------------------------------------------- 20:我點(diǎn)擊后退按鈕,為什么之前填寫的東西不見 這是因?yàn)槟闶褂昧藄ession. 解決辦法: PHP代碼:-------------------------------------------------------------------------------- [php] session_cache_limiter('private, must-revalidate'); session_start(); ........... .......... [/php] -------------------------------------------------------------------------------- 21:怎么在圖片里顯示IP地址 PHP代碼:-------------------------------------------------------------------------------- [php] Header("Content-type: image/png"); $img = ImageCreate(180,50); $ip = $_SERVER['REMOTE_ADDR']; ImageColorTransparent($img,$bgcolor); $bgColor = ImageColorAllocate($img, 0x2c,0x6D,0xAF); // 背景顏色 $shadow = ImageColorAllocate($img, 250,0,0); // 陰影顏色 $textColor = ImageColorAllocate($img, oxff,oxff,oxff); // 字體顏色 ImageTTFText($img,10,0,78,30,$shadow,"d:/windows/fonts/Tahoma.ttf",$ip); //顯示背景 ImageTTFText($img,10,0,25,28,$textColor,"d:/windows/fonts/Tahoma.ttf","your ip is".$ip); // 顯示IP ImagePng($img); imagecreatefrompng($img); ImageDestroy($img); [/php] -------------------------------------------------------------------------------- 22:如何取得用戶的真實(shí)IP PHP代碼:-------------------------------------------------------------------------------- [php] function iptype1 () { if (getenv("HTTP_CLIENT_IP")) { return getenv("HTTP_CLIENT_IP"); } else { return "none"; } } function iptype2 () { if (getenv("HTTP_X_FORWARDED_FOR")) { return getenv("HTTP_X_FORWARDED_FOR"); } else { return "none"; } } function iptype3 () { if (getenv("REMOTE_ADDR")) { return getenv("REMOTE_ADDR"); } else { return "none"; } } function ip() { $ip1 = iptype1(); $ip2 = iptype2(); $ip3 = iptype3(); if (isset($ip1) && $ip1 != "none" && $ip1 != "unknown") { return $ip1; } elseif (isset($ip2) && $ip2 != "none" && $ip2 != "unknown") { return $ip2; } elseif (isset($ip3) && $ip3 != "none" && $ip3 != "unknown") { return $ip3; } else { return "none"; } } Echo ip(); [/php] -------------------------------------------------------------------------------- 23:如何從數(shù)據(jù)庫讀取三天內(nèi)的所有記錄 首先表格里要有一個DATETIME字段記錄時(shí)間, 格式為'2003-7-15 16:50:00' SELECT * FROM `xltxlm` WHERE TO_DAYS(NOW()) - TO_DAYS(`date`) <= 3; 24:如何遠(yuǎn)程鏈接Mysql數(shù)據(jù)庫 在增加用戶的mysql表里有一個host字段,修改為"%",或者指定允許連接的ip地址,這樣,你就可以遠(yuǎn)程調(diào)用了。 $link=mysql_connect("192.168.1.80:3306","root",""); 25:正則到底怎么用 點(diǎn)擊這里 正則表達(dá)式中的特殊字符 26:用Apache后,主頁出現(xiàn)亂碼 方法一: AddDefaultCharset ISO-8859-1 改為 AddDefaultCharset off 方法二: AddDefaultCharset GB2312 ======================================================== tip: 大家貼代碼時(shí)GB2312會被解釋成?????? 改成這樣就不會 GB2312 10:如何比較兩個日期相差幾天,(更簡單的算法) PHP代碼:-------------------------------------------------------------------------------- [php] $Date_1="2003-7-15";//也可以是:$Date_1="2003-7-15 23:29:14"; $Date_2="1982-10-1"; $d1=strtotime($Date_1); $d2=strtotime($Date_2); $Days=round(($d1-$d2)/3600/24); Echo "偶已經(jīng)奮斗了 $Days 天^_^"; [/php] -------------------------------------------------------------------------------- 27:為什么單引號,雙引號在接受頁面變成('") 解決方法: 方法一:在php.ini中設(shè)置:magic_quotes_gpc = Off 方法二: $str=stripcslashes($str) 28:怎么讓程序一直運(yùn)行下去,而不是超過30秒就停止 set_time_limit(60)//最長運(yùn)行時(shí)間一分鐘 set_time_limit(0)//運(yùn)行到程序自己結(jié)束,或手動停止 29:計(jì)算當(dāng)前在線人數(shù) 例子一:用文本實(shí)現(xiàn) PHP代碼:-------------------------------------------------------------------------------- [php] //首先你要有讀寫文件的權(quán)限 //本程序可以直接運(yùn)行,第一次報(bào)錯,以后就可以 $online_log = "count.dat"; //保存人數(shù)的文件, $timeout = 30;//30秒內(nèi)沒動作者,認(rèn)為掉線 $entries = file($online_log); $temp = array(); for ($i=0;$i<count($entries);$i++) { $entry = explode(",",trim($entries[$i])); if (($entry[0] != getenv('REMOTE_ADDR')) && ($entry[1] > time())) { array_push($temp,$entry[0].",".$entry[1]."n"); //取出其他瀏覽者的信息,并去掉超時(shí)者,保存進(jìn)$temp } } array_push($temp,getenv('REMOTE_ADDR').",".(time() + ($timeout))."n"); //更新瀏覽者的時(shí)間 $users_online = count($temp); //計(jì)算在線人數(shù) $entries = implode("",$temp); //寫入文件 $fp = fopen($online_log,"w"); flock($fp,LOCK_EX); //flock() 不能在NFS以及其他的一些網(wǎng)絡(luò)文件系統(tǒng)中正常工作 fputs($fp,$entries); flock($fp,LOCK_UN); fclose($fp); echo "當(dāng)前有".$users_online."人在線"; [/php] -------------------------------------------------------------------------------- 例子二: 用數(shù)據(jù)庫實(shí)現(xiàn)在線用戶 30:什么是模板,怎么用 這里有幾篇關(guān)于模板的文章 我用的是phplib模板 下面是其中幾個函數(shù)的使用 $T->Set_File("隨便定義","模板文件.tpl"); $T->Set_Block("在set_file中定義的","<!-- 來自模板 -->","隨便定義"); $T->Parse("在Set_Block中定義的","<!-- 來自模板 -->",true); $T->Parse("隨便輸出結(jié)果","在Set_File中定義的"); 設(shè)置循環(huán)格式為: <!--(多于一個空格) BEGIN $handle(多于一個空格)--> 如何將模板生成靜態(tài)網(wǎng)頁 PHP代碼:-------------------------------------------------------------------------------- [php] //這里使用phplib模板 ............ ............ $tpl->parse("output","html"); $output = $tpl->get("output");// $output 為整個網(wǎng)頁內(nèi)容 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");//重定向到生成的網(wǎng)頁 } [/php] -------------------------------------------------------------------------------- phplib下載地址 smarty下載地址 31:怎么用php解釋字符 比如:輸入2+2*(1+2),自動輸出8 可以用eval函數(shù) PHP代碼:-------------------------------------------------------------------------------- <form method=post action=""> <input type="text" name="str"><input type="submit"> </form> [php] $str=$_POST['str']; eval("$o=$str;"); Echo "$o"; [/php] -------------------------------------------------------------------------------- 另外,用此函數(shù)必須特別小心!! 如果有人輸入format: d:會是什么結(jié)果? 該文章在 2012/6/7 13:23:43 編輯過
|
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |