標簽歸檔:php

關于模板的一些思考

現在php的項目,動不動就smarty。甚至有的朋友做個兩三個頁面的新聞系統,也要用smarty。今天按捺不做,謝謝我的看法。本文原文地址為:http://www.okfdzs53.com/p/template-thinks,希望轉貼的朋友留一個我的鏈接。
做個新聞系統,不用smarty,10KB以內的代碼搞定,如果用smarty后,就要幾百KB了。有些人可能會說不用模板,修改的時候不方便,或則需要每篇文章使用不同的模板,直接用php代碼,就不好控制了,在這里給我大家分享一套另類的模板方法。

<?php
  #init.php
  #獲取皮膚設置,如果不存在,則調用default.php
 $skin = trim($_GET['skin']);
  if(!isset($skin) || @$skin==''){
    $skin = 'skin/default.php';
  }else{
    $skin = 'skin/'.$skin.'.php';
    if(!is_file($skin)){
      $skin = 'skin/default.php';
    }
  }
?>

數據處理文件

<?php
   include("inc/init.php");
   #其他數據處理,把所有的數據,用變量或數組保存
  ...
   $title = "1111";
   $newlist = Array(
     Array("111"),
     Array("222"),
     Array("333")
   );
   #引用模板文件
  require($skin);
?>

模板文件:default.php

<html>
<head>
<meta http-equiv=content-type content="text/html; charset=utf-8">
<title><?php echo $title?></title>
</head>
<body>
<?php foreach($newslist as $id => $item){?>
<li><?php echo $item['title'];?></li>
<?php }?>
</body>
</html>
?>

模板文件:skin2.php

<html>
<head>
<meta http-equiv=content-type content="text/html; charset=utf-8">
<title><?php echo $title?></title>
</head>
<body>
<table>
<?php foreach($newslist as $id => $item){?>
<tr><td><?php echo $item['title'];?></td></tr>
<?php }?>
</table>
</body>
</html>
?>

一分鐘安裝LAMP環境

聯網下,一分鐘安裝LAMP環境。

Ubuntu下安裝 apache2 + php5 + mysql 1. 安裝運行環境
sudo apt-get install apache2
sudo apt-get install mysql-server
sudo apt-get install php5-common
sudo apt-get install php5-gd
sudo apt-get install php5-mysql
sudo apt-get install libapache2-mod-php5

apache2默認的 sites路徑在
/var/www/sites

哈哈,很快把

2. 配置php5

sudo gedit /etc/php5/apache2/php.ini
修改允許最大使用內存,查找

memory_limit = 8M
修改為

memory_limit = 32M
修改允許最大上傳尺寸,查找

upload_max_filesize = 2M
修改為

upload_max_filesize = 8M
允許 mysql 和 gd 模塊,檢查文件最后是否包含下面的代碼,如果沒有添加上。(默認是在配置文件最后有添加的,檢查一下以防萬一)

extension=mysql.so

extension=gd.so
保存并關閉文件。

3. 配置 mysql,讓它支持其它客戶端訪問,如果你不需要就不用修改。

sudo gedit /etc/mysql/my.cnf
查找 文件

skip-networking
修改為

#skip-networking
保存并關閉文件。

重 新啟動 mysql

sudo /etc/init.d/mysql restart
插入其它客戶端訪問用戶(由于默認的帳號是 root@localhost,而客戶端卻使用root@localhost.localdomain 登錄)

mysql -u root -e “GRANT ALL PRIVILEGES ON *.* TO root@localhost.localdomain

PHP連接Access的方法

最近準備放棄使用許久的vbscript作為處理工作方面問題,而轉向PHP。
應該是ASP轉向PHP把,怎么是vbscript轉向php?這個我要說一下,處理工作方面問題,比如通過API導個數據…用ASP,PHP在IIS中執行肯定不行,寫個VBScript腳本,cscript 腳本名 讓他執行吧,別的不用關了。所以用腳本處理些數據轉換、導入導出還是不錯的選擇。
VBScript的致命的缺點是不支持引用文件,對HTTP請求方便不是很強,正則、XML處理起來不方面,JSON作為數據載體時就等著傻眼把。這是后用php作為腳本也是一個不錯的選擇。扯得有點遠了,換成了php,數據庫還是Access怎么辦?這個簡單,直接用com創建adodb實例即可。
現在已經創建好了數據庫,只填寫了部分域名,要通過php到域名查詢接口返回whois信息,并存到Access數據庫中,Access字段名已對應返回數組中的索引相同。

<?php
	set_time_limit(0);

	#因為要鏈接web,使用我前幾天寫的myhttp類。
	include('myhttp.clsss.php');
	#API操作,這里直接忽略,里邊有個get_domain_info來獲取API返回的數據,并處理成數組。
	include('api.function.php');
	
	$conn = new COM("Adodb.Connection");
	$conn -> open("provider=microsoft.jet.oledb.4.0;data source=D:\myweb\miaoqiyuan.cn\test\php-linkdb\domain.mdb");
	
	$dlist = new COM("ADODB.Recordset");
	$rs = new COM("ADODB.Recordset");
	
	$dlist -> open("select [domain],[did] from [domain] where isupdate=0",$conn,1,1);
	while(!$dlist -> eof()){
		echo "下載域名數據[".$dlist['domain']."].\n";
		$d=get_domain_info($dlist['domain']);
		$rs -> open("select * from [domain] where  did=".$dlist['did'],$conn,3,2);
		foreach($rs -> fields as $k => $v){
			if($k >= 6){
				$myvalue = $d[$rs[$k] -> name];
				if(isset($myvalue) && !is_array($myvalue)){
					$rs[$k] -> value = mb_convert_encoding($myvalue,"GB2312","UTF-8");
				}
			}
		}
		$rs['isupdate'] -> value = 2;
		$rs -> update();
		$rs -> close();
		$dlist -> movenext();
	}
?>

myhttp類 php使用fsockopen實現穩定的HTTP連接

最近一直在寫淘寶客的程序,因為網絡的原因,file_get_contents經常讀取出錯,想到了比較穩定的方法,使用fsockopen連接API。fsockopen 函數在網上介紹的還是很多的,但是介紹再多,創建http請求仍然是一件比較麻煩的。
fsockopen調用的方法比較繁瑣,要使用得到的數據還要去掉http頭,所以冒出了寫一個通用的類的方法。今天正好是51假日,在家寫了這種的一個類。

<?php
	/*
	CatSeven myHttp Vesion 0.1
	
	======CopyRight======
	Home:http://www.myw3.cn/myDevise/myHttp/
	Design:Miao Qiyuan[miaoqiyuan.cn]
	Downloads:http://downloads.myw3.cn/file=myDevise/myHttp/0.1
	*/
	
	class myHttp{
		public $Method,$URI,$SendDate;
		public $HttpServerPort,$HttpServer,$HttpServerIP;
		public $Err,$ErrStr;
		public $timeout;
		public $responseText;
		
		public function __construct($uri='/',$method='get',$query='',$server='localhost',$port='80',$serverip='',$timeout=30){
			$this->URI=$uri;
			$this->Method=$method;
			$this->SendDate=$query;
			$this->HttpServer=$server;
			$this->HttpServerPort=$port;
			$this->HttpServerIP=$serverip;
			if(is_numeric($timeout))$this->timeout=$timeout;
		}
		
		public function send(){
			$this->Method=strtoupper($this->Method);
			if($this->HttpServerIP=="")$this->HttpServerIP = $this->HttpServer;
			if($this->Method=="GET" && strstr($this->URI,"?")==0)$this->URI=$this->URI."?".$this->SendDate;
			$sock = fsockopen($this->HttpServerIP,$this->HttpServerPort,$errno,$errstr,$this->timeout);
			if(!$sock){
				$this->ErrStr=$errstr;
				$this->Err=$errno;
				die("無法打開".$this->HttpServerIP.":".$this->HttpServerPort);
			}
			fwrite($sock, $this->Method." ".$this->URI." HTTP/1.0\r\n");
			fwrite($sock, "Host: ".$this->HttpServer."\r\n");
			if($this->Method=="POST"){
				fwrite($sock, "Content-type: application/x-www-form-urlencoded\r\n");
				fwrite($sock, "Content-length: ".strlen($this->SendDate) . "\r\n");
				fwrite($sock, "Accept: */*\r\n");
				fwrite($sock, "\r\n");
				fwrite($sock, $this->SendDate."\r\n");
				fwrite($sock, "\r\n");
				fwrite($sock, "Referer: http://www.myw3.cn/myDevise/myHttp/");
			}
			fwrite($sock, "Connection: Close\r\n\r\n");
			$headers = "";
			while ($str = trim(fgets($sock,4096)))
				$headers .= "$str\n";
			
			$body = "";
			while (!feof($sock))
				$body .= fgets($sock, 4096);
			fclose($sock);
			$this->responseText=$body;
		}
	}
