Google自訂搜尋

目前分類:PHP Web (10)

瀏覽方式: 標題列表 簡短摘要
差不多可以給大家試用了..
這個Library是給PHP用的,用於對MySQL的資料庫操作
Google Code: http://code.google.com/p/php-mysql-like-ror/
mysql.php: 這個是MySQL的物件,包含了基礎操作:連線、查詢、傳回結果、關閉連線
php_mysql_like_ror.php: 這個是行為操作,有find_all, find_all_by_field, create, update_field, update_fields, delete_by
common_functions.php: 這邊是給php_mysql_like_ror.php呼叫用的輔助函式
以下是操作範例:
require 'php_mysql_like_ror.php';
$mysql = new MySQL("localhost", "cfc", "cfc", "wtf"); // Default encoding is UTF-8
$mysql->Conn();
$mysql->Exec(find_all_by_field("id", 10, "users")); // Same as: mysql_query("SELECT * FROM `users` WHERE id = 10");
// Same as: mysql_fetch_assoc(mysql_query("SELECT * FROM `users` WHERE id BETWEEN 10 AND 20 LIMIT 5"));
$mysql->fetch_assoc(find_all("users", array("conditions" => "id BETWEEN 10 AND 20", "limit" => 5)));
$mysql->getCount(find_all("users", array("select" => "id"))); // Same as: mysql_num_rows(mysql_query("SELECT id FROM `users`"));
$mysql->Close();
$mysql = null;
如果有發現bugs或者有任何建議或者是features建議的,請到http://code.google.com/p/php-mysql-like-ror/issues/list 丟issues給我們,謝謝
原始碼在這邊: http://code.google.com/p/php-mysql-like-ror/source/list
可以用SVN來追我們的trunk:
svn checkout http://php-mysql-like-ror.googlecode.com/svn/trunk/ php-mysql-like-ror
有新的Update我會在Blog上另闢新文的:D

hechian 發表在 痞客邦 留言(0) 人氣()

之前看到Rails強大的find後,心癢癢!在寫php case的時候,一直很希望php也能夠透過XXX.find來用,可惜這真的有點.. 好吧,對我而言有點麻煩
因此,就先寫了一個find_by_id.php...寫完後就擱著不做了(因為忘記有這東西了)
剛剛在整理Google Docs時發現到這東西,仔細看看後就開始著手修改.. 改著改著發現.. "其實我多加個變數後就可變成find_all_by_field了阿=.="
所以這版本就出來拉...
使用方式很簡單:
mysql_query(find_all_by_field("id", 10, "users"));
mysql_query(find_all_by_field("name", "cfc", "admins"));
mysql_query(find_all_by_field("sex", "female", "members", array("limit" => 10)))
原始碼介意我貼在別的地方嗎?
Update[2007/11/13 18:43]:  原始碼有問題,暫時關閉,不好意思。

hechian 發表在 痞客邦 留言(0) 人氣()

上個例子,我們用PHP + Ruby 搭配ActiveRecord的方式來寫資料新增的程式
今天我們就來延伸應用一下,要做什麼呢? RSS聯撥器!
有鑒於GoogleReader的RSS聯撥器產生出來的東西太醜(只能修改一兩個小地方.. 我總覺得那好胖=  =),乾脆自己寫個來用
Demo網址改天再PO上來,我們先來寫程式比較重要:P
主機請記得先裝好Ruby、PHP、Apache跟MySQL;OS要啥都沒差,我比較建議LAMP的配置XD
我們來建立一個叫做feeds的目錄包含一個子目錄,叫做lib:

  mkdir -p feeds/lib
 
先跳到feeds/lib新增幾個會被require的檔案:

  cd feeds/lib
  touch connect.rb model.rb require.rb

以下是各個檔案的用處:
- connect.rb
  資料庫連線初始化
- model.rb
  資料表模型宣告
- rqeuire.rb
  會用到的額外library引入

原始碼:

  - connect.rb
    #!/usr/bin/env ruby;require 'lib/require';ActiveRecord::Base.establish_connection({:adapter => "mysql",:host => "localhost",:username => "username",:password => "password",:database => "others"})
  - model.rb
    #!/usr/bin/env ruby;require 'lib/connect';class Feed < ActiveRecord::Base;end
  - require.rb
    #!/usr/bin/env ruby;%w|rubygems active_record hpricot open-uri|.each{|lib| require lib}

