phpMyAdmin功能十分强大,几乎可以对数据库做任何事,但也有不尽如人意的地方。在修改数据库的记录时,如果有一个blob或者更长的longblob字段,那么虽然你只要修改某个记录的短字段,但phpMyAdmin会把这个记录所有的字段全部调出。如果是高速电脑也许可以忽略这个无用的浪费,但对于我的P200,可就有残酷的意味了,每次为一个小小的修改而得等上较长的时间,而且在修改的时候,电脑反应特别慢。如果一次要修改几个记录,那么用phpMyAdmin将是一件痛苦的事。还有更恼人的事是对于二制数据,通过编辑存盘以后就可能会被改变,如果是一个程序,那么程序将无法运行,如果是图片,当然将无法再显示。
所以我决定修改phpMyAdmin,在调用编辑功能时能屏蔽不需要的字段数据,一为安全,二为速度。虽然我对于PHP还不是很熟悉,抱着试试看的心情开始了修改的尝试。下面是修改的过程记录:
一、备份源程序。
二、从index.php3跟踪phpMyAdmin执行和调用的过程。
1、index.php3是一个页框,左边left框调用left.php3;右边main框调用main.php3。
2、left框中的left.php3是全局的主控程序。初始化时收集所有数据库的情况,并显示在left框中。点击其中的数据库,则在left框中显示其下的所有表,在main框中用参数:server,db调用db_details.php3,以另一种方式更为详细地显示库内表的情况,并显示了一些对数据库进一步操作的功能按钮。对于其中的表有“浏览、选择、插入、属性、丢弃、清空”等操作,对于库可能将其整个删除。
3、点击“选择”。以后的过程是我们要修改的。
4、“选择”用server,db,table,goto四个参数调用tbl_selete.php3。这些参数都是通过$query="server=$server&db=$db&table=$table&goto=tbl_properties.php3"来传递的。
5、tbl_selete.php3分为两个功能块,以$param变量是否被设置要分别两个功能块。$param是在tbl_selete.php3中设置的,所以刚调用tbl_selete.php3时,执行没有设置$param的功能块,用一个FORM提供用户选择字段的入口,FORM的cation调用tbl_selete.php3自身,进入第二个功能块。在第二功能块中,我们要注意的是一个header函数。 Header("Location:sql.php3?sql_query=".urlencode($sql_query)."&goto=db_details.php3&server=$server&db=$db&table=$table&pos=0");
它将程序引到了sql.php3。
6、sql.php3是一个功能多样的模块。通过tbl_selete.php3调用sql.php3,主要是利用它的最后一部分的程序码。在这里sql.php3调用一个在lib.inc.php3中定义的函数display_table($resault),以显示查询结果。
7、我们可以看到显示的查询记录后面有两个绿色小块“修改”“删除”。(如果选择时没有选中表中的“primary_key”字段,这两个小方块不会显示。)我们感兴趣的是其中的“修改”。这个“修改”后面是一个链接:<a href="tbl_change.php3?primary_key=$primary_key$query">".$strEdit."</a>。(其中的$strEdit="编辑",$query= "&server=$server&db=$db&table=$table&goto=sql.php3?".urlencode($GLOBALS['QUERY_STRING']);)通过这个链接把参数传递给下一个程序:tbl_change.php3。我们要做的第一步就是将在tbl_selete.php3选中的字段表传达到tbl_change.php3中。要做到这一点,首先要:
8、修改display_table($resault)的接受参数,除了$resault,再增加一个$sql_query,这个参数是从tbl_selete.php3传到sql.php3的,在sql.php3调用display_table(),增加这样的参数就可以使display_table()知道已经先好的字段表。在display_table()内部将$sql_query的值赋给$kong_query。因为还有其他的变量叫做$sql_query
9、修改“修改”后面的链接为<a href="tbl_change.php3?primary_key=$primary_key$query&sql_query=$kong_query">".$strEdit."</a>。这样参数传递就算成功了。接下来是用参数了。
10、修改tbl_change.php3。先从取$sql_query中取出有用的信息。
(1) $sql_query=stripslashes($sql_query);
(2) $sql_query=preg_replace("/where.*$/","",$sql_query); //去掉where及其后面的部分。
(3) $sql_fields=preg_replace("/^SELECTs+/","",$sql_query);//去掉开头的SELECT和空格。
(4) $sql_fields=preg_replace("/s+from.*$/","",$sql_fields);//去掉from及其后面的成份。
(5) $fields_def=preg_split("/,/",$sql_fields); //将字段存入数组中。
11、修改tbl_change.php3中相应的mysql_db_query语句。
(1)// $result = mysql_db_query($db, "SELECT * FROM $table WHERE $primary_key");
$result = mysql_db_query($db, $sql_query." WHERE $primary_key");
(2) //$result = mysql_db_query($db, "SELECT * FROM $table LIMIT 1");
$result = mysql_db_query($db, $sql_query." LIMIT 1");
(3) $f=0;
(4)在第十一循环语句中增加:
if($row_table_def['Field']==$fields_def[$f]){
$f++;
.....................
echo "</tr>n"; //为原来就有。
} //kong
这样程序就修改完成。
当然还没有经过严格的测试,也许有BUG。希望有兴趣的朋友帮忙测试。
|