?>

輸入參數的方法有兩種,在創建類的時候同時輸入參數和先創建類,慢慢輸入參數。相關例子分別為test,test2,該類同時支持get,post的方法。

< ?php
	include("myHttp.class.php");
	$test = new myHttp();
	$test -> URI = "/index.php";
	$test -> HttpServer = "www.okfdzs53.com";
	$test -> Method = "post";
	$test -> SendDate ="s=myhttp";
	$test -> send();
	echo $test -> responseText;
	
	$test2 = new myHttp('/index.php','get','s=myhttp','www.okfdzs53.com','80','',30);
	$test2 -> send();
	echo $test2 -> responseText;
?>

ASP直接使用表單名稱變量調用GET提交的數據

當PHP.ini設置register_globals = On是,通過GET提交的數據可以直接使用表單名調用GET提交的數據。asp就不可以,我想到了asp的execute,也謝了一個腳本,還能過濾SQL注入字符串

<%
Dim myRegExp

set myRegExp=New RegExp
myRegExp.Pattern = "[^a-z0-9_]"
myRegExp.Global=True

for each Req in Request.Querystring
	ReqV=Request.Querystring(Req)
	if trim(ReqV)&lt;&gt;"" then
		ReqV=replace(ReqV,"""","""""")
		Req=myRegExp.Replace(Req,"")
		Execute(Req&"="""&ReqV&"""")
	end if
next

response.write a
%>

調用很簡單。比如GET提交/get_Test.asp?a=111&b=222

則直接可以使用Response.write a,輸出結果為111。簡單吧~

再次感謝小秦(Q48080163)提出的bug

自定義dedeeims的路徑,不讓dedeeims產品頁生成靜態

在織夢的論壇上看到好幾篇關于自定義dedeeims的路徑,不讓dedeeims產品頁生成靜態之類的求助信息。確實,dedeeims的產品路徑還帶有日期,如果動態的路徑,整站到再/plus/下,感覺特別不爽,今天我就給修改一下。
首先讓我們感覺不爽的就是/plus/list.php?tid=這種路徑作為頻道(欄目,分類頁),感覺特別不爽,我們就先從它下手。打開include\channelunit.func.php,找到//$reurl = $GLOBALS[‘cfg_phpurl’].”/list.php?tid=”.$typeid;,直接修改成$reurl = “/class.php?id=”.$typeid;這樣,所有的分類頁就變成了/class.php?id=…的形式了。在根目錄建立一個class.php,內容如下:

< ?php
	$tid=$_GET['id'];
	require_once('plus/list.php');
?>

很簡單吧,下面修改產品展示頁路徑為product.php,閱讀新聞頁為news.php。

找到include\channelunit.func.php,function GetFileUrl($aid,$typeid,$timetag,$title,$ismake=0,$rank=0,$namerule=”,$typedir=”, $filename=”),假設產品分類為4,10,新聞分類為3,9。直接添加上如下代碼:

< ?php
		if($typeid==4||$typeid==10)
			return '/product.php?product_id='.$aid;
		elseif($typeid==3||$typeid==9)
			return '/news.php?id='.$aid;
		else
			return '/plus/view.php?aid='.$aid;
?>

其他情況就是默認路徑了。當然也可以改成/view.php?aid=…

news.php

<?php
	$aid=$_GET['id'];
	require_once('plus/view.php');
?>

product.php

<?php
	$aid=$_GET['product_id'];
	require_once('plus/view.php');
?>

現在前臺基本就沒有問題了,后臺預覽文件的時候,可能會出現錯誤,修改admin\archives_do.php代碼如下:

	function viewArchives()
	-->>...
	if(strpos($arcurl,'?')==-1)
		echo "$lt;script language='javascript'>location.href='$arcurl"."?".time()."';$lt;/script>";
	else
		echo "$lt;script language='javascript'>location.href='$arcurl"."&tme=".time()."';$lt;/script>";
	exit();