Blog

Powoli mnie wkurza PHP

2005-01-15 20:30:51

Wkurza mnie powoli PHP, a szczególnie konkatenacja. Muszę zrobić kilka różnych formularzy, przesyłanych metodą POST do skryptu, który tworzy zapytanie SQL z tych danych. Mam dwie możliwości do wyboru:

$a = $_POST['a'];
$b = $_POST['b'];
...
$sql = "insert into `tabela` values ('$a', '$b', '$c', ...)";

oraz:

$sql = "insert into `tabela` values ('".$_POST['a']."', '".$_POST['b']."', ...)";

Jak dotąd stosuję ten drugi sposób, bo dublowanie zmiennych mija się z celem. A na dodatek wymaga masę wypisywania zmiennych. Z drugiej strony, sposób, którego używam jest bardzo nieczytelny i, przy długich zapisach, błędogenny. Muszę się zastanowić, co by tu zrobić. Ugryźć to foreachem?

foreach($_POST as $nazwa => $wartosc) {
    $$nazwa = $wartosc;
}

Szybciej się to zrobi, ale zdubluje się zmienne. Niby nie jest to wielki problem, ale kiedy tych zmiennych jest kilkadziesiąt i każda zmienna zawiera sporo danych, to jest to marnotrawienie pamięci na serwerze. Chociaż... Może by tak zrobić to przy pomocy referencji? Stworzy się tylko kilkadziesiąt kilkubajtowych zmiennych, ale nie będzie się ich dublowało.

foreach($_POST as $nazwa => $wartosc) {
    $$nazwa = & $_POST['nazwa'];
}

Hmmm... To mogłoby chwycić. Jeszcze tylko zrobić pętelkę, która będzie dopisywała do wyrażenia SQL coraz to kolejne wartości i jak przestanie się zapętlać to zakończy wyrażenie i je wykona. Tak! To jest dobry pomysł.

Ale i tak na razie muszę sobie poradzić z automatycznym, praktycznie niezauważalnym logowaniem użytkownika na stronie, która ma się pojawiać w ramce (ramki są be, ale czasem się przydają - tak jak w tym przypadku). Problem tkwi w tym, że umieszczenie lokalnie formularza logowania i jego wysłanie nie daje takiego efektu, jaki daje formularz "oryginalny". Ba! Nie mam pojęcia co jest przyczyną problemu. No nic, będę kombinował. Może się coś uda.

Tagi:

Komentarze

faxe

2005-01-16 13:18:41

<?php function fun($in) { preg_match_all('/(%([^%]+)%)/', $in, $arr); $arr2 = array(); foreach($arr[1] as $foo) { $arr2[] = fun2($foo); } return str_replace($arr[1], $arr2, $in); } function fun2($in) { $in = str_replace('%','',$in); if(array_key_exists($in, $_POST)) { if (get_magic_quotes_gpc()) { return $_POST[$in]; } else { return addslashes($_POST[$in]); } } else { return ''; } } $sql = "INSERT INTO tabela (jeden, dwa, trzy) VALUES ('%pstro%', '%nico%', '%blabla%')"; $sql = fun($sql); echo $sql; ?>

Krzysiek

2005-01-16 13:22:47

Dzięki, przeanalizuję sobie. I może dorzucę możliwość zamieszczania nowych linii ;-)

faxe

2005-01-16 14:13:49

halo... proszę spojrzeć w źródło tej strony - nowe linie się zachowały, tylko po prostu przeglądarka je olewa.

źródło też siedzi tam: http://fax3.ath.cx/bzz.php.txt (dopóki mam właczony kąpótr) i uwaga do działania skryptu: oczywiście w zapytaniu przed użyciem funkcji nie może być żaden tag %cośtam%, który nie ma pochodzić z POST, bo się wykasuje. Mój kod jest też megaprzenośny, bo eskejpuje slasze tylko wtedy, gdy serwer automatycznie tego nie robi dla danych z POST ;)

faxe

2005-01-16 14:25:57

proponuję też teksty komentarza traktować taką funkcją:

function url2link ($we)
{
$perl1 = array(

'/(\s)(www\.([^\s<]+))/i', // www*
'/(\s)(((ftp:\/\/)|(http(s)?:\/\/))([^\s^<]+))/i', // http://* ftp://*
'/(\s)([^\s<>@"]+@[^\s<>@,\)]+\.[^\s<>@,\)]+)/', // *@*
'/(\s)(ftp\.([^\s<]+))/i', // ftp.*
'/(\s)(gg:(\s)*([\d]+))/i', // gg:*
'/(\s)(news:([^<^\s]+))/i', // news:*
'/(\s)([\w_\.]+\.(pl|com|org|net|info))\s/i' // *.(pl|com|org|net|info)
);

$perl2 = array(

' <a href="http://\\2">\\2</a>',
' <a href="\\2">\\2</a>',
' <a href="mailto:\\2">\\2</a>',
' <a href="ftp://\\2">\\2</a>',
' <a href="\\2">\\2</a>',
' <a href="\\2">\\2</a>',
' <a href="http://\\2">\\2</a> '
);


return preg_replace($perl1, $perl2, ' '.$we);
}

