ThaiSEOBoard.com

พัฒนาเว็บไซต์ => Programming => ข้อความที่เริ่มโดย: oxygenyoyo ที่ 26 กันยายน 2008, 17:21:15



หัวข้อ: เกี่ยวกับการับค่าครับ PHP
เริ่มหัวข้อโดย: oxygenyoyo ที่ 26 กันยายน 2008, 17:21:15
คือผมทำหน้าเพจที่ส่งค่าแบบ post โดยใช้ฟังก์ชั่น fopensock แล้วใช้ fwrite ในการส่งข้อมูลแบบโพสครับ


function sendToHost($host,$data,$path,$message)
{
      $fp = fsockopen("$host", 80, $errno, $errstr, 30);
      if (!$fp)
      {
      echo "$errstr ($errno)\n";
      }
      else
      {
      //  $url = $path."?".$data;
      
      
        fwrite($fp,"POST /$path HTTP/1.1\r\nHost: $host \r\nContent-Type: text/xml; charset=UTF-8\r\n\r\n$data");
      
         
         $x="";
            while (!feof($fp))
            {
               $x=$x.fgets($fp, 128);   
               
            }
            fclose($fp);
         
      
      
       
       
        $fp1 = fopen("C:\AppServ\www\dna\include\counter.txt","a");
      
        if(fwrite($fp1,$message))
        { 
         $xml="";
                  while (!feof($fp1))
                  {
                     $xml .= fgets ($fp1,128);
                     
                  }
              
            fclose($fp1);
      
            
            
        }
      }
      return $x;
}

โดยผมลองส่งแบบในเครื่องตัวเองอ่ะครับ แล้วทดสอบการส่งค่าไป

แล้วอีกหน้าหนึ่งก็ทำการรับค่า post แต่ผมไม่รู้ว่าจะรับค่ายังไงอ่ะครับ ถ้าส่งมาแล้วมันจะมีฟังก์ชั่นอะไรในการรับค่าบ้างครับ


หัวข้อ: Re: เกี่ยวกับการับค่าครับ PHP
เริ่มหัวข้อโดย: oxygenyoyo ที่ 26 กันยายน 2008, 18:51:38
รบกวนชี้แนะหน่อยนะครับ ถ้าผมไม่ได้คำตอบเนี้ยผมอาจจะไม่ได้กลับบ้านอ่า T^T


หัวข้อ: Re: เกี่ยวกับการับค่าครับ PHP
เริ่มหัวข้อโดย: did9 ที่ 26 กันยายน 2008, 19:29:58
หน้าที่รับค่าลอง

var_dump($_POST);

ดูรึยังครับว่า มีค่า post มามั๊ย?


หัวข้อ: Re: เกี่ยวกับการับค่าครับ PHP
เริ่มหัวข้อโดย: oxygenyoyo ที่ 29 กันยายน 2008, 09:39:02
ลองดูแล้วได้ผลอย่างนี้ครับ

array(0) { }

แปลว่าผมส่งตัวแปรไปไม่ได้หรอครับเนี้ย - -'


หัวข้อ: Re: เกี่ยวกับการับค่าครับ PHP
เริ่มหัวข้อโดย: ball6847 ที่ 29 กันยายน 2008, 11:53:58
บอกมะถูก ปกติใช้แต่ curl ที่มันง่ายกว่านี้เยอะ

แต่ลองๆดูประมาณนี้ ได้ยังงัยบอกด้วย

โค๊ด:
<?php

function fsock_parse_url($url) {
$url parse_url($url);
$url['scheme'] = !empty($url['scheme']) && $url['scheme'] == 'https' 'ssl://' '' ;
$url['path'] = !empty($url['path']) ? $url['path'] : '/' ;
$url['path'] .= !empty($url['query']) ? $url['query'] : '' ;
$url['port'] = $url['scheme'] == 'ssl://' 443 80 ;
return $url;
}

