Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: mysql_query i drugi parametr jako NULL
Forum PHP.pl > Forum > PHP
nospor
A tak mnie naszło na refleksje pod wpływem jednego tematu na forum.

A więc mamy mysql_query()
http://pl1.php.net/manual/en/function.mysql-query.php
Jako drugi parametr może przyjąć uchwyt połączenia, ale można nic podawać i wówczas domyślnie wg. dokumentacji jest null
resource mysql_query ( string $query [, resource $link_identifier = NULL ] )
Czyli mozna napisać tak:
mysql_query($sql)
ale można też tak
mysql_query($sql, $link)

No ale skoro domyślnie to jest null, więc teoretycznie można napisać też tak:
mysql_query($sql, null)
lub
mysql_query($sql, $link) gdzie $link to null.

No ale okazuje się, że tak nie można. Jak już podajemy drugi parametr to musi on być linkiem. Nie może być nullem. A wydawać by się mogło na zdrowy rozsądek, że jeśli sami ręcznie wpiszemy to co jest wartością domyślną, to mysql_query powinno się zachować dokładnie tak samo, jakby samo tę wartość domyślną ustaliło.

Co Wy na to?


Sephirus
Śledziłem tamten temat i szczerze mówiąc tak myślałem że autor coś tam podawał... ale samo to, że jest to tak a nie inaczej jest co najmniej - nieoczekiwane smile.gif

Dobrze, że używam PDO... smile.gif
nospor
Oj, nie mieszajmy w to PDO. Nie o tym mowa smile.gif

Chodzi mi o samo zachowanie zdawać by się mogło banalnej funkcji... No ale cieszy mnie fakt, że nie tylko mnie to dziwi smile.gif
Crozin
Przepraszam, ża określenie, ale deweloperzy PHP czasami przypominają niedorozwiniętą amebę i na prawdę nie potrafią zrobić najprostszych rzeczy dobrze. Fragment źródła funkcji mysql_query:
  1. zval *mysql_link = NULL;
  2. ...
  3.  
  4. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|r", &query, &query_len, &mysql_link) == FAILURE) {
  5. return;
  6. }
  7.  
  8. if (!mysql_link) {
  9. id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
  10. CHECK_LINK(id);
  11. }
Jaki jest błąd? Zmienna mysql_link będzie NULL-em wyłącznie w przypadku, gdy w ogóle nie podamy parametru dla mysql_query(). W przypadku gdy podamy go (o wartości NULL) zmienna mysql_link będzie już stukturą zval, która ma przypisany PHP-owski typ NULL. Innymi słowy w IFie powinno być coś na kształt:
  1. if(!mysql_link || Z_TYPE_P(mysql_link) == IS_NULL) { ... }
nospor
No tak, to wyjaśnia czemu mamy błąd smile.gif
Ale przez tyle lat, to te ameby naprawdę mogły go poprawić wink.gif

Chyba że zrobili to celowo, tu zaś skolei nasuwa się pytanie po co? No ale podejrzewam, że to już ich trzeba się pytać smile.gif
Crozin
Jedyny powód jaki mogę znaleźć to to, że zend_parse_parameters() z jakiegoś bliżej nieokreślonego powodu nie może/nie potrafi PHP-owskiego NULLa wczytać do struktury zval, dla której przewidziano typ RESOURCE. Ale tutaj powinni w takim przypadku w dokumentacji podać dwie sygnatury funkcji, gdzie jedna oczekuje połączenia (nie NULLa), a druga w ogóle nie przyjmuje parametru połączenia (tak jak jest to zrobione w przypadku np. pg_query).

...jednak czego można się spodziewać po amebie. wink.gif
nospor
Cytat
...jednak czego można się spodziewać po amebie.
I ta konkluzja myślę wyczerpuje temat w 100 % smile.gif

Dziękuję Crozin, Twoja dociekliwość była jak zwykle nieoceniona. W ramach nagrody dostajesz miesiąc praktyk u ameb.... albo to one dostaną praktyki u Ciebie... Podejrzewam, że im i nam wyszła by na lepsze ta druga opcja wink.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.