一切搞定後,我們可以開始來建立資料庫了!

  mysql> create database others;
  mysql> use others;
  mysql> create table feeds(id int, uri varchar(255));
  mysql> describe feeds;
 
看看資料表結構是否正確!
接著回到上一層目錄,新增底下的幾個檔案:

  touch index.php list.rb new.htm new_record.rb save.php

- index.php
  網站首頁,會列出目前的RSS feed
- save.php
  儲存RSS feed網址
- list.rb
  處理RSS feed
- new_record.rb
  將RSS feed網址存入資料庫(也可以直接用php寫.. 我是沒有意見)
- new.htm
  新增RSS feed網址的表單

原始碼我就直接貼了

  - index.php
    <html>
      <head>
        <title></title>
      </head>
      <body>
        <a href="new.htm">Create</a>
        <ul>
    <?php
      exec("ruby list.rb", $args);
      for($i=0;$i<count($args);$i+=3)
        echo "<li><a href=\"" . $args[$i+1] . "\" title=\"作者:" . $args[$i+2] . "\">" . $args[$i] . "</a> -- " . $args[$i+2] . "</li>";
    ?>
        </ul>
      </body>
    </html>

  - save.php
    <?php
      exec("ruby new_record.rb " . $_POST["feed_uri"], $arg);
      if ($arg) echo "<script>location.href=\"index.php\";</script>";
    ?>
 
  - list.rb
    #!/usr/bin/env ruby
    =begin
        Filename: list.rb
    =end
    require 'lib/model'

    Feed.find(:all).each{|feed|
        doc = Hpricot(open(feed.uri))
        rss = doc.search("entry")
        max = rss.size > 3 ? 3 : rss.size
        max.times {|i|
          break if rss.nil?
          puts rss[i].search("title").text.gsub(/\n/, " ") # Return the title of the article to the PHP file.
          puts rss[i].search("link[@rel='alternate']")[0]["href"].gsub(/\n/, " ") # Return the link of the article to the PHP file.
          puts rss[i].search("author/name").text.gsub(/\n/, " ") # Return the author of the article to the PHP file.
        }
    }

  - new_record.rb
    #!/usr/bin/env ruby
    =begin
      Filename: new_record.rb
    =end
    require 'lib/model';puts Feed.new({:uri => ARGV[0]}).save
 
  - new.htm
    <html>
      <head>
        <title></title>
      </head>
      <body>
        <form action="save.php" method="post">
          <p>Please input the feed url:<input type="text" name="feed_uri" /></p>
          <p><input type="submit" value="Save!" /></p>
        </form>
     </body>
    </html>
 
OK,這樣就可以啦XD

hechian 發表在 痞客邦 留言(0) 人氣()

如果老闆要求使用php,可是您卻是Ruby狂熱者,這.. 怎辦呢?
沒關係! 一樣用Ruby寫,php只要做一點點的處理就好!
How to? php中有這個函式:exec
( 本範例實作於Windows XP Professional搭配InstantRails;在其他作業系統上沒有測試過,不過各位還是可以嘗試看看 )
我們來試試看吧!
先寫個test.rb:

  #!/usr/bin/env ruby
  #
  # Filename: test.rb
  #
  puts "Hello"
  puts "world"
 
再寫個test.php:

  <?php
    exec("test.rb", $args);
    foreach($arg as $args)
      echo $arg . "<br />";
  ?>

將兩個檔案放在同一個目錄下後,打開瀏覽器瀏覽test.php;看!是不是顯示結果出來了?
OK,我們直接來用ActiveRecord幫我們新增資料吧!
我們需要一張普通頁面、一張php網頁跟一個ruby檔案:

  #!/usr/bin/env ruby
  #
  # Filename: ar.rb
  #
  require 'rubygems'
  gem 'activerecord'
  ActiveRecord::Base.establish_connection(
    :adapter => 'mysql',
    :host => 'localhost',
    :username => 'root',
    :password => '',
    :database => 'cal'
  )
 
  class Event < ActiveRecord::Base;end
 
  name, descr = ARGV[0], ARGV[1]
  puts Event.new({:name => name, :descr => descr, :date => Date.today, :time => Time.now}).save

好了,接下來是普通頁面,這是送出表單:
 
  <!-- Filename: ar_form.html -->
  <html>
    <head>
      <title>PHP with Ruby and ActiveRecord</title>
    </head>
    <body>
      <form action="ar_save.php" method="POST">
        Username: <input type="text" name="usrname" /><br />
        Description: <textarea name="descr"></textarea><br />
        <input type="submit" value="Save it!" />
      </form>
    </body>
  </html>
 
這是php網頁:

  <?php
    // Filename: ar_save.php
    exec("2.rb " . $_POST["usrname"] . " " . $_POST["descr"], $arg);
    if($arg[0]) echo "Success!";
  ?>

OK,讓我們來試試看吧!
Look!! It works!!
現在,我們來寫個ar_read.rb跟ar_read.php來讀取資料吧:

  # Filename: ar_read.rb
  require 'rubygems'
  gem 'activerecord'
  ActiveRecord::Base.establish_connection(
    :adapter  => "mysql",
    :host     => "localhost",
    :username => "root",
    :password => "",
    :database => "cal"
  )
  class Event < ActiveRecord::Base;end
  events = Event.find(:all, :conditions => "name = '#{ARGV[0]}'")
  events.each{ |event|
    puts event.name
    puts event.descr
    puts event.date.to_s(:db)
    puts event.time.strftime("%H:%M:%S")
  } 

  <?php
    // Filename: ar_read.php
    exec("ar_read.rb " . $_GET["name"], $args);
    $info = array();
    for($i=0, $j=0;$i<count($args);$i+=4, $j++){
      $info[$j]["name"] = $args[$i];
      $info[$j]["descr"] = $args[$i+1];
      $info[$j]["date"] = $args[$i+2];
      $info[$j]["time"] = $args[$i+3];
    }
    for($j=0;$j<count($info);$j++)
      echo "Name => " . $info[$j]["name"] . "<br />Description => " . $info[$j]["descr"] . "<br />Date => " . $info[$j]["date"] . "<br />Time => " . $info[$j]["time"] . "<br />";
  ?>
 
看看結果,hmmm.. 看起來真棒!
嗯?如何?Ruby + ActiveRecord的威力很強大吧?
為什麼不要直接用PHP寫就好? 因為光寫SQL你就想跳樓,何必呢?
記住,在Ruby的檔案中,不可以用:

  puts 1, 2, 3

這種方法,會造成php收不到回傳,因此必須用這種寫法:

  puts 1
  puts 2
  puts 3

或者就是:

  puts 1; puts 2; puts 3

端看個人喜好囉!

hechian 發表在 痞客邦 留言(0) 人氣()

PHP可以使用一種叫做Heredoc的技術
那可以不理會字串中跳脫字元且變數與跳脫字元都會被執行。
使用方式是:
  <<<指標名稱
請注意,指標名稱跟<<<之間沒有空格,且後面還有個換行

結束的指標名稱也跟起始的一樣,且指標名稱前也要一個換行,後面加上分號:
  指標名稱;
指標名稱的命名跟變數名稱的命名法是一樣的
以下是個範例:
<?PHP
$str = <<<EOS

\$today = strtotime( date( "j M Y" ) ) ;
\$tdehu = strtotime( "28 Aug 2004" ) ;
\$diff = (\$today - \$tdehu) / 86400 ;
echo \$diff;

EOS;
highlight_string($str);
?>

hechian 發表在 痞客邦 留言(3) 人氣()

嘿嘿,標題說得好像打廣告的
可是我真的要說.. Smarty好用啦!
在使用Smarty之前,我先來說一下它的用處以及它"好"在哪裡
First,我們知道以往開發網頁程式時,常常都要作版面 + 寫程式
但是程式設計師不一定會美工,因此都交由美工人員作版面設計,程式設計師寫自己的程式功能
有時候,程式設計師寫的東西可能被美工人員給破壞掉!! 這是很嚴重的問題!!
又或者,美工人員作的網頁版面,會因為程式設計師的某種功能造成無法正常顯示或者整個版面走樣,這也是很嚴重!!
因此,Template Engine(樣板引擎)就被推廣出來啦!
程式設計師寫你自己的程式,網頁設計師做好你自己的版面,弄好之後,程式設計師再把網頁給"包(display)"進來,套用一下變數,整個網頁就完成了!以後要維護網頁版面或者修改程式碼,都不會動到互相的檔案,因為程式設計師的PHP跟網頁設計師的tpl檔是分開的!

說完了這麼多,我們趕快來安裝Smarty這個好用的樣板引擎吧!

