[php/mysql]Coś słabszego niż die ?

0

Robię skrypt w PHP/MySQL, korzystając ze Smarty i jak coś np. nie połączę się z bazą, to funkcja die() powoduje, że dalsza część szablonu ze Smarty się nie uruchamia :( Jaką inną funkcję by można było dać zamiast die

I tak przy okazji, czy takie rzeczy jak np. tworzenie tabel zostawia się w kodzie ? W sumie to chyba one nie będą przeszkadzać, tylko co najwyżej zwracać wartości false, skoro te tabele już będą istnieć ? Czy ze względów wydajnościowych wywalić ?

Przeczytałem, że dane z formularza należy potraktować funkcją mysql_escape_string, a co jeśli dane będą za długie ? Trzeba samemu przycinać, czy mysql sam sprawdzi czy dane są zgodne z tabelą ?

Na razie tyle :) thanks in advance za pomoc

0

Echo? Wyrzucenie wyjątku i odpowiednia obsługa zanim zostanie przekazane cokolwiek do Smarty? Musisz sam stworzyć coś, co będzie zgodne z twoim pomysłem na aplikację, die() ma to do siebie, że przerywa dalsze wykonywanie skryptu PHP.

A mySQL sam przytnie zbyt długie dane o ile pamiętam. I nie stosuj mysql_escape_string(), a lepiej mysql_real_escape_string().

Tabele ja osobiście tworzę poza skryptem, więc takiego kodu nawet w nim nie ma i nie mam co zostawiać - niektórzy uznają, że jedyne CREATE jakie możesz użyć gdzieś w aplikacji to CREATE TEMPORARY TABLE ;-)

0

No niestety, chyba coś takiego będzie trzeba zrobić :/ die ma to do siebie, że to jest bardzo logiczna składnia i łatwo się takie coś pisze:
mysql_query() or die();
a teraz bedzie ciagle pomieszanie z poplątaniem jakieś ify, wyjątki i cuda niewidy na kiju. :(

A jaka jest dokładnie różnica różnica między real_escape i espace ?

No niby tak, ale jak ktoś by pokasował tabele z baz danych, to skrypt w fajny sposób "podniesie się" i nadal będzie działał (co prawda wyczyszczony, ale jednak), a bez tych creatów to będą tylko ciągle errory.

0

or nie jest częścią die, można równie dobrze chyba napisać
mysql_query or echo('cos');

a real_escape od escape różni się tym że real_escape daje backslashe przed wszystkimi znakami które mogą być niebezpieczne w zapytaniu przy użyciu aktualnego kodowania znaków, zwykłe escape daje backslashe tylko przed standardowymi znakami typu cudzysłów / znak nowej linii

// print zamiast echo

0

No niby tak, ale jak ktoś by pokasował tabele z baz danych, to skrypt w fajny sposób "podniesie się" i nadal będzie działał (co prawda wyczyszczony, ale jednak), a bez tych creatów to będą tylko ciągle errory.

A czy jest różnica czy nie masz tabel czy masz tabele bez danych? I tak i tak jest źle. W ogóle sytuacja "jak ktoś by pokasował tabele z baz danych" to coś, co się nie ma prawa wydarzyć, a jak się wydarzy to sytuacja czy skrypt wstanie czy nie, to już kwestia drugorzędna :)

Ja też nie stosuję składni z "or die()". W przypadku query robię albo prostego if-a, albo coś bardziej skomplikowanego, zależnie od sytuacji/frameworka/projektu.

Najczęściej coś w tym stylu:

if (!$db->Query("INSERT INTO foo VALUES ( 'bar' )"))
{
    echo "Błąd wystąpił.";
    if ($debug)
        echo "MySQL last error: " . $db->GetLastError();
}
0

Adamo, mi też właśnie tak się wydawało, ale słuchaj, mam taki kod:
($con = @mysql_connect($dbconn['host'],$dbconn['user'],$dbconn['pass'])) or die('BŁĄD');

