怎样查看数据库中的表结构?

怎样查看数据库中的表结构?,第1张

1、首先在电脑中打开SQL之后,打开navicate,新建一个查询,如下图所示。

2、然后在打开的页面中,使用use命令,切换到要查询的数据库:use test,如下图所示。

3、接着使用desc命令加上表名来查看表结构:desc jingyan,如下图所示。

4、执行后,就可以看到jingyan表的表结构了,如下图所示就完成了。

表结构就是定义一个表的字段、类型、主键、外键、索引,这些基本的属性组成了数据库的表结构

例如:

create table student (

id int primarykey,

name varchar,

sex varchar,

age varchar)

id、name、sex这些就是字段,int varchar就是数据类型,primarykey为设置主键。

数据库是以一定方式储存在一起、能与多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合,可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增、查询、更新、删除等 *** 作。

数据库是存放数据的仓库。它的存储空间很大,可以存放百万条、千万条、上亿条数据。但是数据库并不是随意地将数据进行存放,是有一定的规则的,否则查询的效率会很低。当今世界是一个充满着数据的互联网世界,充斥着大量的数据。即这个互联网世界就是数据世界。数据的来源有很多,比如出行记录、消费记录、浏览的网页、发送的消息等等。除了文本类型的数据,图像、音乐、声音都是数据。

扩展资料:

数据库管理系统其防护手段主要有以下八点:

1、使用正版数据库管理系统并及时安装相关补丁。

2、做好用户账户管理,禁用默认超级管理员账户或者为超级管理员账户设置复杂密码;为应用程序分别分配专用账户进行访问;设置用户登录时间及登录失败次数限制, 防止暴力破解用户密码。

3、分配用户访问权限时,坚持最小权限分配原则,并限制用户只能访问特定数据库,不能同时访问其他数据库。

4、修改数据库默认访问端口,使用防火墙屏蔽掉对 外开放的其他端口,禁止一切外部的端口探测行为。

5、对数据库内存储的重要数据、敏感数据进行加密存储,防止数据库备份或数据文件被盗而造成数据泄露。

6、设置好数据库的备份策略,保证数据库被破坏后能迅速恢复。

7、对数据库内的系统存储过程进行合理管理,禁用掉不必要的存储过程,防止利用存储过程进行数据库探测与攻击。

8、启用数据库审核功能,对数据库进行全面的事件跟踪和日志记录。

参考资料来源:百度百科-数据库

说实在的,drupal确实很复杂, 在国内用的人也不多,唯一看的懂的中文技术网站估计就是 drupalchina.org了,

但是对于源代码的分析是少之又少.没有办法,只能自己来从头看起了!

越复杂的东西,往往功能越强大,drupal也是这样的.

其实,看drupal 的代码想一次就弄清楚,恐怕不是很容易,我是前后看了三次,才渐渐对他略有了解, 真羞!

分析代码之前,先了解drupal的几个重要的系统必须的也是访问页面老是查来查去的几个表!

system 这个表记录系统所有的模块和主题的开启状态以及相关信息,我们开启某一模块和主题,就是使用这个表来记录!

blocks 记录系统中所有可用的区块,记录的信息包括 区块名称,所属模块,所属主题,位置.等

node 每种内容类型都看做一个节点,每发一个内容都要存到node表中.只记录title

node_revisions 记录所发内容的实际数据 包括 body title id和node关联

variables 记录系统运行时需要的变量和值

cache 缓存表 系统运行需要从此表中找出相应的数据 没有则构造存入表中

menu_router 顾名思义菜单路由的表,根据具体路径找出对应的模块.和函数.

drupal 的原理是根据传递的参数获得相应的路径进而找到相应的模块,并调用之.从开发的角度上看,

系统的每一次点击连接,就是在调用我们的模块!这样,就形成了我们写模块,然后通过各个超级连接来

调用. 通过超级连接调用?听起来比较怪, 事实上,以前做web开发的时候,基本是每一种连接对应一个单独的页面,

这样,我们的程序就有了 index show.php , edit.php 等 .我们看下drupal,根目录下除了index.php 再看不到

一点和网站显示相关的文件了! 那drupal是怎么在一个页面中各个地址间跳来跳去的呢. 记得有一个高人说过,源码

之前无秘密,想知道这个秘密,我们就必须打开index.php来看个究竟!

然而,结果又一次让我们失望! 在index.php 中我们只看到了这样的代码

require_once './includes/bootstrap.inc'

drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL)

$return = menu_execute_active_handler()

print theme('page', $return)

也就是说,系统的运行,就是这三个函数的功劳! 先从drupal_bootstrap这个函数看起吧!

从 bootstrap.inc中我们知道了 DRUPAL_BOOTSTRAP_FULL 的值是8! 这样 看下面的函数:

function drupal_bootstrap($phase) {

static $phases = array(DRUPAL_BOOTSTRAP_CONFIGURATION,

DRUPAL_BOOTSTRAP_EARLY_PAGE_CACHE, DRUPAL_BOOTSTRAP_DATABASE,

DRUPAL_BOOTSTRAP_ACCESS, DRUPAL_BOOTSTRAP_SESSION,

DRUPAL_BOOTSTRAP_LATE_PAGE_CACHE, DRUPAL_BOOTSTRAP_LANGUAGE,

DRUPAL_BOOTSTRAP_PATH, DRUPAL_BOOTSTRAP_FULL), $phase_index = 0

while ($phase >= $phase_index &&isset($phases[$phase_index])) {

$current_phase = $phases[$phase_index]

unset($phases[$phase_index++])

_drupal_bootstrap($current_phase)

}

}

其实就是循环调用 _drupal_bootstrap 8 次,下面是对 _drupal_bootstrap的分析, 一些函数只写了功能,并没有列出实际代码!

function _drupal_bootstrap($phase) {

global $conf

switch ($phase) {

case DRUPAL_BOOTSTRAP_CONFIGURATION:

drupal_unset_globals()

// 从$globals 中清除 $_post $_GET 等变量

// Start a page timer:

// global $timers 开始计时 获取当前时间

timer_start('page')

conf_init()// 给 $conf赋值 空数组

// 包含 setting.php 文件

break

case DRUPAL_BOOTSTRAP_EARLY_PAGE_CACHE:

require_once variable_get('cache_inc', './includes/cache.inc')

// 包含 ./includes/cache.inc 或者 $conf[cache_inc] 的值

if (variable_get('page_cache_fastpath', FALSE) &&page_cache_fastpath()) {

exit

}

break

case DRUPAL_BOOTSTRAP_DATABASE:

require_once './includes/database.inc'

db_set_active()// 安装数据表 获得数据库连接字符串

break

case DRUPAL_BOOTSTRAP_ACCESS:

if (drupal_is_denied('host', ip_address())) { // 判断是否是应该拒绝的地址

header('HTTP/1.1 403 Forbidden')

print 'Sorry, '. check_plain(ip_address()) .' has been banned.'

exit()

}

break

case DRUPAL_BOOTSTRAP_SESSION:

require_once variable_get('session_inc', './includes/session.inc') // 在$conf中取数据或者是 ./includes/session.inc

session_set_save_handler('sess_open', 'sess_close', 'sess_read', 'sess_write', 'sess_destroy_sid', 'sess_gc')

session_start()// 开始 session

break

case DRUPAL_BOOTSTRAP_LATE_PAGE_CACHE:

$conf = variable_init(isset($conf) ? $conf : array())// 从 variables 中找初始变量的值并放进$conf中

// Load module handling.

require_once './includes/module.inc'

$cache_mode = variable_get('cache', CACHE_DISABLED)

// Get the page from the cache.

$cache = $cache_mode == CACHE_DISABLED ? '' : page_get_cache()// 从 cache 中取数据

// If the skipping of the bootstrap hooks is not enforced, call hook_boot.

if ($cache_mode != CACHE_AGGRESSIVE) {

bootstrap_invoke_all('boot')// 找出bootstrap是1的模块 并运行模块函数 hook_boot

}

// If there is a cached page, display it.

if ($cache) {

drupal_page_cache_header($cache)

// If the skipping of the bootstrap hooks is not enforced, call hook_exit.

if ($cache_mode != CACHE_AGGRESSIVE) {

bootstrap_invoke_all('exit')// 找出bootstrap是1的模块 并运行模块函数 hook_exit

}

// We are done.

exit

}

// Prepare for non-cached page workflow.

drupal_page_header()

break

case DRUPAL_BOOTSTRAP_LANGUAGE:

drupal_init_language()//获取语言 存入变量 $language

break

case DRUPAL_BOOTSTRAP_PATH:

require_once './includes/path.inc'

// Initialize $_GET['q'] prior to loading modules and invoking hook_init().

drupal_init_path()// 初始化$_GET['q']变量

break

case DRUPAL_BOOTSTRAP_FULL:

require_once './includes/common.inc'

_drupal_bootstrap_full()// 加载所有模块文件并运行模块函数 hook_init

break

}

}

到这里,我们知道了drupal_bootstrap的实际作用, 就是加载所有的系统必须文件和模块文件并运行模块函数 hook_init,这就是为什么我们调用

哪个模块,都可以很自由的调用呢,他一次全部include所有我们开启了的模块文件了!!!接着看menu_execute_active_handler(),

function menu_execute_active_handler($path = NULL) {

if (_menu_site_is_offline()) {

return MENU_SITE_OFFLINE

}

if (variable_get('menu_rebuild_needed', FALSE)) {

menu_rebuild()

}

if ($router_item = menu_get_item($path)) { // menu_get_item 函数的作用是根据传递的参数返回需要调用的模块名字!

if ($router_item['access']) {

if ($router_item['file']) {

require_once($router_item['file'])

}

return call_user_func_array($router_item['page_callback'],

$router_item['page_arguments']) // $router_item['page_callback']

是模块里面的 callback函数

}

else {

return MENU_ACCESS_DENIED

}

}

return MENU_NOT_FOUND

}

menu_get_item的代码如下:::

function menu_get_item($path = NULL, $router_item = NULL) {

static $router_items

if (!isset($path)) {

$path = $_GET['q']

}

if (isset($router_item)) {

$router_items[$path] = $router_item

}

if (!isset($router_items[$path])) {

$original_map = arg(NULL, $path)

$parts = array_slice($original_map, 0, MENU_MAX_PARTS)

list($ancestors, $placeholders) = menu_get_ancestors($parts)

//返回Array ( [0] =>Array ( [0] =>annotate ) [1] =>Array (

[0] =>'%s' ) ) 接着查 menu_router表 .

if ($router_item = db_fetch_array(db_query_range('SELECT * FROM

{menu_router} WHERE path IN ('. implode (',', $placeholders) .') ORDER

BY fit DESC', $ancestors, 0, 1))) {

$map = _menu_translate($router_item, $original_map)

if ($map === FALSE) {

$router_items[$path] = FALSE

return FALSE

}

if ($router_item['access']) {

$router_item['map'] = $map

$router_item['page_arguments'] =

array_merge(menu_unserialize($router_item['page_arguments'], $map),

array_slice($map, $router_item['number_parts']))

}

}

$router_items[$path] = $router_item

}

return $router_items[$path]

}

其实menu_get_item是关键了, 他其实就是 接收q的值,然后解析出对应的模块,并调用函数!!!到这一步,我们基本弄清楚了菜单路由的原理,下面看看theme('page')这

个函数了,他是最关键的,我们定义的区块和区块里面的内容以及我们自己做的模版文件*.tpl.php都是通过他来显示的!够牛吧!!下面,将theme分解开来看,我们将基本可以弄清楚

他的原理.

function theme() {

$args = func_get_args()//获得传递给 theme的参数

$hook = array_shift($args)// $hook 是 接受的第一个参数 是 page ,blocks block ,menu_item , 你可以直接输出$hook看了!

static $hooks = NULL//记录函数每次运行后的值

if (!isset($hooks)) { //第一次调用则初始化

init_theme()// 获取当前主题 并初始化 此函数里面调用了 theme_get_registry()theme_get_registry()里面的static 将记录每次获取的值

//下面列出init_theme代码:

///

$hooks = theme_get_registry()//给 $hooks值,使其不为NULL

///////////////////////////////////

}

if (is_array($hook)) {

foreach ($hook as $candidate) {

if (isset($hooks[$candidate])) {

break

}

}

$hook = $candidate


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/10053183.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-04
下一篇 2023-05-04

发表评论

登录后才能评论

评论列表(0条)

保存