Jump to content
php.lv forumi

Mysql klase?


shurix

Recommended Posts

Esmu apņēmies izveidot nelielu portālu un domāju izmantot kādu jau gatavu mysql klasi, lai ērtāk būtu visu pārvaldīt un iespējams kaut ko vēlāk izmainīt. Internetos ir vairāki piemēri, bet gribēju uzjautāt jums. Vai ir kādas gatavas mysql klases ko jūs izmantojat katrā savā projektā? Vēl domāju ka varētu viņā iekļāut automātisko eskeipošanu pret sql injekcijām, bet nav ne jausmas kā to izdarīt. Padalieties ar funkcijām kā jūs to dariet?

Link to comment
Share on other sites

  • Replies 52
  • Created
  • Last Reply

Top Posters In This Topic

Vinekāršotajā variantā es izmantoju kaut ko šādu.

 

Ideja ir tāda, ka tiek izmantots singletona paters - respektīvi db klases instance tiek izveidota, pirmo reizi izsaucot kādu no funkcijām. tāpat arī pirmo reizi izsaucot šo funkciju notiek piekonektēšanās pie db servera.

Eskeipošanai izmantoju sprintf, kas nozīmē, ka kverijā rakstām %s, bet par parametriem nododam mainīgos.

 

Pavisam ir 4 funkciju grupas:

q() - atgriež mysqli_result objektu

q1() - atgriež pirmās rindas, pirmo kolonnu.

q2() - atgriež masīvu - pirmo rindu

q3() - atgriež 2D masīvu - visas rindas.

 

tāpat katrai grupai ir 2 funkcijas

1) kas beidzas ar A, norāda, ka parametri tiek padoti kā masīvs, resp. DB::qA('SELECT * FROM friends WHERE fid=%s',array($fid));

2) bez A, parametri tiek padi kā funkcijas argumenti, resp. DB::q('SELECT * FROM friends WHERE fid=%s',$fid);

 

Es praktiski izmantoji tikai funkcijas bez A.

Ja par parametru tiek padots int vai float tipa mainīgais, viņš netiks eskeipots, ja strings, tad eskeipos, ja masīvs, tad tiks mēģināts eskeipot katru tā elementu un atgriezt kā atdalītus ar komatu.

 

Daži piemēri:

 

$u=DB::q1('SELECT count(*) FROM users');
print_r($u);
echo '<br />';

$u=DB::q2('SELECT * FROM users WHERE id=%s',2);
print_r($u);
echo '<br />';

$u=DB::q3('SELECT * FROM users');
print_r($u);
echo '<br />';

$u=DB::q3('SELECT * FROM users WHERE id IN (%s)',array(1,3));
print_r($u);
echo '<br />';

$un='asd';
$psw='qwe';
$u=DB::q2('SELECT * FROM users WHERE un=%s and psw=%s',$un,$psw);
print_r($u);
echo '<br />';

 

izvada:

 

3

Array ( [id] => 2 [un] => asf [psw] => qwe )

Array ( [0] => Array ( [id] => 1 [un] => asd [psw] => qwe ) [1] => Array ( [id] => 2 [un] => asf [psw] => qwe ) [2] => Array ( [id] => 3 [un] => asv [psw] => qwe ) )

Array ( [0] => Array ( [id] => 1 [un] => asd [psw] => qwe ) [1] => Array ( [id] => 3 [un] => asv [psw] => qwe ) )

Array ( [id] => 1 [un] => asd [psw] => qwe )

Link to comment
Share on other sites

q() - atgriež mysqli_result objektu

q1() - atgriež pirmās rindas, pirmo kolonnu.

q2() - atgriež masīvu - pirmo rindu

q3() - atgriež 2D masīvu - visas rindas.

 

 

Dieva dēļ beidziet cilvēkus mācīt uz šitādiem idiotiskiem funkciju "nosaukumiem". Tas ir pilnīgs vājprāts no koda uzturēšanas viedokļa. Ja tu kaut ko tādu lieto pats, tad nemāci citus uz tādām muļķībām.

Link to comment
Share on other sites

php lielākai daļai funkciju ir idiotiski nosaukumi un nevienam tie nav jāatcerās, tieši tāpēc ir domāta dokumentācija, tai skaitā arī sava koda dokumentācija, lai tas nebūtu vājprāts.

Ja tev šie liekās idiotiski nosaukumi, tad lūdzu parādi, kā tu šādu funkcionalitāti sauktu neidiotiskā variantā?

 

 

Reāli uzturot kodu, tu vari sastapties, piemēram ar šādu:

array_uintersect_uassoc($array1, $array2, "strcasecmp", "strcasecmp")

 

Un tikai pasaki, ka tev viennozīmīgi, bez ielūkošanās dokumentācijā, ir izprotams uzreiz, ko šī funkcija dara?

 

Un vēl vien piemērs - kamēr nosacīti uzskatāmākais piemērs krietni iet pāri ekrāna malām, tikmēr piemērs, kur viss ir maksimāli īsi, saiet ekrānā. Kuru tad šādā gadījumā ir vieglāk uzturēt?

 