First,先到Smarty官方下載最新檔案
http://smarty.php.net/
抓到後,解壓縮檔案,裡面應該會有以下檔案:
BUGS         ChangeLog  INSTALL  QUICK_START  RELEASE_NOTES  demo/  misc/
COPYING.lib  FAQ        NEWS     README       TODO           libs/  unit_test/
但是呢.. 說這麼多,其實我們只要用到libs/這個資料夾裡面的東西而已拉!

安裝分成兩種,官方網站介紹的是將檔案裝到主機上,以便其他開發者可以直接引用Smarty檔案來用;如果我沒有自己的主機呢?放心!我會介紹兩種方法的!

首先我們先來介紹裝在主機上的..
依照官方網站的教學,它建議我們將檔案裝在/usr/local/lib/php/Smarty底下
因此我們先確定有沒有/usr/local/lib/php
如果沒有沒關係,我們先建立一下
# mkdir -p /usr/local/lib/php/Smarty
接著,我們把檔案Copy過去,我們先到解壓縮後的Smarty資料夾
# cp -r libs/* /usr/local/lib/php/Smarty
然後ls -l確定一下有沒有過去
# ls -l /usr/local/lib/php/Smarty
應該會出現以下檔案:
/usr/local/lib/php/Smarty/
Config_File.class.php
debug.tpl
internals/
plugins/
Smarty.class.php
Smarty_Compiler.class.php
好了之後,我們回到要使用Smarty的資料夾底下
Smarty需要幾個資料夾:
templates templates_c cache configs
所以我們要建立起這幾個資料夾,假設我的網站目錄是:/home/cfc/public_html
# su - cfc
$ cd public_html
$ mkdir templates templates_c cache configs
templates_c跟cache的使用者是Apache,請檢查您的Apache使用者,在這邊我的是www-data
$ chown www-data:www-data templates_c cache
然後,templates_c跟cache的權限是775
$ chmod 775 templates_c cache
到此就安裝好啦~~
接著來說明沒有自己主機的安裝法
只要把libs改名一下... 丟到網站根目錄
接著,其他步驟就跟安裝在主機上一樣=  =.. 這樣就可以了
因此,網站根目錄底下應該要有除了以上四個資料夾外.. 還有你更改名過的libs/
這樣就可以囉~

一切都安裝好了,我們開始來看看Smarty的教學吧!
目前先請各位移駕到:http://www.php5.idv.tw/documents/smarty/smarty20040209.htm

目前教學部分還沒寫好^^
過段日子再補上囉~~
謝謝收看m(_ _)m

hechian 發表在 痞客邦 留言(7) 人氣()

閒來沒事
BF那天寫了一個ASP版的,我現在來寫一個PHP版的^^
程式分為兩個,一個是管理介面:redirectadmin.php,一個是連結頁面:redirect.php

底下是管理介面的原始碼:
if($_POST['ok']=="ok"){
    $HOST="";
    $USER="";
    $PWD="";
    $DB="";

    $link=mysql_connect($HOST, $USER, $PWD);
    mysql_select_db($DB,$link);
    $query="INSERT INTO `link`(`linkid`, `url`) VALUES('', 'http://".$_POST['url']."');";
    $rs=mysql_query($query);
    if ($rs==1){
        echo "新增成功!";
    }else{
        echo "新增失敗!";
    }
    mysql_close($link);
}
?>



不必輸入http://,直接輸入網址即可,範例:www.cfc.zuso.tw







目前已經有的網址列表:


    $HOST="";
    $USER="";
    $PWD="";
    $DB="";

    $link=mysql_connect($HOST, $USER, $PWD);
    mysql_select_db($DB,$link);
    $query="SELECT * FROM `link`";
    $result=mysql_query($query);
    $num=mysql_num_rows($result);
    echo "";
    for($j=0;$j<=$num-1;$j++){
    $row=mysql_fetch_row($result);
        echo "";
        for($i=0;$i<=count($row)-1;++$i){    
            echo "";
        }
        echo "";
    }
    echo "
LinkID
網址
" . $row[$i] . "
";
    mysql_close($link);
?>



底下是連結介面的原始碼:
 if($_GET['id']!=""){
    $HOST="";
    $USER="";
    $PWD="";
    $DB="";

    $link=mysql_connect($HOST, $USER, $PWD);
    mysql_select_db($DB,$link);
    $query="SELECT url FROM link WHERE linkid = " . $_GET['id'];
    $rs=mysql_query($query);
    $num=mysql_num_rows($rs);
    $row=mysql_fetch_row($rs);
    mysql_close($link);
    header("Location: ".$row[0]);
    exit;
}else{
    echo "必要的引數消失了啦!請你確定一下喔!";
}
?>

