顯示文章

這裡允許您檢視這個會員的所有文章。請注意, 您只能看見您有權限閱讀的文章。


文章 - ricky

頁: 1 ... 20 21 [22] 23
631
database 討論版 / postgre的Bug?
« 於: 2005-02-02 00:15 »
在Postgre 8.0上遇到了一個神秘現象
我下了一個查詢式
select * from table where a1 like '%\%%';
正常應該要傳回a1包含'%'字元的Rows
可是我發覺Postgre居然會把'\'給忽略了
會變成這樣
select * from table where a1 like '%%%';
導致傳回所有資料
有其他人是用7.4.X的嗎
可否幫忙看看是否有這個問題吧

632
沒試過在windows底下裝php
印象中直接抓取installer安裝的話是不會包含pear模組的
可能得抓完整的zip安裝檔才有包含pear吧
完整的安裝zip大概有7MB
至於詳細安裝法就不清楚了
看看有沒有哪個善心人士
來個windows底下的安裝教學吧

633
上回提到了如何使用php去呼叫別人提供的web service
這回我們來看看如何提供一個web service給別人吧

server.php
代碼: [選擇]

<?php
class HelloServise
{
 
//$__dispatch_map 用來定義這個hello function輸出以及輸入的參數型態
 
var $__dispatch_map = array&#40;&#41;;
 
function HelloServise&#40;&#41;
 
{
   
//我們在constructor這邊指定好Hello這個函數Input的參數只有一個
   //名稱叫input型態是string
  //傳回值是一個string型態的值
   
$this->__dispatch_map['Hello'] =
   array&
#40;'in' => array&#40;'input' => 'string'&#41;,
         
'out' => array&#40;'output' => 'string'&#41;,
       
&#41;;
 
}
 function 
Hello&#40;$input&#41;
 
{
  return 
"Hello&#58;[$input]";
 }
}
require_once 
'SOAP/Server.php';
require_once 
'SOAP/Disco.php';
//產生一個SOAP Server物件
$server = new SOAP_Server;
//產生一個我們要提供的web service物件
$Hello = new HelloServise&#40;&#41;;
//向SOAP Server註冊我們提供的Web Service名稱叫HelloService
$server->addObjectMap&#40;$Hello,'urn&#58;HelloService'&#41;;
//因為我們取得Client送過來的xml是用POST方式
//所以我們檢查如果送過來的資料是用POST送過來的
//就直接交給SOAP Server去做處理
if &#40;$_SERVER['REQUEST_METHOD']=='POST'&#41;
 
$server->service&#40;$HTTP_RAW_POST_DATA&#41;;
else
{
 
//產生一個discover物件
 //用來產生wsdl
 
$disco = new SOAP_DISCO_Server&#40;$server,'HelloServise'&#41;;
 //設定輸出文件為xml格式
 
header&#40;"Content-type&#58; text/xml"&#41;;
 //如果client呼叫的時候是xxx.php?wsdl
 //就呼叫getWSDL&#40;&#41;傳回wsdl格式的XML
 //否則就送回正確取得wsdl方式的XML
 
if&#40;$_SERVER['QUERY_STRING']=='wsdl'&#41; echo $disco->getWSDL&#40;&#41;;
 
else  echo $disco->getDISCO&#40;&#41;;
}
?>


我們來測試一下剛剛寫好的HelloService
client.php
代碼: [選擇]

<?php
 
require_once&#40;"SOAP/Client.php"&#41;;
 
$wsdl=new SOAP_WSDL&#40;'http&#58;//yourhost/server.php?wsdl'&#41;;
 
$helloClient $wsdl->getProxy&#40;&#41;;
 
echo $helloClient->Hello&#40;"This is a test!"&#41;;
?>


輸出
代碼: [選擇]

Hello:[This is a test!]

是不是很簡單呢
此外這邊在補充一點
WSDL跟SOAP的關係
wsdl是用來描述你提供了哪些web service
用個簡單的說法就是
wsdl就是一個定義檔
定義你提供的物件
SOAP才是真正處理輸入以及輸出xml的主角

634
使用rpm方式安裝php的人
得額外安裝pear的rpm套件
pear模組名稱是叫做php-pear
先用rpm -q php-pear
看看有沒有裝pear
沒有裝的人自己補裝一下吧
裝好後直接執行
pear xxx.tgz
xxx.tgz就是抓下來的pear模組
pear模組也是有相依性的喔
所以請把它需要的套件都抓齊了一次安裝上去吧