DataBase::query('SELECT * FROM users u LEFT JOIN cars c ON u.id=c.uid WHERE u.gid=%s ORDER BY u.lastaccess DESC LIMIT %s,%s',Database::RETURN_ALL_ROWS,$groupid,$offs,$limit);
DB::q3('SELECT * FROM users u LEFT JOIN cars c ON u.id=c.uid WHERE u.gid=%s ORDER BY u.lastaccess DESC LIMIT %s,%s',$groupid,$offs,$limit);

Edited by codez
Link to comment
Share on other sites

gandrīz visām tavām pārdefinētajām funkcijām ir ekvivalentas iebūvētās mysql funkcijas, kuru nosaukumi ir intuitīvi un viegli iegaumējami

 

q() = mysql_query

q1() = string mysql_result ( resource $result , int $row [, mixed $field = 0 ] )

q2() = mysql_fetch_row / mysql_fetch_assoc

 

q3() - nosauc to kaut vai par mysql_fetch_dataset().

Link to comment
Share on other sites

1)Tie ne tuvu nav ekvivalenti. Bez tam manus nosaukumus ir vieglāk iegaumēt, jo viss ir pēc kārtas q1 - viena vērtība, q2 - vērtību rinda, q3 - vērtību masīvs.

 

2)Paskaties kā izskatīsies alternatīvi kodi

 

tavā variantā:

 

 

$result = $db->query('SELECT * FROM users WHER username='.$db->real_escape_string($username));
$user = $result->fetch_assoc();

P.S. un kā man zināt, ka fetch_assoc atgriež vienu rindu, nevis 2D masīvu? (Tikai no tā, ka es to zinu no PHP dokumentācijas)

 

kamēr manā variantā

 

$user = DB::q2('SELECT * FROM users WHERE username=%s',$username);

 

 

Kuru kodu ir ātrāk uzrakstīt un vieglāk uzturēt?

Edited by codez
Link to comment
Share on other sites

Tomēr vairāk piekrītu Kaklz, nezinu vai viņa piedāvātie nosaukumi ir labākais variants, bet tomēr funkciju vai metožu nosaukumiem jābūt intuitīvi saprotamiem, par to cenšas mācīt jebkurā nopietnā programmēšanas literatūrā. Īsos nosaukums (q1, q2, utt.) pilnīgi noteikti ir ātrāk pierakstīt, uzturēt nē, it īpaši strādājot pie sveša koda. Pie tam mūsdienīgas izstrādāšanas vides piedāvā autocomplete, kas pierakstīšanas ātrumu palielina, arī izvadītajā metožu sarakstā, cilvēkam, kas strādā ar noteiktu klasi reti vai pirmo reizi, būs vieglāk saprast ko katra metode dara, ja tai būs saprotams nosaukums.

Link to comment
Share on other sites

Īsos nosaukums (q1, q2, utt.) pilnīgi noteikti ir ātrāk pierakstīt, uzturēt nē, it īpaši strādājot pie sveša koda.

 

Šitam es nepiekrītu.

Sastopoties ar kādu funkciju, kuru tu nezini, svešā kodā, tev tāpat nāksies skatīties dokomentāciju, lai 100% būtu pārliecināts par to, ko šī funkcija atgriež, bez tam parasti:

1) atgriežamo vērtību daudz labāk raksturo mainīgais, kuram piešķit šo vērtību,

2) ne tikai bibliotēku, bet arī aplikācijas loģikas kods ir jādokomentē.

 

Tātad, ja mums ir metode q1(), kas pirmajā brīdī neko nesizsaka, tad šāds kods, izsaka visu:

 

// Nosakām lietotāju skaitu grupā
$usercount=DB::q1('SELECT count(*) FROM users WHERE groupid=%s',$groupid);

 

 

Bet es vēljoprojām gaidu, kādi tad būtu tie pareizie nosaukumi, kurus būtu jāliek šīm funkcijām.

Kaklz piedāvātie neder, jo tās ir mysql iebūvētās funkcijas un klasei jau ir tādas metodes, bez tam pārrakstīt jau esošas metodes ar citu funkcionalitāti nebūtu prātīgi.

Edited by codez
Link to comment
Share on other sites

Tas ka komentārs norāda ko dara nākošā rindiņa, līdz ar to arī konkrēta metode, ir tikai viens no variantiem, bet gadījumā ja Tu strādā ar svešu klasi un jāatrod kāda konkrēta metode, nevis jāpaskatās ko dara jau kodā izmantotā, tad nosaukumi ar vienu burtu galīgi nederēs. Patiešām Tev taisnība ka jebkurā gadījumā būs jāskatās dokumentācija, lai noskaidrotu visu par konkrēto metodi, bet pēc saprotamiem nosaukumiem Tev būs jāapskata daudz mazāk, lai atrastu ko meklē. Piemēram ja ir funkcijas: get_first_row(), get_first_column(), get_all_results() un Tev jāatrod to, kas izvada visu, tad noteikti neskatīsies pirmās divas, bet ja funkcijas ir q1(), q2(), q3(), tad gan būs jāskatās visas.

Link to comment
Share on other sites

Pasakidrošu kāpēc es esmu izvēlējies šādus nosaukumus:

 

Mysqli metode, lai izsauktu kveriju ir query();

Tākā DB klase ir ekstendota Mysqli klase, tad to pašu nosaukumu es nevarēju ņemt, jo funkcijai ir nedaudz citi parametri un to var izsaukt statiski.

Tā kā tā ir salīdzonoši bieži lietota funkcija, tad izvēlējos to vienkārši saīsināt līdz q().

 

Rezultātā:

DB::i()->query(...);

var rakastīt

 

DB::q();

 

Tālāk man parādījās vajadzība atgriez tās vērtību ne tikai kā mysqli_result, bet vēl 3 veidos - kā vienu vērtību, kā rindu, kā 2D masīvu.

Bet būtība ir tā, ka tā ir tā pati query funkcija.

Varēja darīt tā, ka nodot papildus parametru:

 

DB::q('SELECT * FROM users WHERE gid=%s',DB::RETURN_ROWSET,$gid);

 

Bet tā kā man beigās seko mainīgs parametru skaits, tad to būtu jānorāda kā otro paametru, rezultātā viņš būtu jānorāda vienmēr, arī defaultā variantā, kas mani nepārāk apmierina.

 

DB::q('SELECT * FROM users WHERE gid=%s',DB::RETURN_DEFAULT,$gid);

 

Tāpēc nākamā doma ir veidot vienkārši 3 funkcijas, kuras sākas ar q, jo tā ir tāpat q funkcija, bet satur vēl kādu papildus variantu.

Tā kā es mīlu īsus nosaukumus, tad varētu būt piemēram varianti

DB::qOne()

DB::qRow()

DB::qAll()

 

bet praksē pārbaudījās, ka to vietā ir daudz ērtāk lietot 1,2,3, jo nevienmēr vari atcerēties kā tad tur bija:

qOne, qCollumn, qFirstElement.

qRow, qOne, qLine, qMany, qArray.

qAll, qRowSet, qDataSet, qMany, q2DArray.

 

Rezultātā cipari 1,2,3 ir vairāk jāuztver kā funkcijas q parametrs, kur 1 norāda, ka jāagriež 1 elements, 2, ka jāatgriež rinda, 3, ka jāatgriež masīvs.

 

Un galvenais uzsvars tomēr tiek likts uz ērtu un ātru produkta izstrādi, nevis uz to, ka atnāks kāds zaļš gurķis un nepārzinot, ne tikai aplikācijas izmantoto klašu funkciju nosaukumus, bet arī aplikācijas struktūru, sāks to uzturēt - tā nenotiek.

Edited by codez
Link to comment
Share on other sites

Tātad no programmētāja viedokļa nevar būt nekādu argumentu, jo kā viņam jāzin, ko dara funkcijas ar garime nosaukumiem, tāpat viņam jāzin, ko dara ar īsiem. Tas ir vienkārši pieraduma jautājums - cik ilgi tu strādā ar konkrēto freimworku un cik labi iegaumē klašu metožu nosaukumus, bez tam atcerēties vienu metodi q un 3 papildus parametru nozīmi secīgā kārtība, ir vieglāk kā 4 patvaļīgus funkciju nosaukumus.

 

Bet, ja skatāmies no uzturētāja viedokļa, kurš, tipa, nav pazīstams ar konkrēto sistēmu, tad tikpat labi es varu nokritizēt šīs funkcijas:

 

DB::getColumn()

Ja es sastaptos ar šādu, tad pirmais, kas ienāk prātā, ir, ka šī metode atgrieztu masīvu ar kādas kolonnas visu rindu vērtībām.

 

getLine
getRowSet 

It kā nedaudz skaidrāk, bet es tik un tā nezinu, kas tiek atgriezts, vai tas ir:

masīvs ar datiem,

objekts, kurš menidžē datus,

mysqli_result objekts,

utt.

 

Rezultātā ir jāskatās, kā šī atgrieztā vērtība tiek izmantota tālāk.

Tāpēc, ja mēs lietojam:

 

$user=DB::q2('SELECT * FROM users WHERE id=%s',$uid);
echo Hello, $user['un'];

 

ir skaidrs:

1) pēc kverijs,

2) pēc $user mainīgā nosaukuma,

3) pēc tā kā mēs tālāk izmantojam $user,

kā strādā šī funkcija.

Edited by codez
Link to comment
Share on other sites

Labi, ka tev ir tikai 3 varianti f-jām un vari iztikt ar q1-q3..

 

Būtībā jau funkcija ir tikai viena q(), bet 1-3 ir parametri, kuri norāda, kādā veidā atgriezt rezultātu. Ērtības labad parametru ievietoju funkcijas nosaukumā.

Manuprāt muļķīgi būtu vienai un tai pašai funkcijai izdomāt 4 būtiski atšķirīgus nosaukumus.

 

 

P.S. Intereses pēc, Kaklz, gribētu uzzinātu tavu risinājumu šij problēmai. 1 nosaukums ar papildus parametru? 4 dažādi nosaukumi? Kādi?

Edited by codez
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...