Avatar billede cyberdude Nybegynder
23. oktober 2006 - 16:10 Der er 18 kommentarer og
1 løsning

find bestemt værdi i en variabel

Hejsa

Jeg alver et fopen(...) kald for at få nogle værdier retur fra et eksternt system (paypal - tjek på om en betaling blev gennemført, og i givet fald hvem der gennemførte det, så vedkommendes "konto" kan opdateres...)

Det der kommer retur bliver "kastet" ind i variablen $split]0] via følgende kode :
while ($line = fgets($file, 4096)) {
    // do something with the file
$split = split( "\nl", $line);
echo "$split[0]<br>";
}
og indholdet af $split[0] ser nogenlunde sådant her ud :
SUCCESS
* mc_gross=5.00
address_status=unconfirmed
payer_id=69FZ57Y6YHT7Y
tax=0.00
address_street=tester
* payment_date=06%3A52%3A58+Oct+23%2C+2006+PDT
payment_status=Pending
charset=windows-1252
address_zip=9999
first_name=tester
address_country_code=DK
address_name=tester+tester
custom=
payer_status=unverified
business=owner%40dom.tld
address_country=Denmark
address_city=min_city
quantity=1
* payer_email=sender%40dom.tld
txn_id=3PD71351H09358136
payment_type=instant
last_name=tester
address_state=
receiver_email=reciver%40dom.tld
receiver_id=YD499XMW7BTZN
pending_reason=multi_currency
txn_type=web_accept
* item_name=cv+online
mc_currency=GBP
* item_number=1
residence_country=DK
payment_gross=

De linier der er makeret med en "*" vil jeg på en eller anden måde genre have så jeg kan tilgå dem via eks. $myvar[0], $myvar[1], osv...

Men kan ikek få det vendt i praksis så det funger :-(

Nogen hjælp at hente ?
Avatar billede jakobdo Ekspert
23. oktober 2006 - 17:53 #1
Prøv noget i stil med:
if (preg_match('/SUCCESS.*mc_gross=(\\d+\\.\\d+).*payment_date=(.*?)\\r\\n.*payer_email=(.*?)\\r\\n.*item_name=(.*?)\\r\\n.*item_number=(\\d+)/s', $data_from_paypal, $myVar))
{
    echo '<pre>';
    echo print_r($myVar);
    echo '</pre>';
}
Avatar billede cyberdude Nybegynder
24. oktober 2006 - 16:02 #2
Hejsa

Det ser ikke ud til at fungere, dog kan jeg se i min kode at de postededata, IKKE kommer på hver sin linie, (kun fordi jeg havede en <br> i en while lykke", men istedet kommer ind og opsamles i variablen $file og ser sådant her ud :
SUCCESS mc_gross=5.00 address_status=unconfirmed payer_id=69FZ57Y6YHT7Y tax=0.00 address_street=tester payment_date=06%3A59%3A40+Oct+24%2C+2006+PDT payment_status=Pending charset=windows-1252 address_zip=9370 first_name=tester address_country_code=DK address_name=tester+tester custom= payer_status=unverified business=sonny%40ddpnet.dk address_country=Denmark address_city=hals quantity=1 payer_email=sonny1%40ddpnet.dk txn_id=2MH099097Y417960H payment_type=instant last_name=tester address_state= receiver_email=sonny%40ddpnet.dk receiver_id=YD499XMW7BTZN pending_reason=multi_currency txn_type=web_accept item_name=cv+online mc_currency=GBP item_number=1 residence_country=DK payment_gross= shipping=0.00

Så problemet skyldes sikkert at dit script ikke fodres med de data det forventer... ?
Avatar billede jakobdo Ekspert
24. oktober 2006 - 16:12 #3
Prøv at ret \\r\\n til \\s
Avatar billede cyberdude Nybegynder
24. oktober 2006 - 16:22 #4
funger heller ikke...

Koden ser nu sådant her ud :

$file2 = "SUCCESSmc_gross=5.00address_status=unconfirmedpayer_id=69FZ57Y6YHT7Ytax=0.00address_street=testerpayment_date=06%3A45%3A30+Oct+24%2C+2006+PDTpayment_status=Pendingcharset=windows-1252address_zip=9370first_name=testeraddress_country_code=DKaddress_name=tester+testercustom=payer_status=unverifiedbusiness=sonny%40ddpnet.dkaddress_country=Denmarkaddress_city=halsquantity=1payer_email=sonny1%40ddpnet.dktxn_id=9T481048CD560644Tpayment_type=instantlast_name=testeraddress_state=receiver_email=sonny%40ddpnet.dkreceiver_id=YD499XMW7BTZNpending_reason=multi_currencytxn_type=web_acceptitem_name=cv+onlinemc_currency=GBPitem_number=1residence_country=DKpayment_gross=shipping=0.00";
if (preg_match('/SUCCESS.*mc_gross=(\\d+\\.\\d+).*payment_date=(.*?)\\s.*payer_email=(.*?)\\s.*item_name=(.*?)\\s.*item_number=(\\d+)/s', $file2, $myVar))
{
    echo '<pre>';
    echo print_r($myVar);
    echo '</pre>';
}
Avatar billede jakobdo Ekspert
24. oktober 2006 - 17:43 #5
Prøv koden her:

<?php
//http://www.eksperten.dk/spm/740314

$file2 = "SUCCESS mc_gross=5.00 address_status=unconfirmed payer_id=69FZ57Y6YHT7Y tax=0.00 address_street=tester payment_date=06%3A59%3A40+Oct+24%2C+2006+PDT payment_status=Pending charset=windows-1252 address_zip=9370 first_name=tester address_country_code=DK address_name=tester+tester custom= payer_status=unverified business=sonny%40ddpnet.dk address_country=Denmark address_city=hals quantity=1 payer_email=sonny1%40ddpnet.dk txn_id=2MH099097Y417960H payment_type=instant last_name=tester address_state= receiver_email=sonny%40ddpnet.dk receiver_id=YD499XMW7BTZN pending_reason=multi_currency txn_type=web_accept item_name=cv+online mc_currency=GBP item_number=1 residence_country=DK payment_gross= shipping=0.00";
if (preg_match('/SUCCESS.*mc_gross=(\\d+\\.\\d+)\\s.*payment_date=(.+?)\\s.*payer_email=(.+?)\\s.*item_name=(.+?)\\s.*item_number=(\\d+)\\s/', $file2, $myVar))
{
    echo '<pre>';
    print_r($myVar);
    echo '</pre>';
}

?>

I dit indlæg fra: 24/10-2006 16:02:37 har du spaces mellem hvert "felt".
I din kode fra: 24/10-2006 16:22:17 har du ikke spaces mellem.
Vi skal være sikre på vi arbejder på den korrekte data, ellers virker min kode ikke! :o)
Avatar billede cyberdude Nybegynder
25. oktober 2006 - 17:01 #6
underligt...

Hvis jeg tager din kode og kopiere direkte ind i et tomt dokument virker det...
Men tager jeg kun fra if (.... så funger det ikke

her er hele kodestumpen jeg bruger

// get info about the payment from PayPal
// forespørger på om man modtager en tx variabel retur fra paypal
if ($_GET['tx']) {
$be = new BrowserEmulator();
$be->addHeaderLine("Referer", "http://liftjobsonline.com/");
$be->addHeaderLine("Accept-Encoding", "x-compress; x-zip");
// also possible:
$be->setPort(80);
$file = $be->fopen("https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_notify-synch&tx=$tx&at=v2NEe5lGeOEIae3CSRbhQ3wvB7mV8wTZOvigTELM3FwLMoyttHc58gM9HlS");
$response = $be->getLastResponseHeaders();
hvis nedenstående echo skriver blot "Resource id #12"
// echo "$file<br>";

while ($line = fgets($file, 4096)) {
    // do something with the file

// denne echo udskriver de data der kan ses ved * makering længere nede
echo "$line";


if (preg_match('/SUCCESS.*mc_gross=(\\d+\\.\\d+)\\s.*payment_date=(.+?)\\s.*payer_email=(.+?)\\s.*item_name=(.+?)\\s.*item_number=(\\d+)\\s/', $line, $myVar))
{
    echo '<pre>';
    print_r($myVar);
    echo '</pre>';
}
}

}

*
SUCCESS mc_gross=5.00 address_status=unconfirmed payer_id=69FZ57Y6YHT7Y tax=0.00 address_street=tester payment_date=07%3A59%3A21+Oct+25%2C+2006+PDT payment_status=Pending charset=windows-1252 address_zip=9370 first_name=tester address_country_code=DK address_name=tester+tester custom= payer_status=unverified business=sonny%40ddpnet.dk address_country=Denmark address_city=hals quantity=1 payer_email=sonny1%40ddpnet.dk txn_id=26W28776WS6184624 payment_type=instant last_name=tester address_state= receiver_email=sonny%40ddpnet.dk receiver_id=YD499XMW7BTZN pending_reason=multi_currency txn_type=web_accept item_name=cv+online mc_currency=GBP item_number=1 residence_country=DK payment_gross= shipping=0.00

Som jeg ser det så er data i $line de samme som i $file2 fra dit eks. - altså med mellemrum, men forskellen er at data ikke vises :-(
Avatar billede cyberdude Nybegynder
25. oktober 2006 - 17:04 #7
sætter jeg din if (... kode uden for while lykken er der heller intet resultat...
Avatar billede cyberdude Nybegynder
25. oktober 2006 - 17:11 #8
screen shot af hvordan data ser ud kan ses her :
http://www.gonzzo.dk/exp/740314/pre.jpg

koden der generere dette er den her :
// get info about the payment from PayPal
if ($_GET['tx']) {
$be = new BrowserEmulator();
$be->addHeaderLine("Referer", "http://liftjobsonline.com/");
$be->addHeaderLine("Accept-Encoding", "x-compress; x-zip");
// also possible:
$be->setPort(80);
$file = $be->fopen("https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_notify-synch&tx=$tx&at=v2NEe5lGeOEIae3CSRbhQ3wvB7mV8wTZOvigTELM3FwLMoyttHc58gM9HlS");
$response = $be->getLastResponseHeaders();
echo "$file<br>";

while ($line = fgets($file, 4096)) {
    // do something with the file


echo "$line";
}
}

if (preg_match('/SUCCESS.*mc_gross=(\\d+\\.\\d+)\\s.*payment_date=(.+?)\\s.*payer_email=(.+?)\\s.*item_name=(.+?)\\s.*item_number=(\\d+)\\s/', $line, $myVar))
{
    echo '<pre>';
    print_r($myVar);
    echo '</pre>';
}

Håber det kan hjælpe lidt mere...
Avatar billede jakobdo Ekspert
25. oktober 2006 - 18:35 #9
Det er lidt svært at kode mod noget data som du ikke kan giver mig korrekt.
Men du må jo evt. starte fra bunden.
Så må du prøve at udskrive $line efter dine while{}, indeholder den alle data?
Avatar billede cyberdude Nybegynder
26. oktober 2006 - 15:06 #10
hvis jeg laver en echo på $line EFTER while{} kommer der ingen data ud...
Avatar billede cyberdude Nybegynder
26. oktober 2006 - 15:10 #11
og laver jeg en echo på $file FØR while lykken indeholder den "Resource id #12"

Har forsøgt at få dataen splittet op efter hver "line break" og det har så fint givet mig alle data på hver sin linie, men stadig i samme variable ($line[0]) .-(
Avatar billede cyberdude Nybegynder
26. oktober 2006 - 16:10 #12
øhh har lige opdaget et lidt mystisk problem...

while ($line = fgets($file, 4096)) {
    // do something with the file


echo "$line[0]<br>";
echo "$line[1]<br>";
}

$line[0] udskriver første bogstav i HVER af "variablerne"
$line[1] udskriver andet karakter i HVER af "variablerne"
osv....

Hvordan kan det nu lige lade sig gøre.. ?
Avatar billede cyberdude Nybegynder
26. oktober 2006 - 16:55 #13
okay, har nu fået styr på koden der gives retur!

scriptet ser nu sådant her ud :

if ($_GET['tx']) {
$be = new BrowserEmulator();
$be->addHeaderLine("Referer", "http://liftjobsonline.com/");
$be->addHeaderLine("Accept-Encoding", "x-compress; x-zip");
// also possible:
$be->setPort(80);
$file = $be->fopen("https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_notify-synch&tx=$tx&at=v2NEe5lGeOEIae3CSRbhQ3wvB7mV8wTZOvigTELM3FwLMoyttHc58gM9HlS");
$response = $be->getLastResponseHeaders();

$i = 0;
while ($line[$i] = fgets($file, 4096)) {
echo "linie $i = $line[$i]<br>";
$i++;
}


}

og resultatet er sådant her :
linie 0 = SUCCESS
linie 1 = mc_gross=5.00
linie 2 = address_status=unconfirmed
linie 3 = payer_id=69FZ57Y6YHT7Y
linie 4 = tax=0.00
linie 5 = address_street=tester
linie 6 = payment_date=07%3A49%3A51+Oct+26%2C+2006+PDT
linie 7 = payment_status=Pending
linie 8 = charset=windows-1252
linie 9 = address_zip=9370
linie 10 = first_name=tester
linie 11 = address_country_code=DK
linie 12 = address_name=tester+tester
linie 13 = custom=
linie 14 = payer_status=unverified
linie 15 = business=sonny%40ddpnet.dk
linie 16 = address_country=Denmark
linie 17 = address_city=hals
linie 18 = quantity=1
linie 19 = payer_email=sonny1%40ddpnet.dk
linie 20 = txn_id=3F9607990S691612F
linie 21 = payment_type=instant
linie 22 = last_name=tester
linie 23 = address_state=
linie 24 = receiver_email=sonny%40ddpnet.dk
linie 25 = receiver_id=YD499XMW7BTZN
linie 26 = pending_reason=multi_currency
linie 27 = txn_type=web_accept
linie 28 = item_name=cv+online
linie 29 = mc_currency=GBP
linie 30 = item_number=1
linie 31 = residence_country=DK
linie 32 = payment_gross=
linie 33 = shipping=0.00

så det jeg skal bruge er det der står EFTER = i følgende linier :
2,3,6,15,19,28

Eller gerne så man kan lave en echo "$myvar[0]" - altså der oprttes resultatet i et array for ALLE ovenstående variabler....

Kan bare ikke helt forstå hvorfor det ikke er lykkedes for os at bruge dataene direkte, uden først at splitte dem op i et array....
Avatar billede cyberdude Nybegynder
26. oktober 2006 - 16:56 #14
sluder det er linie : 0,1,3,6,7,19,28 der skal bruges
Avatar billede jakobdo Ekspert
26. oktober 2006 - 19:27 #15
denne vil give dig det som står efter =
if (preg_match('/=(.+)/', $line[$i], $regs))

Den vil så ikke kunne tjekke om der står SUCCESS i $linie[0]
Avatar billede cyberdude Nybegynder
28. oktober 2006 - 16:46 #16
med denne sammensatte kode

$i = 0;
while ($line[$i] = fgets($file, 4096)) {
if (preg_match('/=(.+)/', $line[$i], $regs)){
echo "$regs[$i]<br>";
$i++;
}
}


udskrives der kun "5.00" - hvilket er beløbet der er betalt, og intet andet...

Skal det sammensættes anderledes ?
Avatar billede cyberdude Nybegynder
29. oktober 2006 - 12:36 #17
jakobdo -> smid et svar, har endelig fået de data jeg skal bruge - det var ikek gået uden dine utallige preg_match segmenger :-)

Endelig kode blev den her :

$i = 0;
while ($line[$i] = fgets($file, 4096)) {
if($i == '1' || $i == '3' || $i == '6' || $i == '7' || $i == '19' || $i == '28') {
if (preg_match('/=(.+)/', $line[$i], $regs)) {
$regs[1] = urldecode($regs[1]);
echo "$regs[1]<br>";
}
}
$i++;
}

resultatet ser nu sådant her ud :
5.00
69FZ57Y6YHT7Y
03:31:28 Oct 29, 2006 PST
Pending
my@email.tld
cv online


Tak for hjælpen!
Avatar billede jakobdo Ekspert
29. oktober 2006 - 14:13 #18
Svar!
Avatar billede jakobdo Ekspert
30. oktober 2006 - 17:50 #19
Takker for point.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester