oxygenyoyo
Newbie
พลังน้ำใจ: 0
ออฟไลน์
กระทู้: 9
|
 |
« เมื่อ: 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 แต่ผมไม่รู้ว่าจะรับค่ายังไงอ่ะครับ ถ้าส่งมาแล้วมันจะมีฟังก์ชั่นอะไรในการรับค่าบ้างครับ
|
|
|
บันทึกการเข้า
|
|
|
|
oxygenyoyo
Newbie
พลังน้ำใจ: 0
ออฟไลน์
กระทู้: 9
|
 |
« ตอบ #1 เมื่อ: 26 กันยายน 2008, 18:51:38 » |
|
รบกวนชี้แนะหน่อยนะครับ ถ้าผมไม่ได้คำตอบเนี้ยผมอาจจะไม่ได้กลับบ้านอ่า T^T
|
|
|
บันทึกการเข้า
|
|
|
|
did9
Newbie
พลังน้ำใจ: 2
ออฟไลน์
กระทู้: 68
|
 |
« ตอบ #2 เมื่อ: 26 กันยายน 2008, 19:29:58 » |
|
หน้าที่รับค่าลอง
var_dump($_POST);
ดูรึยังครับว่า มีค่า post มามั๊ย?
|
|
|
บันทึกการเข้า
|
|
|
|
oxygenyoyo
Newbie
พลังน้ำใจ: 0
ออฟไลน์
กระทู้: 9
|
 |
« ตอบ #3 เมื่อ: 29 กันยายน 2008, 09:39:02 » |
|
ลองดูแล้วได้ผลอย่างนี้ครับ
array(0) { }
แปลว่าผมส่งตัวแปรไปไม่ได้หรอครับเนี้ย - -'
|
|
|
บันทึกการเข้า
|
|
|
|
ball6847
เจ้าพ่อบอร์ดเสียว
พลังน้ำใจ: 212
ออฟไลน์
กระทู้: 4,174
|
 |
« ตอบ #4 เมื่อ: 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);
?> ไม่เข้าใจตรงไหนก็ถามนะ จะได้มีคนที่รู้มาตอบ ผมจะได้เข้ามาอ่านด้วย เพราะผมก้ไม่รู้ แหะๆ 
|
|
|
บันทึกการเข้า
|
|
|
|
oxygenyoyo
Newbie
พลังน้ำใจ: 0
ออฟไลน์
กระทู้: 9
|
 |
« ตอบ #5 เมื่อ: 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 ซึ่ง
ตอนนี้ผมไม่รู้ว่าจะรับค่านั้นอย่างไรอ่ะครับ ก็เลยลองเขียนจำลองการส่งของเค้ามาอ่ะครับ
ผมอยากทราบว่าถ้าเป็นเืพื่อนๆแล้วจะรับค่าที่เค้าบอกมาแค่นี้อย่างไรอ่ะครับ
|
|
|
บันทึกการเข้า
|
|
|
|
EThaiZone
เจ้าพ่อโลลิค่อน
เจ้าพ่อบอร์ดเสียว
พลังน้ำใจ: 321
ออฟไลน์
กระทู้: 12,518
|
 |
« ตอบ #6 เมื่อ: 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 ซึ่งเป็นการทำงานในเบื้องหลังของโปรโตคอลนั้นเอง 
|
|
« แก้ไขครั้งสุดท้าย: 29 กันยายน 2008, 12:56:32 โดย EThaiZone »
|
บันทึกการเข้า
|
|
|
|
kero
ก๊วนเสียว
พลังน้ำใจ: 6
ออฟไลน์
กระทู้: 326
|
 |
« ตอบ #7 เมื่อ: 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 รับมันง่ายกว่าส่งนะ ไม่ลองเขียนรับของจริงไปเลยล่ะ
|
|
|
บันทึกการเข้า
|
|
|
|
zo501
สมุนแก๊งเสียว
พลังน้ำใจ: 19
ออฟไลน์
กระทู้: 862
|
 |
« ตอบ #8 เมื่อ: 29 กันยายน 2008, 13:18:47 » |
|
งงเป็นไก่ตาแตกเลย  ตรงบรรทัดไหน fn รับข้อมูลจาก fsock อะ เห็นมีแต่เขียนข้อมูล ผมคิดว่าตัวรับเต้องขียนเป็น script รันแบบ deamon เอานะ ไม่งั้นส่งไปแล้วมันไม่รู้หรอกว่าคุณส่งมา
|
|
|
บันทึกการเข้า
|
|
|
|
oxygenyoyo
Newbie
พลังน้ำใจ: 0
ออฟไลน์
กระทู้: 9
|
 |
« ตอบ #9 เมื่อ: 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 มาก็ไม่มีอะไรเลยอ่ะครับ โค้ดข้างบนคือหน้ารับข้อมูลอ่ะครับ
|
|
|
บันทึกการเข้า
|
|
|
|
oxygenyoyo
Newbie
พลังน้ำใจ: 0
ออฟไลน์
กระทู้: 9
|
 |
« ตอบ #10 เมื่อ: 29 กันยายน 2008, 13:32:11 » |
|
ผมคิดว่าตัวรับเต้องขียนเป็น script รันแบบ deamon เอานะ ไม่งั้นส่งไปแล้วมันไม่รู้หรอกว่าคุณส่งมา หมายความว่าไงอ่ะครับ ?
|
|
|
บันทึกการเข้า
|
|
|
|
EThaiZone
เจ้าพ่อโลลิค่อน
เจ้าพ่อบอร์ดเสียว
พลังน้ำใจ: 321
ออฟไลน์
กระทู้: 12,518
|
 |
« ตอบ #11 เมื่อ: 29 กันยายน 2008, 13:36:35 » |
|
ลองแบบนี้ละกัน ยังรับค่าไม่ได้ให้เตะหมาข้างบ้าน  echo file_get_contents("php://input"); กรำ แก้ๆ พิมพ์ผิด จะเล่นมุขหมาข้างบ้าน อันนี้ใช้รับค่าที่ต่อจาก header ล้วนๆ เลย 
|
|
« แก้ไขครั้งสุดท้าย: 29 กันยายน 2008, 13:41:42 โดย EThaiZone »
|
บันทึกการเข้า
|
|
|
|
ball6847
เจ้าพ่อบอร์ดเสียว
พลังน้ำใจ: 212
ออฟไลน์
กระทู้: 4,174
|
 |
« ตอบ #12 เมื่อ: 29 กันยายน 2008, 13:39:01 » |
|
เอ้อ งง ทีแรกที่ผมบอกฟังก์ชั่นไป เพราะคิดว่าฟังก์ชั่นที่ท่านใช้มันมีข้อผิดพลาดง่าย อย่างตรง host data หรือ path ผมไม่ทราบว่าท่านใส่ไปยังงัย ทั้ง 3 ตัวแปรใส่ผิดนิดนึงคือไม่ส่งค่าโพสท์ทันทีอ่ะ ผมเลยเขียนฟังก์ชั่น ให้มันดูง่ายขึ้น แต่ว่ามันผิดจุดประสงค์ของท่านไป ไม่เป็นไร เอางี้ จากฟังก์ชั่นผมนะ ไปสร้างไฟล์อีกไฟล์แบบนี้ สมมุตชื่อไฟล์ submit.php แล้วลอง 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 )
|
|
|
บันทึกการเข้า
|
|
|
|
ball6847
เจ้าพ่อบอร์ดเสียว
พลังน้ำใจ: 212
ออฟไลน์
กระทู้: 4,174
|
 |
« ตอบ #13 เมื่อ: 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 อะไรสักอย่างใช่มะ
|
|
|
บันทึกการเข้า
|
|
|
|
oxygenyoyo
Newbie
พลังน้ำใจ: 0
ออฟไลน์
กระทู้: 9
|
 |
« ตอบ #14 เมื่อ: 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
|
|
|
บันทึกการเข้า
|
|
|
|
zo501
สมุนแก๊งเสียว
พลังน้ำใจ: 19
ออฟไลน์
กระทู้: 862
|
 |
« ตอบ #15 เมื่อ: 29 กันยายน 2008, 15:17:33 » |
|
แก้ได้แล้ว  ดีใจด้วยครับ 
|
|
|
บันทึกการเข้า
|
|
|
|
|