który działa i taki kod:
($con = @mysql_connect($dbconn['host'],$dbconn['user'],$dbconn['pass'])) or echo 'BŁĄD';

który powoduje błąd:
Parse error: parse error in (tutaj_adres_pliku) on line 26

26 to właśnie ta linijka -_- nie rozumiem

0

A ja nie rozumiem co zlego w zwyklym ifie.

0

Nooo, ale moim zdaniem if jest bardzo dobry :) ale bardziej mi się podoba ta składnia z OR, kod będzie czytelniejszy ;p

Czy to może być wina mojego php ? Bo wg google "or echo" powinno działać tak samo, jak "or die", a tutaj taka niespodzianka. Mam PHP Version 4.3.10.

Pomocy :]

Ciekawostka: jak zmieniłem na "or print" to również działa Oo czy ktoś potrafi to wszystko wyjaśnić ? xd

0

powiedzialbym, ze z ifem jest czytelniejszy - wytkorzystywanie leniwosci interpretacji OR, czy AND nie jest do końca intuicyjne...

poza tym, moze z echo problem jest w niedostatecznym nawiasowaniu?

0

chodzi o to że "or" to tak naprawdę alternatywa, to samo co "||" tylko o mniejszym priorytecie (co tutaj akurat nie ma znaczenia tylko używane jest "or" żeby było bardziej czytelnie)

więc np:

a or b
czy
a || b

zwraca jakąś wartość, "a" w przypadku gdy "a" nie jest puste czy zerowe, w przeciwnym wypadku "b" i stosuje się to najczęściej do instrukcji warunkowych

if(a || b) chyba wiadomo co robi

samo (a || b) też będzie działać jednak wynik tej operacji jest ignorowany
warunkiem do działania jest to żeby "a" i "b" istniało, więc musi to albo być zmienna albo funkcja która zwraca jakąś wartość (to chyba logiczne bo co miałaby zwrócić cała instrukcja kiedy jednego argumentu by po prostu nie było ?)
i tu właśnie jest problem - "echo" nic nie zwraca, funkcja "print" zwraca zawsze "1"
to jest właśnie jedyna różnica między tymi dwoma funkcjami, że echo nie zwraca niczego przez co powinien być stosowany kiedy nie interesuje nas wartość zwracana bo jest teoretycznie szybszy (choć tak minimalnie że nie wiem kogo to obchodzi, w każdym razie po co specjalnie nie potrzebnie obciążać procesor)

właściwie chyba tylko "echo" nie będzie tutaj działać, tak naprawdę każda funkcja będzie zwracać jakąś wartość nawet gdy brakuje jej "return", w takim przypadku po prostu zwraca wartość typu NULL

a priorytety są ważne jakbyś chciał łączyć takie dziwne konstrukcje, np zamiast pisać:

mysql_connect() or die('błąd');
mysql_select_db() or die('błąd');

można napisać:

mysql_connect() and mysql_select_db() or die('błąd');

gdyby użyć zamiast "or", "||" to miałby wyższy priorytet i wtedy trzeba by zastosować nawias:

(mysql_connect() and mysql_select_db()) || die('błąd');

bo bez nawiasu, w przypadku błędu połączenia, całość by przyjęła już "false" bo nie ma sensu sprawdzać or'a skoro pierwszy argument and'a i tak jest false i już nie ma szans na zmiane tego stanu
tak więć zamiast pokazać komunikat "błąd", po prostu nic by się już nie zrobiło
oczywiście gdyby zamiast "and" też zastosować odpowiednik - "&&", to nic by się nie stało i nie trzeba już nawiasu bo priorytety znowu by były jak na początku

tak czy inaczej moim zdaniem taka kontrukcja po prostu głupio wygląda

0

Ahaaa ; d no i takiej odpowiedzi oczekiwałem, przynajmniej teraz wiem, na czym stoję ; d

dzięki EOT

1 użytkowników online, w tym zalogowanych: 0, gości: 1