WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   str_replace fungerar inte som jag vill (https://www.wn.se/forum/showthread.php?t=1054307)

jonssondesign 2012-07-28 03:48

str_replace fungerar inte som jag vill
 
Hejsan. Sitter med str_replace(), men blir inte som jag vill..

Jag har en xml fil som jag hämtar data från, bla. en url.

url'en är med å ä ö, vilket gör att jag inte kan använda simplehtmldom..

Så jag tänkte att jag skulle försöka byta ut å, ä, ö till %C3%A5, %C3%A4, %C3%B6.. Men får inte till det riktigt..hm

PHP-kod:

$real_url $xml->product->advertiserProductUrl;
            
$org_url  "$real_url";
$search_url = array("å""ä""ö");
$replace_url = array("%C3%A5""%C3%A4""%C3%B6");
            
$new_url str_replace($search_url$replace_url$org_url);
            
echo 
$new_url "<br>";
echo 
$real_url

Jag får ut båda två variablarna, men båda innehåller fortfarande åä och ö..
Jag är medveten om att $real_url alltid kommer att innehålla å ä ö, men jag vill ju att $new_url ska bli utan å ä ö, och istället innehålla de tecknen jag angivit i str_replace skriptet..
http://nelly.com/se/kläder-för-kvinn...top-676373-99/
Det där är url'en som jag vill ha omgjord, men går inte för mig :P

Någon med förslag?

PS. om jag skriver url'en för hand istället för att hämta ut den från XML filen, då blir det rätt.

alltså:

PHP-kod:

$real_url "http://nelly.com/se/kläder-för-kvinnor/sportkläder/sport-bh/filippa-k-soft-sport-2123/yoga-bra-top-676373-99/";
            
$org_url  "$real_url";
$search_url = array("å""ä""ö");
$replace_url = array("%C3%A5""%C3%A4""%C3%B6");
            
$new_url str_replace($search_url$replace_url$org_url);
            
echo 
$new_url "<br>";
echo 
$real_url

någon som fattar? :P

tack

jayzee 2012-07-28 09:03

PHP-kod:

$real_url "http://nelly.com/se/kläder-för-kvinnor/sportkläder/sport-bh/filippa-k-soft-sport-2123/yoga-bra-top-676373-99/";
$new_url urlencode($real_url);

// $new_url: http://nelly.com/se/kl%C3%A4der-f%C3%B6r-kvinnor/sportkl%C3%A4der/sport-bh/filippa-k-soft-sport-2123/yoga-bra-top-676373-99/ 


jonssondesign 2012-07-28 12:37

Smart, men fungerade inte riktigt..hm

Får felmeddelande:
Warning: file_get_contents(http%3A%2F%2Fnelly.com%2Fse%2Fkl %C3%A4der-f%C3%B6r-kvinnor%2Fsportkl%C3%A4der%2Ftr%C3%B6jor%2Froxy-169%2Fbeach-brights-zipper-169086-54%2F) [function.file-get-contents]: failed to open stream: No such file or directory in C:\Program Files\xampp\htdocs\reaplagg\admin\includes\simple_ html_dom.php on line 70

Fatal error: Call to a member function find() on a non-object in C:\Program Files\xampp\htdocs\reaplagg\admin\includes\functio ns.php on line 109
Det verkar fungera bra om jag skriver url'en manuellt. såhär:

echo getOrgPrice('http://nelly.com/se/kläder-för-kvinnor/sportkläder/sport-bh/filippa-k-soft-sport-2123/yoga-bra-top-676373-99/');

Men så fort jag använder en variabel istället för klartext så fungerar det inte :S

såhär ser det ut med en variabel:

echo getOrgPrice($new_url);


Använder jag urlencode() runt $real_url och lägger in det i $new_url så blir det felmeddelande.
Använder jag $real_url direkt i funktionen istället för $new_url, så händer ingenting.. Inga felmeddelanden, men inga siffror syns heller.. hm.

Såhär ser min funktion ut:

PHP-kod:

include_once('includes/simple_html_dom.php');
function 
getOrgPrice($url) {

    
$original_url  $url;
    
$delete_url = array("å","ä""ö");
    
$replace_url   = array("%C3%A5""%C3%A4""%C3%B6");
    
$new_url str_replace($delete_url$replace_url$original_url);
    
    
$html file_get_html($new_url);
                        
    
$ret $html->find('p[class=productOverview_items_content_itemlist_item_reaprice_price] span');
                           
    foreach(
$ret as $k=>$v) {
                           
        
$original_string  $v;
        
$delete_string = array("<span style=\"text-decoration:line-through;\">SEK ","</span>");
        
$replace_with   = array("""");
        
$new_string str_replace($delete_string$replace_with$original_string);
                                   
        return 
$new_string;
    };



Droog 2012-07-28 12:43

Du ska inte URL-encoda "http://"

jonssondesign 2012-07-28 12:46

Är det det som gör att min kod failar.. hm.
Ska testa detta!

Kommer säkert göra något jävligt onödigt nu :P Men återkommer!

jonssondesign 2012-07-28 12:57

Nu fungerar det.. Men jag kanske är onödig i min kod? Ser ni om jag kanske kan städa upp på något sätt? :P

PHP-kod:

$xml_url mysql_real_escape_string($_POST['xml_url']);
$xml simplexml_load_file($xml_url);
            
$message 1;

$real_url $xml->product->advertiserProductUrl;
//http://nelly.com/se/kläder-för-kvinnor/sportkläder/sport-bh/filippa-k-soft-sport-2123/yoga-bra-top-676373-99/

$original_url  $real_url;
$delete_url = array("http://");
$replace_url   = array("");
$new_url_without str_replace($delete_url$replace_url$original_url);
//nelly.com/se/kläder-för-kvinnor/sportkläder/sport-bh/filippa-k-soft-sport-2123/yoga-bra-top-676373-99/

$new_url urlencode($new_url_without);
//nelly.com%2Fse%2Fkl%C3%A4der-f%C3%B6r-kvinnor%2Fsportkl%C3%A4der%2Fsport-bh%2Ffilippa-k-soft-sport-2123%2Fyoga-bra-top-676373-99%2F

$original_url  $new_url;
$delete_url = array("%2F");
$replace_url   = array("/");
$new_url_function str_replace($delete_url$replace_url$original_url);
//nelly.com/se/kl%C3%A4der-f%C3%B6r-kvinnor/sportkl%C3%A4der/sport-bh/filippa-k-soft-sport-2123/yoga-bra-top-676373-99/


$function_url "http://" $new_url_function;
//http://nelly.com/se/kl%C3%A4der-f%C3%B6r-kvinnor/sportkl%C3%A4der/sport-bh/filippa-k-soft-sport-2123/yoga-bra-top-676373-99/

echo $function_url "<br>";
echo 
$real_url "<br>";
echo 
getOrgPrice($function_url); 


P3N 2012-07-28 13:21

För att ta bort "http://" hade jag använt substr istället --> http://php.net/manual/en/function.substr.php

Edit: substr_replace borde passa det du behöver perfekt --> http://www.php.net/manual/en/functio...tr-replace.php

jonssondesign 2012-07-28 14:12

Använder nu substr för http, fungerade fint.

Förstår mig dock inte på substr_replace.. jag är en nybörjare inom php tyvärr.

P3N 2012-07-28 14:50

Jag hade fel om "substr_replace". Den byter bara ut på fasta positioner i strängen som man anger. Fick för mig att den kunde köra replace inom ett visst område ifall det blir "träff" men så var det ju inte.
Men "substr" är användbart till detta iallafall :)

jonssondesign 2012-07-28 15:00

Japp tack!! :)

Det ända jobbiga nu är att, det tar typ en timme att hämta datan från nellys sida till varje produkt, eftersom att det är typ, 2000 produkter (minst).. haha

Men men, vill man ha det på bästa sätt för sina användare, så får man stå ut med väntetiden.. Man kanske kan göra som så att, man hämtar all data från xml filen först, och sätter in det i databasen.

sen i en kolumn har man typ "ny" med en 0a eller 1a.

0 = produkten fanns redan i databasen
1 = produkten är ny

så första gången man kör skriptet så är alla produkter nya.
nästa vecka när man uppdaterar databasen så gör man om alla produkter till 0, och om en produkt som finns i xml redan finns i databasen så stannar 0a kvar.

om en produkt finns i xml filen men inte i databasen så får den en 1a.

sen när uppdateringen är klar så körs scrapingen på alla produkter med en 1a.
då slipper man scrapa på alla produkter som faktiskt redan har original priset.. :)

viktigt dock kanske att, alla som har en 1a i kolumnen "ny" har en 0a i kolumen "visible".
Hämtar nämligen ut alla prudkter med visibile = 1
och när scrapingen är klar, så sätts visible = 1 :)

ajaa, får sitta och laborera osv :P Jag är rätt ny inom php som sagt, så detta projekt är till för att lära mig mest :P

tack för all hjälp!

jonssondesign 2012-07-29 03:17

Okej, jag märker att det tar drygt en halvtimme att uppdatera databasen per butik. (första gången man lägger in produkterna). Jag gissar dock på att det tar drygt 5 min per butik i framtiden, beroende på hur många nya produkter som läggs in i xml filen som är användbara för min site.

Jag funderar nu på hur man kan lösa detta för användaren, för när jag gör en uppdatering så påverkas ju databasen, vilket gör att det inte går att komma åt sidan pga laddtiden under uppdateringen.

Hur ska jag då göra?

Kanske skulle man göra som så att, när man börjar uppdateringen, så trycker man på en knapp som lägger in en 1 eller 0 i en tabell i databasen. Så när man kliver in på sidan så kollar sidan om det är en 1 eller 0a i kolumnen.

1 = pågående uppdatering
0 = ingen pågående uppdatering

är det en etta, så visas en sida med information om att uppdatering pågår, och att vi beräknar att vara klara inom 30min osv.

är den en nolla, så kliver man raka vägen in på sidan.

Det jag funderar över nu dock är, hur tusan ska man lösa detta, eftersom att databasen är ju belastad under tiden som uppdateringen görs, vilket gör att sidan inte kan kolla om den är under uppdatering eller ej.

Några tips?

Yllas 2012-07-29 09:32

Kör uppdateringen på en annan server och puscha över informationen till besökarservern när den är klar?!

jonssondesign 2012-07-29 13:06

HA! Smart ;) Jag kör på det!

Tack :)

förresten, jag använder mig av xampp i dagsläget som utvecklingsmiljö, och som jag kan förstå det så går det inte att ha fler databaser?
Hur tycker ni att jag ska kolla om jag gör rätt om jag går utifrån Yllas tips?

Kekke 2012-07-29 13:13

Citat:

Ursprungligen postat av jonssondesign (Inlägg 20445880)
HA! Smart ;) Jag kör på det!

Tack :)

förresten, jag använder mig av xampp i dagsläget som utvecklingsmiljö, och som jag kan förstå det så går det inte att ha fler databaser?
Hur tycker ni att jag ska kolla om jag gör rätt om jag går utifrån Yllas tips?

Jo självklart går det att ha flera databaser i mysql.
Logga in på phpmyadmin och tryck på Databaserna så kan du skapa fler där.

http://honungsburk.se/honung/7e06e66...3df18f9543.png

jonssondesign 2012-07-29 13:46

aa sorry, tänkte inte på vad jag skrev. Jo jag vet att man kan skapa nya databaser, men det jag menade var egentligen att ha två olika servar lixom.

Jag menar, om jag sitter och pumpar in produkter i en "DATABAS" så kommer väl hela systemet att bli långsamt? Så det spelar väl ingen roll om jag sitter och uppdaterar en databas, och sen försöker komma åt en annan. Det kommer fortfarande bli långsamt, right?

jonssondesign 2012-07-29 13:51

Eller hm. Det verkar som om att sidor som ligger på andra databaser inte blir drabbade när jag uppdaterar min produktlista..

Jag tänkte mig lixom att hela mysql-systemet skulle bli långsamt... :)

jonssondesign 2012-07-29 16:32

hmm.. Mitt script crashade nyss.

mitt under en uppdatering så fick jag ett erorr som lyder:

Citat:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' new = 0, visible = 1 WHERE id = 23755' at line 1
Såhär ser min update query ut:

PHP-kod:

$query "UPDATE products SET org_price = $org_price, new = 0, visible = 1 WHERE id = $id";
$insert mysql_query($query) or die (mysql_error()); 

Jag kan inte se att det är några problem med den? :S

Såhär ser det ut i min databas. Som ni ser så har det flytit på tills just denna, där det tog stopp...

http://bywatt.com/db_screenshot.jpg

Någon som vet vad problemet är?

jonssondesign 2012-07-30 00:13

Någon som har haft tid att kolla på problemet än? Jag får det iaf inte att fungera igen :S

Kekke 2012-07-30 01:01

Antagligen är new ett reserverat ord i mysql, testa att sätt ` runt det.

Såhär:

PHP-kod:


$query 
"UPDATE products SET org_price = $org_price, `new` = 0, visible = 1 WHERE id = $id"


jonssondesign 2012-07-30 01:09

Okej, jag får testa detta! Tack! :)

konstigt att den klarade att lägga in typ 1000 produkter innan den fick för sig att inte fungera längre..:P

Kekke 2012-07-30 01:10

Då är det antagligen inte det, kolla om du får någon fel data i $org_price istället. (skriv ut det)

jonssondesign 2012-07-30 02:13

Helt rätt. Produkten var slut på nellys sida.. suck! och jag kommer inte åt tradedoubler, eller rättare sagt, jag kan inte logga in (står bara och laddar..), så jag kan inte skapa en ny xml fil.. hm.

Smart tänkt förresten! Tack för lösningen :)

jonssondesign 2012-07-30 03:02

Hur kommer det sig att, data som jag hämtar från xml inte går att jämföra med någonting annat om datan innehåller åä eller ö?

säg att jag vill ta bort utesluta vissa produkter som innefattar en speciell kategori, säg Underkläder..

Kör jag då en fråga om $category är lika med "Underkläder" så fungerar det inte. Kör jag dock samma fråga med med Linnen istället, då fungerar det utmärkt?

Har testat med alla olika kategorier som inkluderar åä eller ö. Fungerar inte någon av dem..
Har testat många kategorier utan åäö då fungerar det fin fint.

Någon som vet varför, och vad jag kan göra? :)

EDIT: har även testat med att ändra å ä och ö i frågan till html tecken (ex. &ouml; för ö, osv.).. Fungerar ändå inte.
Jag har <?xml version="1.0" encoding="UTF-8"?> längst upp i xml filen...

jonssondesign 2012-07-30 17:08

Nepp, fattar inte hur jag ska göra! Någon som orkar lägga sig i mitt problem och berätta vad jag kan testa för att lösa mitt eländiga problem..? :)

Jake.Nu 2012-07-30 18:00

Kanske missat det tidigare i tråden.. men var kommer xml-filen ifrån?
Vad har den för teckenkodning i (encoding="xx")? Vad har scriptet som hämtar filen för teckenkodning? Känns som det kan vara en salig blandning här och där..

jonssondesign 2012-07-30 20:45

ooh. Det tänkte jag inte riktigt på. Ska kolla!

jonssondesign 2012-07-30 20:51

I header.php har jag:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="language" content="sv">
<meta http-equiv="content-language" content="sv-se">

I xml filen har jag:

<?xml version="1.0" encoding="UTF-8"?>

hmm, däremot så, om jag skriver å ä ö direkt i php filen, så får jag inte fram åäö, utan bara ett frågetecken "�"... Antar att filen inte är sparad i rätt format? Frågan är, hur gör jag det?

jonssondesign 2012-07-30 20:58

Japp, fixade nu! Gjorde bara en ny fil med rätt encode, kopierade över existerande kod till den nya filen och sparade över den gamla filen. Nu fungerar det felfritt! Tack!

Vad skulle man göra utan generösa medmänniskor? :D

jonssondesign 2012-07-31 02:10

Sitter som sagt och lär mig lite php, även fast jag är designer i grunden (arbetar som chefsansvarig applikationsdesigner vanligt vis), men det är kul med programmering också :)

Håller på, som ni kanske vet, och skapar en sida, som tyvärr stött på problem lite då och då, men som tur är så finns ni hjälpsamma människor som hjältar i nöden! :)

Jag har lite frågor ang. inloggning till adminpanelen.
Tänker på säkerheten osv.

Inloggningen är en väldigt basic inlogging. Kollar om alla fält är ifyllda osv, jämför inmatade uppgifter mot databasen osv. Lösenorden är självklart hashade, men med sha1. Är det okej? Eller är det en dålig hashning som är lätt att knäcka?
Bör jag tänka på något annat?

Försöker man komma åt någon sida på admin-panelen så kollar alla sidor om man har ett session fält ifyllt, och om så är fallet så visas sidan, annars blir man skickad till inloggningssidan. Är det okej? fältet innehåller dock bara en siffra (1)? Bör man kanske ha något annat, mer krångligt (tänker på om någon listar ut vad fältet heter, och skapar sin egna session med en 1a i, fast det kanske inte går?)?

Några tips om säkerhet osv? :)

mvh,

jonssondesign 2012-07-31 04:37

Någon som ser varför tusan alla produkter som läggs in (likaså nya som uppdaterade) får sitt värde i kolumnen "fresh" till 0? Jag vill ha alla nyatillagda och uppdaterade produkter till 1, och alla som inte vart uppdaterade eller lades till nyligen ska ha en 0a..

Ser inte problemt... Kanske trött?

PHP-kod:

$query "UPDATE products SET fresh = 0";
$update mysql_query($query);
                
$query "INSERT INTO products (img, title, brand, store, price, org_price, url, added, category, gender, visible, info, clicks, advertiserProductUrl, fresh) VALUES ";
$query .= "('$prel_img', '$prel_title', '$prel_brand', '$prel_store', $prel_price$prel_org_price, '$prel_url', '$rel_added', '$prel_category', '$prel_gender', $rel_visible, '$prel_info', $rel_clicks, '$prel_advertiserProductUrl', 1) ";
$query .= "ON DUPLICATE KEY UPDATE fresh = 1";
$insert mysql_query($query) or die (mysql_error()); 


jonssondesign 2012-07-31 11:57

Okej jag kom på problemet myself.

Som ni ser så använder jag
PHP-kod:

$query "UPDATE products SET fresh = 0"
$update mysql_query($query); 

som uppdaterar hela produktlistans alla "fresh" kolumner till 0. Fine, det var så jag ville ha det, men jag tänkte mig inte för när jag la in denna uppdatering I SAMMA LOOP som INSERT queryn.. haha

Så nu när jag vaknade märkte jag mitt misstag direkt.. Flyttade bara ut UPDATE-queryn utanför loopen (innan loopen såklart), och nu fungerar det felfritt :) GREAT!


Alla tider är GMT +2. Klockan är nu 01:55.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson