tak sem si chtěl sám odpovědět na otázku "insert vrací NotORM_Row; za předpokladu, že update to vrací taky: co bude v atributu visits?" a bylo to velmi zábavné
předně - odpověď je, že update vrací počet ovlivněnejch řádků nikoliv NotORM_Row; když chci vědět jakou hodnotu tam vlastně máme, musíme si tam extra šáhnout (s tim nemam problém)
takže stáhnul sem, rozbalil, a připojil se k db; prdnul sem si to do skriptu kterej používam na pokusy v projektu co hákuju, takže už v něm bylo zhruba toto:
<?php
// require všeho možnýho
$env = dejsemenv();
$cfg = $env()->cfg();
$db = $env->db();
$db->trans_begin();
// ... tady si hraju, dále pískoviště
$db->trans_rollback();
na pískoviště sem rutinně vložil
<?php
...
$pdo = new PDO(
sprintf(
"odbc:Driver={SQL Server Native Client 10.0};Server=%s;Database=%s;Trusted_Connection=no"
, $cfg->get('db.host')
, $cfg->get('db.dbName')
)
, $cfg->get('db.user')
, $cfg->get('db.passwd')
);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db = new NotORM($pdo);
z naší db vrstvy rázem vyletělo
Warning: ROLLING BACK UNCOMMITED TRANSACTION
což je E_USER_WARNING generovanej z destruktoru naší db vrstvy
jak sem rutinně postupoval, tak sem si nevšiml, že proměnná $db je už obsazená a ono ->trans_rollback() se zavolalo na NotORMu
dovolím si na tomto místě parafrázi:
Já očekávám, že když někde udělám překlep, tak mi nějaká vrstva oznámí chybu. Ukazuje se, že NotORM touto vrstvou bohužel není.
ale což, dyť se skoro nic nestalo, že ... instance NotORM je od teď $no
jedu dál, vyrobil sem tabuli
create table dbo.lolek (
id int not null constraint lolek_pk primary key
)
insert into dbo.lolek (id) select 1
chci vysosat ten řádek
<?php
...
$pdo = new PDO(...);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$no = new NotORM($pdo);
$row = $no->dbo.lolek[1];
aha, parse error, no nic, na schémata můžu zapomenout, ještě že to defaultuje na dbo
<?php
...
$pdo = new PDO(...);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$no = new NotORM($pdo);
$row = $no->lolek[1];
výsledek:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 102 [Microsoft][SQL Server Native Client 10.0][SQL Server]Incorrect syntax near ')'. (SQLExecute[102] at ext\pdo_odbc\odbc_stmt.c:254)' in D:\Hypos\dvl-branches\jos\trunk\Lib\NotORM\Result.php:122
Stack trace:
#0 Lib\NotORM\Result.php(122): PDOStatement->execute(Array)
#1 Lib\NotORM\Result.php(379): NotORM_Result->query('SELECT * FROM l...')
#2 NotORM\Result.php(413): NotORM_Result->execute()
#3 Lib\NotORM\Result.php(505): NotORM_Result->fetch()
#4 www\foo.php(69): NotORM_Result->offsetGet(1)
#5 {main}
thrown in Lib\NotORM\Result.php on line 122
copak se asi stalo? nastavim $no->debug = true;
Notice: Use of undefined constant STDERR - assumed 'STDERR' in Lib\NotORM\Result.php on line 116
Warning: fwrite() expects parameter 1 to be resource, string given in Lib\NotORM\Result.php on line 116
ksakru, s widlema se s timhle můžu jít klouzat, dobrá
$no->debug = function() {var_dump(func_get_args());};
$row = $no->lolek[1];
výsledek:
array(2) {
[0]=>
string(33) "SELECT * FROM lolek WHERE (id = )"
[1]=>
array(0) {
}
}
aha, vono se na webu sice píše, že s MSSQL to bylo testovaný, no asi sem neměl použít ODBC, ale ten experimentální dblib, kterej funguje zas jen na unixech;
na vině je totiž NotORM_Result::quote()
$this->notORM->connection->quote($val)
(btw takhle zformátovanej vnořenej ternární výraz, to se jen tak nevidí)
takže šup, vohákovat, na quotování kašlu, jen chci vidět co to vrací
<?php
...
var_dump($row->update(array('id' => new NotORM_Literal('id + 1'))));
// int(1)
no a jak sem to napráskal na začátku, vrací to počet ovlivněnejch řádků
no není ten NotORM úžasný?
BTW toto:
// friend visibility emulation
abstract class NotORM_Abstract
je MASAKR! (a není to jediná věc co mě při běhání po zdrojácích NotORMu rozesmála, odteď když budu někde číst o tom, jak se v PHP prasí, tak si vzpomenu na Jakuba Vránu)