function 
fsockpost($url $postdata_assoc $include_header=false $timeout=30) {
extract(fsock_parse_url($url) , EXTR_PREFIX_ALL "fsockpost");
$postdata_assoc http_build_query($postdata_assoc);

if(!$fp = @fsockopen($fsockpost_scheme $fsockpost_host $fsockpost_port $errno $errstr $timeout)) {
echo "FSOCK ERROR : "$errstr;
return false;
}
$header "POST $fsockpost_path HTTP/1.1" "\r\n";
$header .= "Host : $fsockpost_host"\r\n";
$header .= "Content-Type : application/x-www-form-urlencoded" "\r\n";
$header .= "Content-Length : " strlen($postdata_assoc) . "\r\n";
$header .= "Connection : Close" "\r\n\r\n";
$header .= $postdata_assoc;

fputs($fp $header);

while(!feof($fp)) {
$buffer fgets($fp); // catch buffer
if(!empty($is_body)) {
$response_body .= $buffer;
}
elseif(preg_match("|^[\s]*$|" $buffer)) {
$is_body true;
}
else {
$response_header .= $buffer;
}
}

fclose($fp);

return $include_header $response_header $response_body $response_body ;

}


$url "http://domain.com/submit.php";
$postdata['username'] = "admin";
$postdata['password'] = "123456789";

echo 
fsockpost($url,$postdata);

?>

ไม่เข้าใจตรงไหนก็ถามนะ จะได้มีคนที่รู้มาตอบ ผมจะได้เข้ามาอ่านด้วย เพราะผมก้ไม่รู้ แหะๆ  :D


หัวข้อ: Re: เกี่ยวกับการับค่าครับ PHP
เริ่มหัวข้อโดย: oxygenyoyo ที่ 29 กันยายน 2008, 12:09:16
The standard format for the POST method is:
POST <URL> HTTP 1.x <CRLF> [message-body]
All content is URL encoded.


คือเนี้ยอ่ะครับประเด็นที่ผมต้องหาวิธีการส่ง post request http อ่ะครับ

ผมไม่รู้ว่าจะรับค่านี้อย่างไร เค้าให้เอกสารมาบอกแค่นี้อ่ะครับ โดย message-body นั้นจะเป็น xml ซึ่ง

ตอนนี้ผมไม่รู้ว่าจะรับค่านั้นอย่างไรอ่ะครับ ก็เลยลองเขียนจำลองการส่งของเค้ามาอ่ะครับ

ผมอยากทราบว่าถ้าเป็นเืพื่อนๆแล้วจะรับค่าที่เค้าบอกมาแค่นี้อย่างไรอ่ะครับ


หัวข้อ: Re: เกี่ยวกับการับค่าครับ PHP
เริ่มหัวข้อโดย: EThaiZone ที่ 29 กันยายน 2008, 12:54:50
จะส่ง post

ค่า $data ไม่ควรเพียวๆ ครับ

ต้องแนวเช่นจากเดิมสมมุติ
$data = "My text\r\nTest test";

ต้องเป็น

$data = "My text\r\nTest test";
$data = "text=".urlencode($data);

แล้วที่หน้ารับ ก็ของดูค่า $_POST ดู น่าจะเจอ
แล้่วถ้าจะแปลงค่ากลับ ก็ใช้ urldecode

 :)


อธิบายเพิ่ม ที่ผมพูดไปก็คือการส่ง query string
ซึ่งสำหรับ GET เราจะเห็นต่อท้ายจาก ? ใน url
สำหรับ POST เอง ก็ไม่ต่างจาก GET เพียงแต่ค่ามันจะถูกส่งต่อจาก header
ซึ่งเป็นการทำงานในเบื้องหลังของโปรโตคอลนั้นเอง

 :)


หัวข้อ: Re: เกี่ยวกับการับค่าครับ PHP
เริ่มหัวข้อโดย: kero ที่ 29 กันยายน 2008, 13:01:58
The standard format for the POST method is:
POST <URL> HTTP 1.x <CRLF> [message-body]
All content is URL encoded.


คือเนี้ยอ่ะครับประเด็นที่ผมต้องหาวิธีการส่ง post request http อ่ะครับ