635
目前網頁服務當紅的主角莫過於Web service服務
透過標準的SOAP/WSDL(W3C已經將SOAP,WSDL列入XML標準的規範)
達到不同平台之間資訊的交換
以往大多只侷限於微軟的.Net產品上
不過現在PHP的愛好者也有解決方案了
首先到http://pear.php.net/上下載
SOAP套件
SOAP套件需要用到
Mail_Mime
HTTP_Request
Net_URL
Net_DIME
這幾個PEAR的模組沒有裝的人請順便裝一下吧
抓回來後只要執行pear install [套件]就可以完成安裝了
好啦現在我們就開始主題了
底下的範例程式是以google提供的google search service作為例子

search.php
代碼: [選擇]

<form name="form1" method="post" action="">
 請輸入查詢字串:<input name="Query" type="text" size="18" maxlength="18">
<input name="Submit" type="submit" value="查詢">
</form>
<?php
$LisenceKey
="XXXXXXXXXXXXXXXXXXXXXXXXX";
if&
#40;$_POST["Query"]!=''&#41;
{
 require_once&
#40;"SOAP/Client.php"&#41;;
 
$wsdl=new SOAP_WSDL&#40;'http&#58;//api.google.com/GoogleSearch.wsdl'&#41;;
 
$Google $wsdl->getProxy&#40;&#41;;
 
$Result=$Google->doGoogleSearch&#40;
  
$LisenceKey,
  
"allintext&#58; ".iconv&#40;"Big5","UTF-8",$_POST["Query"]&#41;, 0, 10, false,
  
""false""""""&#41;;
 
$TotalRows=count&#40;$Result->resultElements&#41;;
 
for&#40;$i=0;$i<$TotalRows;$i++&#41;
 
{
  
?>

  <table border=1 width="640" >
  <tr bgcolor="#FFCC66">
  <td>
  <a href="<?php echo $Result->resultElements[$i]->URL;?>">
  <?php echo iconv&#40;"UTF-8","Big5",$Result->resultElements[$i]->title&#41;;?>
  </a>
  </tD>
  </tr>
  <tr>
  <td>
  <?php echo iconv&#40;"UTF-8","Big5",$Result->resultElements[$i]->snippet&#41;;?>
  </tD>
  </tr>
  </table>
  <br>
  <?php
 
}
}
?>


$LisenceKey是google提供的
想試玩看看的人可以上
http://www.google.com/api/
去申請一個吧
google search服務是免費的不過一天只能查1000次

//這是载入SOAP所需要用到的物件
require_once("SOAP/Client.php")
//產生一個$wsdl Web Service物件
//'http://api.google.com/GoogleSearch.wsdl'這個是wsdlweb service描述檔
//這樣才知道這個Web service提供了哪些服務
$wsdl=new SOAP_WSDL('http://api.google.com/GoogleSearch.wsdl');
//產生一個$Google物件(這個物件就是google提供的Web Service)
$Google = $wsdl->getProxy();
//這裡呼叫了一個Google提供的GoogleSearch服務
//這邊就不詳細說明GoogleSearch詳細內容
//有興趣的人就自行到http://www.google.com/api/
//那邊有完整的google search API說明
$Result=$Google->doGoogleSearch(
  $LisenceKey,
  "allintext: ".iconv("Big5","UTF-8",$_POST["Query"]), 0, 10, false,
  "", false, "", "", "");


這就是Client端的呼叫方式
很簡單吧
下回再來分享
如何提供一個Web Service給其他人來使用吧

636
為什麼會有一個變數多個值呢??
如果是要用array的話
是看看這樣吧
<input name="test[0]" type=text value=測試一>
<input name="test[1]" type=text value=測試二>
<input name="test[2]" type=text value=測試三>
研究一下print_r($_POST)
就知道怎麼用了

637
看看這一篇
兩個原理是一樣的

638
雖然這個php沒關
不過還是回答一下好了
改一下apache
在httpd.conf加入
ErrorDocument 404 xxx.php
當server回應404 error時使用xxx.php代替原本的error page

639
當使用者再按下一次refresh時
ie會再次送出之前傳過的資料
所以就會導致資料連續送出兩次拉
要避免這樣的問題
比較好的解決方式是
原本
送出資料->a.php->回應
解決
送出資料->a.php->redirect header(重新導向)->a.php->回應
這樣就可以解決了

640
phpinfo();
看一下系統變數就知道拉

641
PHP程式設計討論區 / [問題] 傳送遠端表單
« 於: 2004-08-20 09:04 »
那就直接把A的<form>標籤中的action設為b.php的action就好了阿
把資料直接餵給b.php去處理

642
你可能對程式語言還是很不了解喔
用print_r($_POST)
觀察一下POST變數就知道了
問題出在哪了

643
PHP程式設計討論區 / 有關session 傳值問題
« 於: 2004-08-09 13:44 »
在test.php後面不是有加了一段html嗎
在test2.php去require test.php
導致html在header送出之前搶先送出
就出現這個警告拉

644
引述: "hover"
恕刪
----login.php----
<?php
session_start();
session_destroy();
^^^^^^^^^^^^^
?>

這裡有問題喔
這裡呼叫了
session_destroy();
把起始的session變數都摧毀了
後面怎麼呼叫當人都無法取得session變數值了
session的用法是這樣的
1.起始session
session_start();
2.註冊要使用的session變數名稱
session_register("user");
3.賦予session變數值
$_SESSION["user"]="xxxx";

645
引述: "twbestama"
引述: "ricky"
呵呵...那我也推薦另一個資料庫吧Postgre SQL
提供了許多MySQL還不支援的功能
像是trigger,stored procedure
在Native Language支援上有支援Big5
相信對許多"許功餐"夢靨的人應該是個不錯的解決方案
自己實驗的結果
連table,function命名成中文都沒有問題
用起來倒是蠻快樂的
把DB的資料全部中文化後省去了不少
開發人員間溝通的時間
反正中文都寫的清清楚楚的


Postgre SQL  <===不推廌使用,因為使用的問題很多
stored procedure:
請參考:http://dev.mysql.com/doc/mysql/en/Stored_Procedures.html
trigger:
請參考:http://dev.mysql.com/doc/mysql/en/ANSI_diff_Triggers.html
容量:http://mysql.megalink.com/doc/mysql/en/Table_size.html
我們公司mysql  和  oracle都有使用....
我倒覺得mysql的效率比oracle高.....

有什麼問題呢??說來聽聽吧
搞不好這個問題我有遇過
至於上面提到的一些功能沒看錯的話應該還在alpha release階段吧
也就是還在實驗中並不是正式release喔

646
PHP程式設計討論區 / 有什麼工具可以用呢?
« 於: 2004-08-03 08:23 »
如果是ide介面的話有一個dev-php
如果要像asp擁有完整的開發元件庫
php可能還有一段路要走吧

647
PHP程式設計討論區 / [閒聊]FC2 的 php.ini
« 於: 2004-08-02 13:03 »
這是因為register_global的因素啦
這也是的很重要的安全因素
當register_blobal打開時
不論是POST,GET或是SESSION變數
通通都是以$XXXX的型態
如此一來根本分不清楚到底是POST,GET還是SESSION傳來的
因此有心人士可以輕易的使用GET傳入一個變數
誤導程式導致嚴重的系統漏洞
所以後來php預設值才會將register_global給關閉了

648
呵呵...那我也推薦另一個資料庫吧Postgre SQL
提供了許多MySQL還不支援的功能
像是trigger,stored procedure
在Native Language支援上有支援Big5
相信對許多"許功餐"夢靨的人應該是個不錯的解決方案
自己實驗的結果
連table,function命名成中文都沒有問題
用起來倒是蠻快樂的
把DB的資料全部中文化後省去了不少
開發人員間溝通的時間
反正中文都寫的清清楚楚的

649
有點搞不懂你的意思...
你是指php會等到全部執行完才會將output一次輸出到client端??
印象中應該是不會

650
MYSQL跟ORACLE兩個是定位完全不同的產品吧
MYSQL定位在"輕量級的小型資料庫系統"
強調的是效能而不是功能因此很多標準的SQL語法都不支援
ORACLE的定位不用說了吧
他本身就是一個大型資料庫系統
至於哪個好就看你的用途吧
如果只是想寫個留言版程式
用到ORACLE也太誇張了吧

