[pmwiki-devel] More database standards

Ben Stallings ben at interdependentweb.com
Thu Dec 14 10:29:29 CST 2006

marc wrote,
> Anyway, I've settled on a PmWiki-ish way to handle this that may or may 
> not work for others. It can still utilise the SDV() approach - to 
> maintain that mechanism.
> The nub of it is a two-dimensional array that would usually live in 
> (farm)config.php. Something like:
>   $DBTables = array (
>     'products' => array ('database' => $liveDb, 'table' => 'products')
>     'members'  => array ('database' => $testDb, 'table' => 'users')
>   );
> This can then be used in recipes via [1]:
>   global $DBTables;
> and, say:
>   $db = ADOdbConnect($DBTables['products']['database']);
> and
>   $sql = "SELECT * FROM {$DBTables['products']['table']}
> Hopefully, this makes the problem, and my suggested solution, a bit 
> clearer.

A bit, but could you please POST THE SCRIPT YOU'RE USING to the 
DatabaseStandard page so that we can work with something functional 
rather than just snippets of code out of context?  I don't mean to 
repeat myself -- maybe you only have email access where you are, in 
which case I apologize, but when you do have upload capability at your 
disposal, please upload a script in its entirety.  Thank you.  If I 
sound frustrated, it's only because I'm excited by the work you're doing 
and am eager to try it out.

That said, I have some concerns about where you're going...

You are correct that connection names in the current DatabaseStandard 
are arbitrary; however, they are there for a good reason.  Consider a 
case where you want one recipe to have read-only access to a database 
and another to have full access to the same database.  They need two 
different logins and passwords, which means they need two different 
connections.  If you remove the connection name and just refer to the 
connection by the name of the database (or by the name of a table in 
that database), you lose that control.

Your proposal for a $DBtables array seems to be built on the premise 
that a recipe doesn't know (or hasn't been told) what database 
connection it's supposed to be using, only the table name.  I think 
that's a dangerous assumption, because if you've got more than one 
database or more than one connection to the same database, it's probably 
*because* you don't want every recipe having free reign over all your 
data.  Otherwise you'd just put all your eggs in one basket, right? 
Each recipe should be explicitly told -- or at least provide a way to be 
explicitly told -- which connection(s) to use rather than just given a 
list of which tables belong to which database connections.

I can see how a lookup array of tables and databases would be a useful 
feature, but setting aside for a minute the question of whether it 
compromises security, I fear that setting that array in config.php is 
not the best way to go about it... it requires the admin to do an awful 
lot of typing just to provide information that the server already knows. 
  Rather than specifying the tables you want to use, why not specify 
only the ones you *don't* want to use (by defining them as null) or the 
ones to use under a different name (in case two databases have tables 
with the same name), and pull the names for all the rest using 
MetaTables()?  The connection script could then build the $DBtables 
array (using SDVA so as not to overwrite customized values) 
automatically when it makes the connection, sparing the admin all that 

Finally... although I see how $DBtables would be useful for reference, 
it seems to me it would be very cumbersome in practice... instead of

SELECT * FROM `$table1`,`$table2` where `$table1.$field1` = 

you would have to write,

SELECT * FROM `{$DBTables['$table1']['table']}` AS a 
,`{$DBTables['$table2']['table']}` AS b WHERE `a.$field1` = `b.$field2`

How is that an improvement?  It doesn't get past the limitation (imposed 
by ADOdb) that both tables must be on the same database in order to use 
them in the same query.  If the two tables are not in the same database, 
the second notation will fail just as surely as the first.  Please give 
an example where this is an improvement, so I can understand why you 
want to do it.

I don't mean to be critical; I just don't see where you're coming from 
yet.  Thanks again for all your contributions!  --Ben S.

More information about the pmwiki-devel mailing list