ผมไม่รู้ว่าจะรับค่านี้อย่างไร เค้าให้เอกสารมาบอกแค่นี้อ่ะครับ โดย message-body นั้นจะเป็น xml ซึ่ง

ตอนนี้ผมไม่รู้ว่าจะรับค่านั้นอย่างไรอ่ะครับ ก็เลยลองเขียนจำลองการส่งของเค้ามาอ่ะครับ

ผมอยากทราบว่าถ้าเป็นเืพื่อนๆแล้วจะรับค่าที่เค้าบอกมาแค่นี้อย่างไรอ่ะครับ

แค่ต้องการจำลองการส่ง ทำไมไม่ทำหน้า form แล้วส่ง ไม่ง่ายกว่าเหรอครับ  ???

ผมว่า post รับมันง่ายกว่าส่งนะ ไม่ลองเขียนรับของจริงไปเลยล่ะ


หัวข้อ: Re: เกี่ยวกับการับค่าครับ PHP
เริ่มหัวข้อโดย: zo501 ที่ 29 กันยายน 2008, 13:18:47
งงเป็นไก่ตาแตกเลย  :P

ตรงบรรทัดไหน fn รับข้อมูลจาก fsock อะ เห็นมีแต่เขียนข้อมูล

ผมคิดว่าตัวรับเต้องขียนเป็น script รันแบบ deamon เอานะ ไม่งั้นส่งไปแล้วมันไม่รู้หรอกว่าคุณส่งมา




หัวข้อ: Re: เกี่ยวกับการับค่าครับ PHP
เริ่มหัวข้อโดย: oxygenyoyo ที่ 29 กันยายน 2008, 13:24:21
รับของจริง ผมเขียนแล้วไม่มีข้อมูลอะไรมาเลยอ่ะครับ

โค๊ด:
if($GLOBALS['GLOBALS']['HTTP_RAW_POST_DATA']){
$XML_GLOBALS=$GLOBALS['GLOBALS']['HTTP_RAW_POST_DATA'];
}else{
$XML_GLOBALS=$GLOBALS['HTTP_RAW_POST_DATA'];
}


$XML_DATA = $XML_GLOBALS;
//$XML_STR = strstr($XML_DATA,'<?xml');
$XML_STR = addslashes($XML_DATA);

ลอง echo $XML_STR มาก็ไม่มีอะไรเลยอ่ะครับ

โค้ดข้างบนคือหน้ารับข้อมูลอ่ะครับ


หัวข้อ: Re: เกี่ยวกับการับค่าครับ PHP
เริ่มหัวข้อโดย: oxygenyoyo ที่ 29 กันยายน 2008, 13:32:11
อ้างถึง
ผมคิดว่าตัวรับเต้องขียนเป็น script รันแบบ deamon เอานะ ไม่งั้นส่งไปแล้วมันไม่รู้หรอกว่าคุณส่งมา

หมายความว่าไงอ่ะครับ ?


หัวข้อ: Re: เกี่ยวกับการับค่าครับ PHP
เริ่มหัวข้อโดย: EThaiZone ที่ 29 กันยายน 2008, 13:36:35
ลองแบบนี้ละกัน ยังรับค่าไม่ได้ให้เตะหมาข้างบ้าน  :-X

โค๊ด:
echo file_get_contents("php://input");

กรำ แก้ๆ พิมพ์ผิด จะเล่นมุขหมาข้างบ้าน

อันนี้ใช้รับค่าที่ต่อจาก header ล้วนๆ เลย  :P


หัวข้อ: Re: เกี่ยวกับการับค่าครับ PHP
เริ่มหัวข้อโดย: ball6847 ที่ 29 กันยายน 2008, 13:39:01
เอ้อ งง

ทีแรกที่ผมบอกฟังก์ชั่นไป เพราะคิดว่าฟังก์ชั่นที่ท่านใช้มันมีข้อผิดพลาดง่าย อย่างตรง host data หรือ path ผมไม่ทราบว่าท่านใส่ไปยังงัย ทั้ง 3 ตัวแปรใส่ผิดนิดนึงคือไม่ส่งค่าโพสท์ทันทีอ่ะ

ผมเลยเขียนฟังก์ชั่น ให้มันดูง่ายขึ้น แต่ว่ามันผิดจุดประสงค์ของท่านไป ไม่เป็นไร

เอางี้ จากฟังก์ชั่นผมนะ

ไปสร้างไฟล์อีกไฟล์แบบนี้ สมมุตชื่อไฟล์ submit.php

โค๊ด:
<?php

print_r
($_POST)

?>

แล้วลอง fsock เข้าไปแล้วดูว่า response body เป็นยังงัย

อย่างเช่น

โค๊ด:
<?php

// include function before this line

$url "http://domain.com/submit.php";
$postdata['username'] = "admin";
$postdata['password'] = "123456789";

echo 
fsockpost($url,$postdata);


?>

ถ้ามันรับค่าโพสท์จาก fsock ได้ ผลการรันควรจะเป็นแบบนี้

โค๊ด:
Array
(
    [username] => admin
    [password] => 123456789
)



หัวข้อ: Re: เกี่ยวกับการับค่าครับ PHP
เริ่มหัวข้อโดย: ball6847 ที่ 29 กันยายน 2008, 13:47:06
The standard format for the POST method is:
POST <URL> HTTP 1.x <CRLF> [message-body]
All content is URL encoded.


คือเนี้ยอ่ะครับประเด็นที่ผมต้องหาวิธีการส่ง post request http อ่ะครับ

ผมไม่รู้ว่าจะรับค่านี้อย่างไร เค้าให้เอกสารมาบอกแค่นี้อ่ะครับ โดย message-body นั้นจะเป็น xml ซึ่ง

ตอนนี้ผมไม่รู้ว่าจะรับค่านั้นอย่างไรอ่ะครับ ก็เลยลองเขียนจำลองการส่งของเค้ามาอ่ะครับ

ผมอยากทราบว่าถ้าเป็นเืพื่อนๆแล้วจะรับค่าที่เค้าบอกมาแค่นี้อย่างไรอ่ะครับ


เชเช เข้าใจแระ เหมือนจะงง ไม่ใช่จำลองการรับค่า POST METHOD แล้วคับ หลงประเด็นไปไกลเลยทั้งผมด้วย

แต่เป็นการอ่าน xml request มากกว่า เหมือนจะเป็น api อะไรสักอย่างใช่มะ


หัวข้อ: Re: เกี่ยวกับการับค่าครับ PHP
เริ่มหัวข้อโดย: oxygenyoyo ที่ 29 กันยายน 2008, 13:53:01
โค๊ด:
			
if($GLOBALS['GLOBALS']['HTTP_RAW_POST_DATA']){
$XML_GLOBALS=$GLOBALS['GLOBALS']['HTTP_RAW_POST_DATA'];
}else{
$XML_GLOBALS=$GLOBALS['HTTP_RAW_POST_DATA'];
}


ตอนนี้ผมใช้โค้ดข้างบนนี้ก็สามารถรับค่าได้แล้วครับ

ข้างล่างคือ respone ครับ

โค๊ด:
HTTP/1.1 200 OK
Date: Mon, 29 Sep 2008 06:44:30 GMT
Server: Apache/2.2.3 (Win32) PHP/5.1.6
X-Powered-By: PHP/5.1.6
Content-Length: 193
Connection: close
Content-Type: text/html


Array
(
    [1] => <?xml version="1.0" encode="UTF-8"?><status>T</status>
    [value] => <?xml version="1.0" encode="UTF-8"?><status>T</status>
    [0] => 0
    [key] => 0
)
OK INSERT SUCCESS


หัวข้อ: Re: เกี่ยวกับการับค่าครับ PHP
เริ่มหัวข้อโดย: zo501 ที่ 29 กันยายน 2008, 15:17:33
แก้ได้แล้ว  :D ดีใจด้วยครับ  :)