651
'@'表示後面接的那行敘述如果發生錯誤或是警告訊息
就不要直接回應到網頁上
有時候網頁上突然出現一個錯誤或是警告訊息實在蠻討人厭的
有些時候甚至是一些無關緊要的訊息
舉個例子
unlink($file);
如果$file不存在的時後php會丟回一個警告
有些時候我們並不在乎這個檔案存不存在
反正都要刪掉了管他一開始存不存在
這時就可以在前面加上'@'
叫他不要在廢話了
刪就是了

652
代碼: [選擇]

$page=$_GET["page"]; //取得選擇變數$page

問題出在這邊
因為$_GET["page"]如果沒有指定(沒有初始值)
php會產生"警告訊息",非程式錯誤
就如同httang所講的可以在php.ini設定把警告訊息關掉
或者在這段敘述前面加上'@'表示這行敘述如果有錯誤或是警告時不要輸出
像這樣
代碼: [選擇]

@$page=$_GET["page"]; //取得選擇變數$page

653
php裡的mail函數
是呼叫sendmail這支程式去做mail的動作
看情形可能是local mailer沒裝
看看procmail是不是有正確裝上吧

654
代碼: [選擇]
Warning: Cannot add header information - headers already sent by (output started at /home/volition/web/html/info_service/defined/de_var.php:140)
這裡不是說了嗎...
你已經在/home/volition/web/html/info_service/defined/de_var.php
這個檔案裡面送出header了才會導致這個警告
看看發生什麼事了吧

655
別怕別怕
那只是一段警告訊息
因為安全因素所以php到後來預設值就把regist_global給關掉了
避免造成安全上的問題
那段訊息就是說因為你使用了SESSION
同時又把regist_global打開然後又直接使用global形態的變數
而不是使用$_SESSION的話將會導致很嚴重的安全漏洞
如果不想在看到這段警告的話
把session.bug_compat_42 or session.bug_compat_warn 設為 off
就可以了

656
不客氣...
經驗就是這樣慢慢累積起來的

657
PHP程式設計討論區 / HTTP Auth 問題
« 於: 2004-07-13 16:52 »
剛剛試著寫了一下
<?php
 $str="abelyang@hotmail.com:passwd@phorum.study-area.org";
 $trans = array("@" => "%40");
 $revstr=strrev($str);
 $account_passwd_len=strlen(strrev(strstr($revstr,'@')))-1;
 echo strtr(substr($str,0,$account_passwd_len),$trans).substr($str,$account_passwd_len);
?>

658
PHP程式設計討論區 / 關於 PHP 的多執行緒
« 於: 2004-07-13 16:43 »
看來得控制一下connection的數量了
採用semaphore可能也是個不錯的解決方法
http://tw.php.net/manual/tw/ref.sem.php
不過php的sem沒用過等一下去實驗看看
應該跟C的sem用法差不多吧
看看這樣能不能吧
$pid = pcntl_fork();
if ($pid == 0)
{
 //child fork
 $sem_id=sem_get($key,$Max_MySQL_Connect);//參數就看看說明吧
 sem_acquire($sem_id);//當semaphore數量達到$Max_MySQL_Connect上限時目前的process會被暫時block直到其他的process釋放semaphore才會繼續進行
 //這邊就開始處理mysql的查詢動作
 sem_release($sem_id);
}

659
PHP程式設計討論區 / 關於 PHP 的多執行緒
« 於: 2004-07-13 15:39 »
要不要試看看改用mysql_pconnect
用法跟mysql_connect一樣
不過差別在於
mysql_pconnect使用的是"持續式"的連線
當function收到connect之後會先在connection pool裡面找看看
是否有"已連線"的連線在裡面
如果有就直接用沒有的話才會真正的再去建立一條新的連線
這樣應該可以避免重複開啟多個連線
導致connect fail的情形
[/quote]

660
唉唉唉...
語法錯誤嘍
$str="insert into user (User_id,Account,Password) values('$_request[sysid]','$_request[useracc]','$_request[userpwd]');";
這樣系統會誤判的
這樣系統實際寫入的是這些東西
insert into user (User_id,Account,Password) values('array[sysid]','array[useracc]','array[userpwd]');
他會先把$_request給解譯了因為是array型態所以就用array取代掉了
況且使用assocative方式的array
$_request[userpwd]跟這樣$_request['userpwd']是不同的
所以正確的寫法應該是
$str="insert into user (User_id,Account,Password) values('".$_request['sysid']."','".$_request['useracc']."','".$_request['userpwd']."');";

頁: 1 ... 20 21 [22] 23