coby to linki się samoczynnie zapalały :)

Krzysiek

2005-01-16 14:37:24

To, że nowe linie są to ja wiem. Ale po prostu, tworząc ten skrypt zapomniałem o ich zamianie na <br /> ;-)
A co do "zapalania" linków, jeszcze się zastanowię. Ale dzięki za gotowca. Tylko te regexpy mnie przerażają. Niby nic trudnego, ale jak dochodzi co do czego to zawsze problemy są ;-)

tranx

2005-01-16 15:12:45

o! też mam coś takiego w newsportalu ;]

function html_parse($text) {
// regular expressions that will be applied to every word in the text
$regexp_replace=array(
'http://(((\.|,)*([-a-z0-9_/~@?=%#;+]|&amp;)+)+)' =>
'<a'.$target.'href="http://\1">http://\1</a>',
'(www\.[-a-z]+(((\.|,)*([-a-z0-9_/~@?=%#;+]|&amp;)+)+))' =>
'<a'.$target.'href="http://\1">\1</a>',
'https://(((\.|,)*([-a-z0-9_/~@?=%#;+]|&amp;)+)+)' =>
'<a'.$target.'href="https://\1">https://\1</a>',
'gopher://(((\.|,)*([-a-z0-9_/~@?=%#;+])+)+)' =>
'<a'.$target.'href="gopher://\1">gopher://\1</a>',
'ftp://((\.*([-a-z0-9_/~@?=%#;+]|&amp;)+)+)' =>
'<a'.$target.'href="ftp://\1">ftp://\1</a>',
'news://((\.*([-a-z0-9_/~@?=%#;+]|&amp;)+)+)' =>
'<a'.$target.'href="news://\1">news://\1</a>',
'news:([-a-z0-9_.%$]+)@((\.*([-a-z0-9_])+)+)' =>
'<a href="newsreaderviamid.php?id=<%MID%>">news:\1@\2</a>',
'mid:([-a-z0-9_.%$]+)@((\.*([-a-z0-9_])+)+)' =>
'<a href="newsreaderviamid.php?id=<%MID%>">mid:\1@\2</a>',
'([-a-z0-9_.]+)@((\.*([-a-z0-9_])+)+)' =>
'<a href="mailto:\1@\2">\1@\2</a>'
);
$ntext="";
// split every line into it's words
$words=explode(" ",$text);
$n=count($words);
for($i=0; $i<$n; $i++) {
$word=$words[$i];
$mid=urlencode('<'. str_replace('mid:', '', str_replace('news:', '',
eregi_replace('.*(news:|mid:)([-a-z0-9_.%$]+)@((\.*([-a-z0-9_])+)+).*',
'\2@\3', $word))).'>');
// apply the regular expressions to the word until a matching
// expression is found
foreach ($regexp_replace as $key => $value) {
$nword=eregi_replace($key,$value,$word);
if($nword!=$word) {
$word=$nword;
$word=str_replace('<%MID%>', $mid, $word);
break;
}
}

// add the spaces between the words
if($i>0)
$ntext.=" ";
$ntext.=$word;
}
return($ntext);
}

fajne, nie? ;]

tranx

2005-01-16 15:14:31

o. zauważyłem, że zapomniałem wywalić $target ;]

Krzysiek

2005-01-16 15:15:45

Ja wiem, ja wiem. Czerpiecie przyjemność z tego, że nowe linie są zachowane! ;-)

Puck

2005-01-16 16:34:20

Tranx, faxe, macie taką wprawę w regexach, czy chwalicie się gotowcami? ;->

tranx

2005-01-16 16:56:09

Puck: wiesz... akurat ta funkcja, którą wkleiłem powstała za sprawą Floriana Amrheina, ale w większości ja robiłem te regexpy.

faxe

2005-01-16 21:42:59

hih, tą funkcję skopiowałem ze swojego forum - które zresztą ma otwarte źródło, proszę bardzo:

http://www.dhost.info/ivlo/forum_pz/strumyk.php?uri=inc%2Fej.php

gdzieś tam w gąszczu funkcji znajdziesz odpowiednią,

Krzysiek

2005-01-17 19:48:22

Szacunek ;-)

tranx

2005-01-17 23:01:06

Szakunec jeśli już ;]

Dodaj komentarz

Zastrzegam sobie prawo do usunięcia komentarza bez podania przyczyny. W komentarzach nie można używać tagów HTML. Adresy IP komentujących są logowane.

Opcjonalnie możesz podać swój adres e-mail (nie zostanie opublikowany) oraz adres strony WWW (zostanie opublikowany):
E-mail: WWW:

I jeszcze odczytaj obrazek: