Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1
Witam! Mam taką sytuację że zaczytuje sobie dane do funkcji str_replace np:
$BUFFERR = str_replace("'", "", "jakies tam dane ' ' dalsze dane ");
echo $BUFFER;
No i tu jest sytuacja OK! Ponieważ jak widać zamieniam wszystkie ' na pusty znak
czyli nie przeszkadza skryptowi to że w tekście - jakies tam dane ' ' dalsze dane są zawarte -> '
Ale zna ktoś jakieś mądre wyjście z sytuacji gdzie w takim tekście zawarty był by także cudzysłów???
czyli np:
jakies tam "dane ' ' "dalsze dane
???
( bo wiadomo że znaki które chce zamienić na te które zamieniam zawieram w " lub ' i jeśli w tekście zawarte są
obydwa to sypie błędami.:(
Był bym wdzięczny za podpowiedź
Offline
Nie wiem czy o to chodzi ale może tak:
$BUFFERR = str_replace("\"", "", "jakies tam dane ' ' \"dalsze dane ");
Zamieni to znak " występujący w tekście na pusty znak, jeżeli źle zrozumiałem to przepraszam
Offline
A próbowałeś slashem np. "\"tekst\"" albo w {"tekst"}?
Offline
tzn tak nie mam wpływu na dane które się tam wrzucają także nie moge ich zmieniać
Jak próbuje:
<?
$przed= array("'","\"");
$po= array("","");
$BUFFERR = str_replace($przed, $po, "jakies "tam dane ' ' "dalsze dane ");
echo $BUFFERR;
jak daje z / to nadal sypie mi błędem:
Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING
Offline
Pamiętaj że musi być \" a nie /" to bardzo duża różnica.
Najlepiej daj w skrypcie echo na dane które otrzymujesz i wklej je na forum, wtedy pewnie będziemy w stanie pomóc.
Offline
No jest dokładnie tak jak wyżej czyli:
$przed= array("'","\"");
$po= array("","");
$BUFFERR = str_replace($przed, $po, "jakies "tam dane ' ' "dalsze dane ");
echo $BUFFERR;
i chcę poprostu wyrzucić z jakies "tam dane ' ' "dalsze dane
' i to "
Ponieważ skrypt się nie chce wykonać czyli wyswietlić : jakies tam dane dalsze dane
Offline
Skrypt się nie wykonuje przez błąd składni, weź włącz sobie pokazywanie błedów. Jak można tak kodzić na ślepo.
zamiast:
$BUFFERR = str_replace($przed, $po, "jakies "tam dane ' ' "dalsze dane ");
powinieneś mieć:
$BUFFERR = str_replace($przed, $po, "jakies \"tam dane ' ' \"dalsze dane ");
Offline
No tak to [s]zauwarzyłem[/s] zauważyłem! Ale rozumiesz - nie mam wpływu na dane które są między cudzysłowami( pisałem to [s]wyrzej przecierz[/s] wyżej przecież):
jakies "tam dane ' ' "dalsze dane
czyli tam gdzie pojawił mi się w środku " to nie mogę tam sobie wrzucić / żeby to działało!
tak jak w tym przypadku jak napisałeś:
jakies \"tam dane ' ' \"dalsze dane
chyba że można to jakimś skryptem dodać???bo skrypt przed wrzuceniem danych wygląda tak:
<?
$przed= array("'","\"");
$po= array("","");
$BUFFERR = str_replace($przed, $po, "$_GET['zmienna'] ");
echo $BUFFERR;
?>
No ale wpada tam wiadomo ten tekst w środku którego mogą być " i '
Może można by było wykonać coś w stylu jeśli w $_GET['zmienna'] będzie " to wrzuć przed niego /
to wtedy tak! Ale kombinuje i niebardzo wiem jak to zrobić
Ostatnio edytowany przez czadman (2009-06-19 21:39:42)
Offline
No to używasz addslashes().
Offline
z addslashes() ciężko! - zostawia /. A pozatym tutaj i tak nie ominę wystąpienia w ciągu znaków " i ' naraz.
Także jednak musiało by to być spełnione warukiem jeśli w zmiennej $_GET['zmienna'] wystąpi " to go usuń
oczywiście wynik wrzucam do drugiej zmiennej a następnie -> ' pozbywam się za pomocą str_replace.
Tylko jak to teraz ubrać i jest coś co mi usunie podany znak ze zmiennej??
Offline
Posprawdzałem chyba co się da ale fakt że w php tego nie zrobię! Tak więc wymyśliłem takie rozwiązanie
byc może ktoś będzie mi w stanie pomóc:)
- czy da się w bashu zrobić coś takiego - sprawdzi cały plik i jeśli napotka - $zmienna gdziekolwiek w całym pliku to żeby wykoanał taką operację że jeśli będzie np: $zmienna="jakies "tam dane ' ' "dalsze dane "; to żeby między tymi głównymi cudzysłowiami usunął wszystkie cudzysłowia i apostrofy. Jest taka możliwość??? Wtedy mógłbym spokojnie wykonać sobie skrypt php.
Był bym bardzo wdzięczny za pomoc:)
Chyba sed ale ciężko znaleźć rozwiązanie
Ostatnio edytowany przez debbie (2009-06-19 17:54:49)
Offline
mam coś co usuwa wszystkie "
cat test.php | sed 's/"/ /g' > nowy_plik
albo
sed -i 's/"/ /g' test.php
ale jak zrobić warunek żeby tylko usuwał między:
$BUFFERR = str_replace($przed, $po, "
a
");
ma ktoś jakiś pomysł??
Ostatnio edytowany przez debbie (2009-06-19 18:04:05)
Offline
[b]debbie[/b] koledzy wyżej podpowiadali Ci bardzo dobrze. Błędem sypalo, bo testowales na recznie wpisanym tekście zamiast podanej zmiennej $_GET, użyj tego kawałka kodu, który sam wpisałeś:
<? $przed= array("'","\""); $po= array("",""); $BUFFERR = str_replace($przed, $po, "$_GET['zmienna'] "); echo $BUFFERR; ?>
Następie odpal skrypt wpisujac do zmiennej odpowiednią wartość z apostrofami i cudzysłowiami, a wyswietli Ci sie ona bez tych znaków.
A w ramach wyjaśnienia, czemu masz błąd we wcześniejszym kodzie:
$BUFFERR = str_replace($przed, $po, "jakies "tam dane ' ' "dalsze dane ");
Przyjrzyj się teraz co podałeś w trzecim parametrze funkcji str_replace:
"jakies "tam dane ' ' "dalsze dane "
Ciąg znaków u Ciebie zaczyna się od cudzysłowia, zatem kolejne jego wystąpienia zakończy ciąg znaków. Jeśli się przyjrzysz, to wspomniany ciąg znaków kończy się przed słowem "tam", bo przed nim występuje pierwszy cudzysłów. Po tym ciągu znaków znajduje się słowo "tam", które nie jest żadnym operatorem, więc parser nie wie co to jest i po co to jest, i w związku z tym sypie błędem. Jeżeli sam w kodzie chcesz zdefiniować ciąg znaków, który ma zawierać cudzysłów bądź apostrof to przed tym znakiem, który ma być częścią ciągu znaków stawiasz ukośnik, aby parser wiedział, że ma go traktować jako kolejny znak, a nie jako symbol zakończenia ciągu znaków. Mam nadzieje, że jasno wytłumaczyłem. I jeszcze dwa przykłady:
$test1 = "Wojtek powiedział, żeby nazywać go \"Wojtas\". Co Ty na to?";
echo $test1;
$test2 = 'Wojtek powiedział, żeby nazywać go "Wojtas". Co Ty na to?';
echo $test2;
Obydwa przykłady wyświetlą:
Wojtek powiedział, żeby nazywać go "Wojtas". Co Ty na to?
Offline
No chodzi o to że przykładowo z formularza jeśli wpisuję to ok! Ale jeśli jest taka sytuacja że program zewnętrzny
wrzuca mi w miejsce zmiennej:
<?
$zmienna_tym_razem="jakies "tam dane ' ' "dalsze dane";
$przed= array("'","\"");
$po= array("","");
$BUFFERR = str_replace($przed, $po, "$zmienna_tym_razem ");
echo $BUFFERR;
?>
Ponieważ kodowo bez danych które są wrzucane z zewnątrz wygląda ten kawałek tak:
$zmienna_tym_razem="tutaj_wpadna_dane";
program zewnętrzny wrzuci mi tu dane i ja następnie ręcznie wykonam już sobie plik php z gotowymi danymi.
To jak widzisz nieda rady niestety! Dlatego tak się upieram!
I powracam chyba do jedynego rozwiązania(pytania):
cat test.php | sed 's/"/ /g' > nowy_plik
albo
sed -i 's/"/ /g' test.php
ale jak zrobić warunek żeby tylko usuwał między:
$BUFFERR = str_replace($przed, $po, "
a
");
Offline
[quote=debbie]program zewnętrzny wrzuca mi w miejsce zmiennej[/quote]
Hmmm... to powiedz może, w jaki sposób ten zewnętrzny program wrzuca ci dane w miejsce zmiennej? Chyba jednak musisz miec wpływ na ten program, skoro możesz dowolnie zmieniać skrypt, a on wie, gdzie Ci tą zmienną wrzucić... Wydaje mi się, że o wiele łatwiej byłoby Ci pomóc, gdybyś wrzucił gdzieś ten kawałek kodu wraz z dokładnym wyjaśnieniem jak i skąd pobiera on dane/wartości zmiennych. W tej chwili zadałeś pytanie o zmienną, dostałeś odpowiedź, ale powiedziałeś, że nie działa to ze zmienną GET, której używasz, przekonałem Cię, że z ta zmienną też działa, to teraz napisałeś z kolei o tym, że dane przychodzą z zewnętrznego programu.
Na chwilę obecną (w ciemno) jedynym skutecznym rozwiązaniem jakie widzę dla programu zewnętrznego jest:
1. Program zewnętrzny zapisuje wartość do oddzielnego pliku (nadpisuje jego zawartość).
2. skrypt PHP zczytuje zawartość pliku, i zapisuje do zmiennej.
3. używasz str_replace() jak w przykładach wyżej
Zalety rozwiązania: program zewnętrzny może do pliku zapisać dowolne znaki, skrypt wszystko co zczyta z pliku zapisze do zmiennej, bez zwracania uwagi na tojakie to sa znaki - nie ma obawy, ze apostrof lub cudzyslow spowoduje zakonczenie ciagu znakow
Wady: dodatkowy plik, do którego odczytu uprawnienia musi miec skrypt PHP, oraz uprawnienia do zapisu musi miec program.
EDIT:
Po ponownym przeczytaniu Twojego poprzedniego postu domyślam się, że program po prostu w pliku ze skryptem wyszukuje ciągu znaków
tutaj_wpadna_dane
i podmienia go na zmienną. W takiej sytuacji polecam rozwiązanie z oddzielnym plikiem, który będzie przechowywał tylko wartość tej zmiennej, tak jak opisałem powyżej.
Ostatnio edytowany przez grzegorz.85 (2009-06-19 20:29:07)
Offline
[quote=debbie]z addslashes() ciężko! - zostawia /. A pozatym tutaj i tak nie ominę wystąpienia w ciągu znaków " i ' naraz.
Także jednak musiało by to być spełnione warukiem jeśli w zmiennej $_GET['zmienna'] wystąpi " to go usuń
oczywiście wynik wrzucam do drugiej zmiennej a następnie -> ' pozbywam się za pomocą str_replace.
Tylko jak to teraz ubrać i jest coś co mi usunie podany znak ze zmiennej??[/quote]
No tak addslashes() nie potrzebne jak dajesz z geta, ale co ty najlepszego wymyśliłeś. Skąd pomysł by "$_GET['zmienna'] " po co te ciapki? Wywal i będzie działać, i wszystko zrobisz w php, ech.
Offline
kamikaze z tego co ja zaczynam chyba rozumiec, to przyklad z pierwszego postu, a pozniej GET mialy byc tylko kolejnymi krokami do osiagniecia celu, choć powodowały, że krążyliśmy po okolicy, i osiadliśmy na mieliźnie.
Z tego co zrozumiełem ostatni post debbie to ma on zewnetrzny program, który edytuje kod skryptu wpisujac w odpowiednie miejsce wartosc, ktora jest przypisywana zmiennej. Błąd jednak nie znajduje się w funkcji str_replace, a w przypisaniu zmiennej, bo taka linia:
$zmienna_tym_razem="jakies "tam dane ' ' "dalsze dane";
jednak wykrzaczy parser. Dlatego zaproponowałem właśnie zewnętrzny plik, który bedzie miał wartość domyślną:
tutaj_wpadna_dane
tylko i wylacznie, poskutkuje to tym, że cała zawartość tego nowego pliku będzie zawierała wartość jaką ma przyjąć zmienna. Kod PHP po prostu będzie odczytywał tę wartość z pliku, co zajmie nie więcej niż jedną linijkę kodu.
Offline
To jakieś podejście od d.. strony ;] program generuje php? A nie lepiej żeby program wypluwał dane, a php już robił swoje. Bo to jakaś paranoja z deka. W ogóle dlaczego php, będzie to wyświetlane na stronie? Mógłby opisać lepiej swój problem.
Offline
OK! może wytłumaczę od początku :
- jest program zewnętrzny który z pomocą swojego własnego wzorca
który mogę sobie zmieniać generuje plik z danymi np 350 osób.
We wzorcu zawarte są "STAŁE" dzięki którym generują się te dane tam gdzie je sobie ustawię.
przykład - mogę zrobić we wzoru tak:
dzisiaj jest fajny dzień ja i imie_nazwisko idziemy do kina.
Pan imie_nazwisko mieszka w adres_zamieszkania.
teraz wykonując program zewnętrzny generuje mi się plik który będzie zawierał z 350 takich wpisów
a w miejscu imie_nazwisko oraz adres_zamieszkania będą dane tych osób. Np pokaże na 2 osobach:
dzisiaj jest fajny dzień ja i Jan Kowalski idziemy do kina.
Pan imie_nazwisko mieszka w Bodaniec 23-309 ul. Chrobrego 12.
dzisiaj jest fajny dzień ja i Maciej Wytarzał idziemy do kina.
Pan imie_nazwisko mieszka w Sniardwy Jezioro ul Kładki 14.
I rozumiecie 350 takich wpisów!
Ale że potrzebuję sobię zrobić tabelę danych takich osób za pomocą php i mysql'a
we wzorcu programu zewnętrznego zamiast
dzisiaj jest fajny dzień ja i imie_nazwisko idziemy do kina.
Pan imie_nazwisko mieszka w adres_zamieszkania.
wrzucam sobie skrypt dodający rekord do bazy w mysql i jest tam międzyinnymi
taki kawałek:
$przed= array("'","\""); $po= array("",""); $personalne='imie_nazwisko'; $BUFFERR = str_replace($przed, $po, "$personalne");
I rozumiecie - po wykonaniu programu zewnętrznego tworzy mi się plik z 350 skryptami php
dodającymi rekord do mysql.
Wykonuję ten plik w przeglądarce i często jest tak że wyrzuca mi błąd ponieważ w np
imie_nazwisko może wygenerować się taki wpis-
Bogdan' Kowalski" 'Maleńczuk
Niestety na to nie mam wpływu.
Dlatego chciałem użyć str_replace do zamiany tego.
Ale po przeanalizowaniu myślałem że najlepszym rozwiązaniem będzie:
cat test.php | sed 's/"/ /g' > nowy_plik
albo
sed -i 's/"/ /g' test.php
ale jak zrobić warunek żeby tylko usuwał między:
$BUFFERR = str_replace($przed, $po, "
a
");[/quote]
i po pozbyciu się " za pomocą tego warunku zrobię str_replace tylko dla '
Rozumiecie gdybym zrobił sobie we wzorcu programu zewnętrznego listę zmiennych np:
$personal='imie_nazwisko';
$adr='adres_zamieszkania';
itd.
To dostanę 350 takich wpisów z różnymi danymi róznych osób ale z tą samą nazwą zmiennej:
$personal='Jakub Michałski';
$adr='terttet 12 ';
$personal='Jan Kowalski';
$adr='riririri 45';
itd itd aż 350. Także nie jestem w stanie sobie z listy danych z pliku wyciągnąć danych bo jak pociągnę np za pomocą $_GET['personal']
????? Jak wpliku jest 350 $personal z różnymi danymi.
Sory że na początku nie opisałem jak to dokłądnie wygląda ale nie myślałem że problem jest aż tak duży!
Był bym wdzięczny za pomoc lub jakieś nakierowanie może inne wyjście.
wygląda to tak:
Wzorzec mogę sobie ustalić jak mi się tylko podba ( tak jak pisałem wyżej )
Z plikiem który się wygeneruje mogę robić co chcę - prawa 777:)Ostatnio edytowany przez debbie (2009-06-22 23:30:55)
debbie
[color=blue]Wrócę jak zjem zupę i drugie danie - tyle[/color]
[color=blue]a oto ta zupa:[/color]
Offline
ok, ile jest tych wzorcow, stala liczba? czy kazdy np. imie_naziwko ma przypisany jakie np. adres_zamieszkania? czy tylko jeden, czy moze miec wiele?
O co mi chodzi? Tworzysz plik o tresci np:
imie_nazwisko{separator}adres_namieszkania
Każesz swojemu programowi zewnetrznemu aby pracowal na tym pliku, czego efektem jest:
Jan Kowalski{separator}Poprzeczna 12 John O'Neil{separator}Jana "Kowala" Kowalskiego 13
piszesz sprypt, ktory odczytuje linijka po linijce ten plik, odczytane linie przechowywane są jako stringi, możesz bez przeszkod uzywac str_replace($przed, $po, $linia), gdzie $linia jest zmienna przechowujaca jeden wiersz z pliku. Najprostrzy skrypt (nie do konca oszczedzajacy pamięc serwera) moglby wygladac tak:
if($content = file_get_contents('plik.txt')){ $linie = explode("\n", $content); if(count($linie) > 0){ foreach($linie AS $linia){ $przed= array("'","\""); $po= array("",""); $BUFFERR = str_replace($przed, $po, $linia); $dane = explode("{separator}", $linia); // w tablicy dane masz wszystkie dane bez apostrofów i cudzysłowów } } }
Ostatnio edytowany przez grzegorz.85 (2009-06-23 00:27:37)
Offline
Tzn tak - każde imie_nazwisko ma swoje adres_zamieszkania
tworzy się 350 różnych wpisów.
teraz pytanie - czy można to zrobić w jednym pliku wzorca czyli żeby skrypt php nie działał na pliku osobnym.
tzn ja może pokaże jak wygląda wzorzec programu zewnętrznego ( jak go sobie ustaliłem )
<? $personalne = 'personal'; $kod = str_replace(' ', '', 'kod'); $data = 'date'; $imie_nazwisko = str_replace("'", "", "imie_nazwisko"); $adres_zamieszkania = 'adres_zamieszkania'; if($personalne and $kod and $data ) { // łączymy się z bazą danych $connection = @mysql_connect('localhost', 'root', 'pass') or die('Brak połączenia z serwerem MySQL'); $db = @mysql_select_db('raport', $connection) or die('Nie mogę połączyć się z bazą danych'); // dodajemy rekord do bazy $ins = @mysql_query("INSERT INTO dane SET personalne='$personalne', kod_sql='$kod', data_sql='$data', imie_nazwisko_sql='$imie_nazwisko', adres_zamieszkania_sql='$adres_zamieszkania'"); if($ins) echo "<center><table border=0 width=50%><tr><td width=20% bgcolor=#E3F3D9><center><b>Rekord został poprawnie dodany do bazy</b><center></td></tr></table></center>"; else echo "<center><table border=0 width=50%><tr><td width=20% bgcolor=#E3F3D9><center><b>Nie udało się dodać nowego rekordu</b><center></td></tr></table></center>"; mysql_close($connection); } ?>
Kiedy wykonam program zewnętrzny utworzy mi się w plik który będzie zawierał 350 takich skryptów
z różnymi danymi ( każdny inny )
I teraz zauwarz tą linię:
$imie_nazwisko = str_replace("'", "", "imie_nazwisko");[/quote]
Chodzi mi tylko o nią tylko o imie_nazwisko
Zamieniam tutaj ' na nic
Ale może się zdarzyć że imie_nazwisko będzie zawierać ' i "
Czyli jeżeli twój skrypt sobie z tym poradzi to jak go przerobić aby kod php wykonywał się na tej zmiennej
$imie_nazwisko i był zawarty w pliku wzorca czyli tam gdzie kod dodający rekordy mysql a nie operował na zewnętrznym pliku plik.txtOstatnio edytowany przez debbie (2009-06-23 10:35:28)
debbie
[color=blue]Wrócę jak zjem zupę i drugie danie - tyle[/color]
[color=blue]a oto ta zupa:[/color]
Offline
nie da rady tego zrobic, poniewaz Twój program zewnętrzny generując plik docelowy powoduje, że składnia jezyka PHP zostaje naruszona, a co za tym idzie występują błędy o których wspominałes wczesniej
Offline
Strony: 1
Time (s) | Query |
---|---|
0.00009 | SET CHARSET latin2 |
0.00007 | SET NAMES latin2 |
0.00096 | SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='18.222.20.250' WHERE u.id=1 |
0.00199 | REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '18.222.20.250', 1732301422) |
0.00049 | SELECT * FROM punbb_online WHERE logged<1732301122 |
0.00048 | SELECT topic_id FROM punbb_posts WHERE id=121595 |
0.00005 | SELECT id FROM punbb_posts WHERE topic_id=14423 ORDER BY posted |
0.00078 | SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=14423 AND t.moved_to IS NULL |
0.00019 | SELECT search_for, replace_with FROM punbb_censoring |
0.00276 | SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=14423 ORDER BY p.id LIMIT 0,25 |
0.00075 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=14423 |
Total query time: 0.00861 s |