OOP - Въпроси , проблеми , отговори

index каза:
Идея : Този клас на пръв поглед ми хареса, обаче виждам нещо което доста ще осложни кода. Поне аз така мисля !
Това че при всяка заявка трябва да се хваща ексепшъна. Защо не го преместиш в query, и ако изгърми да връща празен масив ?
Значи виж сега, всеки е свободен да си го пригоди както иска, а и вкарах в кода Singleton, PDO и exception, за да могат начинаещите да видят как се ползват, примерен начин за реализация на подобен клас. Да не е лоша идея да се направи да връща някакъв масив с грешки, също може и с trigger_error() или кой както си иска. Кода съм го дал като пример, който иска може да си го пригоди както си иска
 
Не искам да оплювам излишно, но има няколко видни грешки:

Поне като ползваш PDO, го ползвай така както трябва. Защото този клас няма никъкав смисъл, по - добре си работи със mysql_query() ..., ако така работиш със PDO.

1. Първо chartset ти е зададен, да ще работи, но тъй като ползваш PDO, ползвай му вградените неща.

PHP:
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"



2. Един големият + на PDO както и на MYSQLI са prepare statements, а не директните заявки.

PHP:
$query->db->prepare("SELECT * FROM table WHERE userID = :userID ");
$query->bindParam(":userID", $userID, PDO::PARAM_INT);
$query->execute();

3. Хубаво си направил метод за заявката, ами кое ще ти върне резултата?

PHP:
$query->fetch(PDO::FETCH_ASSOC);
<-- Отговаря тъй както на mysql_fetch_assoc();

PHP:
$this->db->lastInsertId('id');
<-- Последното ID от auto_increment колона.

PHP:
$query->fetchColumn();
<-- Много добър начин за взимане на брой резултати, когато се използва със COUNT() във заявката

Това са най - масовите, другите във PHP.net ги има описани.

4. За exceptions. Ако се вдигне е хубаво да имаш някой handler за тази работа. А не директно echo.

5. Употребата на foreach(); е просто не мислима ... няма логика, поне във този случай.

- В пъти по бавен от всички останали цикли е foreach();
- Не разбирам на while(); какво му има?


Не го написах това с цел да се заяждам, но мое лично мнение е, че този клас би объркал хората, който те първа се сблъскват със PDO, от колкото да има помогне.
 
eddyy93 каза:
Не искам да оплювам излишно, но има няколко видни грешки:

Поне като ползваш PDO, го ползвай така както трябва. Защото този клас няма никъкав смисъл, по - добре си работи със mysql_query() ..., ако така работиш със PDO.

1. Първо chartset ти е зададен, да ще работи, но тъй като ползваш PDO, ползвай му вградените неща.

PHP:
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"



2. Един големият + на PDO както и на MYSQLI са prepare statements, а не директните заявки.

PHP:
$query->db->prepare("SELECT * FROM table WHERE userID = :userID ");
$query->bindParam(":userID", $userID, PDO::PARAM_INT);
$query->execute();

3. Хубаво си направил метод за заявката, ами кое ще ти върне резултата?

PHP:
$query->fetch(PDO::FETCH_ASSOC);
<-- Отговаря тъй както на mysql_fetch_assoc();

PHP:
$this->db->lastInsertId('id');
<-- Последното ID от auto_increment колона.

PHP:
$query->fetchColumn();
<-- Много добър начин за взимане на брой резултати, когато се използва със COUNT() във заявката

Това са най - масовите, другите във PHP.net ги има описани.

4. За exceptions. Ако се вдигне е хубаво да имаш някой handler за тази работа. А не директно echo.

5. Употребата на foreach(); е просто не мислима ... няма логика, поне във този случай.

- В пъти по бавен от всички останали цикли е foreach();
- Не разбирам на while(); какво му има?


Не го написах това с цел да се заяждам, но мое лично мнение е, че този клас би объркал хората, който те първа се сблъскват със PDO, от колкото да има помогне.
Както казах това беше пример, аз попринцип работя главно с MySQLi(за по-голями проекти), за по-малки ползвам MySQL, аз просто пример съм дал. С PDO почти не съм работил, а относно prepare statements - да това е плюса, но пак се повтарям това горе е пример, класа може да се пипне още по-хубаво
 
Сблъсках се с проблем, който изглеждаше много нелогичен:

Имам масив, които ключове отговарят на полета в ДБ и стойностите, които трябва да се запишат и така по пътя на логиката, направих това:

PHP:
foreach($map as $k => $v) {
  $query->bindParam(':bind'.$k, $v);
}
Но започна на всички полета да се записва стойноста на последния ключ?!

Направих:
PHP:
foreach($map as $k => $v) {
  
  echo $k.' => '.$v<br />;

  $query->bindParam(':bind'.$k, $v);
}

И всичко изглежда наред при echo - то - вади стойноста с точно съответния ключ.
Но отново не така седят нещатата при bindParam, стойноста на всички BIND ключве оставаша стойноста на последния ключ от масива $map.

И така 1 час по - късно направих следното(благодарение на google и stackoverflow):

PHP:
foreach($map as $k => &$v) {
            $query->bindParam(':bind'.$k, $v);
        }
И проблема бе решен. Всичко това заради "&", трябвало стойноста да се предава по референция.

Това е, ако и друга срещанат този проблем да не се блъскат да търсят защо. :))))
 

Back
Горе