下載點:
http://www.blueshop.com.tw/download/show.asp?pgmcde=PGM20060120160752HV6
http://www.cfc.zuso.tw/~cfc/download/redirect.rar

執行網址:http://www.cfc.zuso.tw/~cfc/redirect/redirectadmin.php

使用說明:
執行網址是管理介面
執行好之後,底下會列出已經有的列表
看一下你自己新增的ID是多少,然後在去
http://www.cfc.zuso.tw/~cfc/redirect.php?id=你的ID

壓縮檔解開後,請先在SQL上執行裡面的SQL檔
然後再修改redirect.php跟redirect/redirectadmin.php裡面的資訊
就是主機、資料庫名稱跟資料庫帳密
設定好就可以丟到主機上面用了

hechian 發表在 痞客邦 留言(1) 人氣()

原始程式碼不變,我終於知道問題出在哪裡了
使用成員函式時,不管有沒有引數傳入都得加括號..
我居然忘記最重要的這個= ="
類別主體大致上沒有什麼錯誤,只要把Conn裡面的那個echo去掉即可
那個是Debug時用的... Orz

====編修日期 2006/01/04 PM 01 02====

嘿嘿,第一次寫物件寫得有點亂的說..
唉,不是很滿意ˊˋ
在使用物件時發現問題,現在順便來做個Memo
類別中,建構子若有引數需傳入,則在宣告成實體物件的同時,也要一併將引數傳入
$a = new B(argu1, argu2..);
而不是↓
$a = new B();
$a->B(argu1, argu2...);

嗯嗯.. 我學會了:)
下面這個是連結MySQL用的,還提供基本的查詢功能
建立實體物件時,需傳入主機、帳號、密碼、資料庫名稱
然後...
Conn成員函數是連線到資料庫
Query成員函數是執行資料庫查詢
Close成員函數則是關閉資料庫
歡迎Report Bug.. 程式碼會慢慢更新:)

class MySQL
{
var $HOST, $UNAME, $UPWD, $DB;
var $link;
function MySQL($host="localhost", $username="aic", $userpwd="cia", $database="aic")
{
$this->HOST=$host;
$this->UNAME=$username;
$this->UPWD=$userpwd;
$this->DB=$database;
}

function Conn()
{
$this->link = mysql_connect($this->HOST, $this->UNAME, $this->UPWD);
$tmp = mysql_select_db($this->DB,$this->link);
return $tmp ;
}

//2006.07.12 修正:原function Query($sql) 改為 function Exec($sql)
function Exec($sql)
{
//2006.06.07 修正:原mysql_qurey($str, $this->link); 改為 return mysql_query($str, $this->link);
return mysql_query($sql,$this->link);
}

function Close()
{
mysql_close($this->link);
}

//2006.06.08後新增

function getCount($sql)
{
return mysql_num_rows($this->Query($sql));
}

}
?>

hechian 發表在 痞客邦 留言(0) 人氣()

我想,很多地方都看得到會員驗證吧
帳號密碼的驗證...
如果用JavaScript的話,很快被破解(除非用了MD5或其他加密法,不然我都破得了Orz...:P)

用PHP寫的話.. Code在底下:

$link=mysql_connect("localhost","id","pwd");
mysql_select_db("NDCS",$link);
$query="SELECT poll_id FROM `poll_test` WHERE poll_id = 10";
$rs=mysql_query($query);
$num=mysql_num_rows($rs);
if($num=='1'){
echo $rs;
}else{
echo "No data";
}

mysql_close($link);

hechian 發表在 痞客邦 留言(0) 人氣()

之前接了學校的Case,作投票系統(才給我5000...)
在作資料讀出的時候,被搞死(我是PHP新手)
唉.. 寫個像是留言版一樣的東西(我忘記當時怎會寫出這東西了)

底下是Code:

$link=mysql_connect($HOST,$UNAME,$UPWD);
mysql_select_db("NDCS",$link);
$query="SELECT * FROM `poll_test`";
$result=mysql_query($query,$link);
echo "";
While ($row=mysql_fetch_row($result))
{
echo "";
for($i=0;$i<=count($row)-1;++$i){
echo "";
}
echo "";

}
echo "

   
       
           
       
   
" . $row[$i] . "

";
mysql_close($link);

hechian 發表在 痞客邦 留言(0) 人氣()