查询整个数据库中某个特定值所在的表和字段的方法

查询整个数据库中某个特定值所在的表和字段的方法

有时候我们想通过一个值知道这个值来自数据库的哪个表以及哪个字段,在网上搜了一下,找到一个比较好的方法,通过一个存储过程实现的。只需要传入一个想要查找的值,即可查询出这个值所在的表和字段名。

前提是要将这个存储过程放在所查询的数据库。


CREATE PROCEDURE [dbo].[SP_FindValueInDB]
(
@value VARCHAR(1024)
)        
AS
BEGIN
— SET NOCOUNT ON added to prevent extra result sets from
— interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @sql VARCHAR(1024) 
DECLARE @table VARCHAR(64) 
DECLARE @column VARCHAR(64) 

CREATE TABLE #t ( 
tablename VARCHAR(64), 
columnname VARCHAR(64) 

DECLARE TABLES CURSOR 
FOR 

SELECT o.name, c.name 
FROM syscolumns c 
INNER JOIN sysobjects o ON c.id = o.id 
WHERE o.type = ‘U’ AND c.xtype IN (167, 175, 231, 239) 
ORDER BY o.name, c.name 

OPEN TABLES 

FETCH NEXT FROM TABLES 
INTO @table, @column 

WHILE @@FETCH_STATUS = 0 
BEGIN 
SET @sql = ‘IF EXISTS(SELECT NULL FROM [‘ + @table + ‘] ‘ 
SET @sql = @sql + ‘WHERE RTRIM(LTRIM([‘ + @column + ‘])) LIKE ”%’ + @value + ‘%”) ‘ 
SET @sql = @sql + ‘INSERT INTO #t VALUES (”’ + @table + ”’, ”’ 
SET @sql = @sql + @column + ”’)’ 

EXEC(@sql) 

FETCH NEXT FROM TABLES 
INTO @table, @column 
END 

CLOSE TABLES 
DEALLOCATE TABLES 

SELECT * 
FROM #t 

DROP TABLE #t 

End

 

例如,要查询值’BBQ CHIC SW’,结果如下:

返回三条记录,说明这个值存在于三个表中,分别为_dts_menudef, g_dts_menudef和g_recipe中,字段名分别为name1, name1, name。

非常好用。

使用TCPDF输出完美的中文PDF文档

<转自: 可以任意转载, 转载时请务必以超链接形式标明文章原始出处及此声明 本文地址: http://www.yinzhili.com/2009/08/using-tcpdf-to-generate-pdf-in-chinese.html />

[转者注:我使用joomshoping 3.0.0(for joomla1.6),按本文方法,不嵌入字体成功。但生成三种字体并拷贝到font文件夹,修改应用文件后,不行。顺便说一句,希望高手指点。我不知道我哪里错了?使用TCPDF输出完美的中文PDF文档]

TCPDF是一个用于快速生成PDF文件的PHP5函数包。TCPDF基于FPDF进行扩展和改进。支持 UTF-8,Unicode,HTML和XHTML。在基于PHP开发的Web应用中,使用它来输出PDF文件是绝佳的选择。但毕竟这款开源软件是外国人开发的,对中文的支持总不是那么尽如人意,因此我们需要对它作进一步的增强。
首先要下载TCPDF。访问http://www.tcpdf.org ,单击导航条上的”Download”链接,即可下载到最新版本的TCPDF压缩包。因为里面包含了范例和字体,因此文件大概有10M左右。下载完后解压它,会得到一个名为tcpdf的目录,此目录的结构大概是这样的:

使用TCPDF输出完美的中文PDF文档TCPDF目录结构图

将此目录移动到Apache的网页根目录下(假设您使用的是Apache,并且使用80端口,如有不同请根据实际情况修改),打开浏览器,访问 http://localhost/tcpdf/ 应该就可以看到此目录下的文件和文件夹列表。由于TCPDF已经自带了一些范例,因此为了节省时间,我们可以直接对范例进行修改再使用。打开tcpdf目录下的examples目录,下面有50多个范例文件,其中example_038.php就是用来测试东亚字体的(比如简体/繁体中文、日文等等),打开此文件,找到$pdf->SetFont 这一行,修改为:

$pdf->SetFont(‘stsongstdlight’, ”, 20);

这一行代码的作用是设置PDF正文所用的字体及字号。其中”stsongstdlight”表示”STSongStdLight”字体,这是 Adobe Reader的默认简体中文字体,TCPDF中已经内置这个字体的配置文件,我们只需直接调用即可。接下来,将$pdf->Cell那一段修改为:

$pdf->Cell(0, 10, ‘敏捷的棕毛狐狸跃过那只懒狗。’, ”,1, 1, ‘C’);
$pdf->Cell(0, 10, ‘The quick brown fox jumps over the lazy dog.’, ”,1, 1, ‘C’);
$pdf->Cell(0, 10, ‘1234567890’, ”,1, 1, ‘C’);

保存,然后访问 http://localhost/tcpdf/examples/example_038.php 就可以生成一份PDF文档了:

使用TCPDF输出完美的中文PDF文档

使用默认中文字体生成的PDF文件

这种方式生成的PDF文件的优点是:文件体积小,生成快速。但也有缺点是,没有嵌入中文字体,只限于安装了Adobe Reader之后才能正常显示。那万一用户使用的是FoxIt Reader或者是Linux操作系统呢?显示效果就不一样了。因此,为了保证生成的PDF文件在任何环境下都有同样的显示效果,嵌入字体是必需的。
Windows下有很多中文字体,但是我们要用在TCPDF中的中文字体有下面几个要求:

支持Unicode,因为TCPDF支持的是Unicode;
体积越小越好;
最好是也支持繁体中文;

这样看来,微软雅黑以及方正的一些字体都符合要求。但是他们都是商业字体,而且个头都不小,以微软雅黑为例,msyh.ttf 文件就超过10M,如果使用它,生成的PDF文件体积也会很大。
综合考虑,我觉得”Droid Sans Fallback”字体符合要求:

首先它是免费字体;
其次它也是Unicode编码,支持简体繁体中文以及日文韩文等等;
然后它的体积很小,不超过5M。

然而TCPDF不支持TTF字体文件,因此我们先将它转换成TCPDF支持的格式,然后再使用。在TCPDF目录下有个fonts子目录,这个子目录下又有个utils,这里面带有一个字体转换工具ttf2ufm.exe。下面是转换的步骤:
在网上很容易找到Droid Sans Fallback字体的下载链接,因此在这里就没有必要多做描述了。我们把下载到的 DroidSansFallback.ttf 复制到 TCPDF\fonts\utils 下面,然后打开Windows的命令行,切换到此路径下,输入如下命令:

D:\www\tcpdf\fonts\utils>ttf2ufm -a -F DroidSansFallback.ttf

等待一段时间,等到命令行窗口显示

“Finished – font files created”

之后,可以发现此目录下生成了DroidSansFallback.afm,DroidSansFallback.t1a 和 DroidSansFallback.ufm 这三个文件。
在命令行中输入

“C:\Program Files\WAMP\PHP5\php.exe” -q makefont.php DroidSansFallback.ttf DroidSansFallback.ufm

说明:这里的”C:\Program Files\WAMP\PHP5\php.exe”为php.exe文件所在的路径,请根据实际情况输入。回车运行之后,稍等片刻,命令行窗口中会提示

Font definition file generated

至此大功告成。将生成的droidsansfallback.php、droidsansfallback.z以及droidsansfallback.ctg.z这三个文件复制到 TCPDF\fonts 下面即可。
打开example_038.php文件,将

$pdf->SetFont(‘stsongstdlight’, ”, 20);

修改为

$pdf->SetFont(‘droidsansfallback’, ”, 20);

这样就能够调用我们刚才生成的字体,再访问 http://localhost/tcpdf/examples/example_038.php 就可以看到重新生成的PDF文档。

使用TCPDF输出完美的中文PDF文档

嵌入DroidSansFallback字体后的PDF文档

Squid配置

Squid代理服务器简介

Squid是一种在Linux系统下使用的优秀的代理服务器软件。

squid不仅可用在Linux系统上,还可以用在AIX、Digital Unix、FreeBSD、HP-UX、Irix、NetBSD、Nextstep、SCO和Solaris等系统上。

Squid是一个缓存internet数据的一个软件,它接收用户的下载申请,并自动处理所下载的数据。也就是说,当一个用户象要下载一个主页时,它向Squid发出一个申请,要Squid替它下载,然后Squid 连接所申请网站并请求该主页,接着把该主页传给用户同时保留一个备份,当别的用户申请同样的页面时,Squid把保存的备份立即传给用户,使用户觉得速度相当快。

对于Web用户来说,Squid是一个高性能的代理缓存服务器,可以加快内部网浏览Internet的速度,提高客户机的访问命中率。Squid不仅支持HTTP协议,还支持FTP、gopher、SSL和WAIS等协议。

实验环境:

系统 redhat linux 5.4
外网 eth0:192.168.0.1
内网 eth1:192.168.1.254
Squid Cache: Version 3.1.7

RPM安装,这里就不说明了。下载地址:http://www.squid-cache.org/

修改配置文件

[root@a ~]# cat /etc/squid/squid.conf

配置文件说明

定义acl访问控制元素:ip地址、端口

acl manager proto cache_object
acl localhost src 127.0.0.1/32 ::1
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1

acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl localnet src fc00::/7 # RFC 4193 local private network range
acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines

acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT

acl worktime time 8:00-23:59 //定义工作时间
acl worktime time 00:00-5:59
http_access allow mynetwork !worktime //只允许非工作时间上网

访问控制设置
http_access allow manager localhost
http_access deny manager

# Deny requests to certain unsafe ports
http_access deny !Safe_ports 禁止非安全端口的访问

# Deny CONNECT to other than secure SSL ports
http_access deny CONNECT !SSL_ports

http_access allow localnet
http_access allow localhost

# And finally deny all other access to this proxy
http_access allow all 最好一条http_access设置默认访问规则

# Squid normally listens to port 3128
http_port 192.168.1.254:3128 transparent 代理服务器监听的地址及端口,transparent 为透明代理模式

# We recommend you to use at least the following line.
hierarchy_stoplist cgi-bin ?

# Uncomment and adjust the following to add a disk cache directory.
cache_dir ufs /var/spool/squid 1000 8 128 配置缓存文件的文件格式,缓存大小,缓存目录数

# Leave coredumps in the first cache dir
coredump_dir /var/spool/squid

# Add any of your own refresh_pattern entries above these.
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320

visible_hostname 192.168.1.254
cache_mem 128 MB //squid服务器占用内存大小
forwarded_for off //不传递被代理地址
via off //不传递代理服务器信息

初始化squid代理服务器

squid -z

开启路由功能,并将下面的命令写入/etc/rc.d/rc.local 文件,使其开机自动开启路由功能

echo ‘1’ >/proc/sys/net/ipv4/ip_forward

配置iptables防火墙

自动将http请求转发到代理服务器上

iptables -t nat -A PREROUTING -i eth1 -p tcp –dport 80 -j REDIRECT –to-ports 3128

设置源地址映射

iptables -t nat -A POSTROUTING -j SNAT –to-source 192.168.1.254 (外网地址)

iptables -P INPUT ACCEPT

启动squid代理服务

[root@a ~]# service squid restart

查看squid代理服务器缓存日志

[root@a ~]# tail -f /var/log/squid/access.log

个人感觉使用缓存服务器之后网页访问速度有大幅度的加快。

JMAIL安装配置全程

 jmail发送邮件的实例代码网上很多.但是有些细节如果不配置好,发送失败的可能性很大.

首先说明一下jmail安装配置步骤:

1. JMail 下载地址
http://hbdx3.skycn.com/down/w3JMail43Personal.exe

2.安装

本人在Windows 2003下面配置,其它系统还没有测试.

安装到目录比如: C:\Program Files\Dimac\w3JMail4\jmail.dll

然后还需要把jmail.dll复制到系统目录,比如C:\WINDOWS\system32

再运行:regsvr32 jmail.dll

这样才算把jmail安装好了.

3.如果出现标题显示的错误,检查下列内容.

(1)、用户名和密码
在代码里要写上
smtpUser =”用户名”
smtpPass=”密码”
或是
objMail.Send(“用户名:密码@server.net”)
要写发送端连接的邮件服务器和进入邮件服务器的用户名和密码。用户名和密码一定要存在于服务器上且正确。而且好象用户名和密码最好不要带下划线。

(2)、.防火墙阻止了网络通讯或网络故障
有可能防火墙会认为这是蠕虫导致的狂发邮件的情况,所以会禁止群发邮件。
所以检查防火墙的设置就可能会发现。

(3).jmail组件权限不够

(4).邮件服务器故障

(5)测试用的邮件服务器比如:smtp.163.com可能把你列入黑名单,换个邮件服务器发

.尽量不要不停发邮件.

.在 .NET 中使用 Jmail 需要如下设置:
1、安装jmail;
2、找到jmail.dll;
3、注册该组件Jmail.dll,作法是将jmail.dll文件拷贝到system32目录下,再运行命令“regsvr32 jmail.dll”(不包括引号),卸载可运行“regsvr32 /u jmail.dll”;
4、执行Program Files\Microsoft Visual Studio .NET\FrameworkSDK\Bin\ildasm.exe(可使用Visual Studio .Net 2003 命令提示),
格式如下:tlbimp c:\Program Files\Dimac\w3JMail4\jmail.dll /out:MyJmail.dll /namespace:MyJmail
生成MyJmail.dll后,将它引用至项目中

事例代码:

<% /******************************************************************************** JMail 下载地址 http://hbdx3.skycn.com/down/w3JMail43Personal.exe 安装之后把jmail.dll放到系统目录 然后运行:regsvr32 jmail.dll ********************************************************************************/ //SMTP Server config var val_sSMTPServer = "smtp.126.com"; var mailFrom = "[email protected]";//邮箱地址 var smtpUser = "username";//邮箱用户名 var smtpPass = "******";//邮箱密码 function Rw(dat) { Response.Write(dat + '\r\n'); return; } function Rf(dat) { return Request.Form(dat)(); } function JMailSend(fromName,formMail,toMail,mailSubject,mailBody) { var objMail = new ActiveXObject( "JMail.Message" ); var subject = mailSubject; var body = mailBody; var mail = toMail; objMail.Logging = true; objMail.Charset = "UTF-8"; objMail.Priority = 3; objMail.ContentType = "text/html"; objMail.From = formMail; objMail.FromName = fromName; objMail.AddRecipient( mail ); objMail.Subject = subject; objMail.Body = body; objMail.MailServerUserName = smtpUser; objMail.MailServerPassword = smtpPass; objMail.Send( val_sSMTPServer ); objMail.Close(); } /* 碰到这种情况说明网易把IP列入黑名单需要换smtp服务器 The message was undeliverable. All servers failed to receive the message ClientLogging enabled: Client Remote Address: 127.0.0.1 .execute() { Trying server mail:smtp.163.com <- 220 163.com Anti-spam GT for Coremail System (163com[20050206]) -> EHLO linjin10-sj78xi
<- 250-mail 250-PIPELINING 250-AUTH LOGIN PLAIN 250-AUTH=LOGIN PLAIN 250 8BITMIME -> AUTH LOGIN
Sending authentication data..
<- 550 用户被锁定 Authentication failed. smtp.163.com failed.. No socket for server. ConnectToServer() 1 of 1 servers failed } */ %>

JMAIL安装配置全程

 jmail发送邮件的实例代码网上很多.但是有些细节如果不配置好,发送失败的可能性很大.

首先说明一下jmail安装配置步骤:

1. JMail 下载地址
http://hbdx3.skycn.com/down/w3JMail43Personal.exe

2.安装

本人在Windows 2003下面配置,其它系统还没有测试.

安装到目录比如: C:\Program Files\Dimac\w3JMail4\jmail.dll

然后还需要把jmail.dll复制到系统目录,比如C:\WINDOWS\system32

再运行:regsvr32 jmail.dll

这样才算把jmail安装好了.

3.如果出现标题显示的错误,检查下列内容.

(1)、用户名和密码
在代码里要写上
smtpUser =”用户名”
smtpPass=”密码”
或是
objMail.Send(“用户名:密码@server.net”)
要写发送端连接的邮件

实战Squid的反向代理在共享IP的VPS上的应用

实战Squid的反向代理在共享IP的VPS上的应用
Web, 服务器 Add comments 八 252009Squid作为一款相当优秀的代理、负载均衡软件,其反向代理功能在提高网站性能上有极大的推动作用,并兼有保护Web服务器、自动负载均衡等功能。今有一服务器,装有VMWare server,其上带着几个VPS,只有一个IP可用。VPS通过NAT访问外网,外网通过IP Forwading访问VPS,IP Forwading中绑定主机端口都不可能是80,所以需要将带有Host头的80端口的包,按照一定的规则,分发给不同的VPS使用。使用Apache的mod_proxy可以实现此功能,但是其效能低下,如今改用Squid来实现此功能。
配置文件如下:
acl all port 80
http_port 80 accel defaultsite=mysite.com vhost
cache_peer 127.0.0.1 parent 10801 0 no-query originserver name=server_1
cache_peer_domain server_1 www.mysite1.com .mysite1.com

cache_peer 127.0.0.1 parent 10802 0 no-query originserver name=server_2
cache_peer_domain server_2 www.mysite2.com .mysite2.com

http_access allow all

第二行中的mysite.com指定当传递的HTTP头中HOST为空时,默认的值。
第三行、第四行是定义服务器1的IP地址、端口和默认域名,泛域名
第六行、第七行是定义服务器2的IP地址、端口和默认域名,泛域名

这样一样,squid就可以根据HOST来分发包了。若再加上Cache特性,其性能一定会发挥得更好。在此就不多叙述了

Debian中网卡的设置

在Debian中网卡的设置可以通过/etc/network/interfaces文件来进行,具体可分为三种不同的配置方式:DHCP自动获取、静态分配IP地址和PPPoE宽带拨号。

具体设置如下:在进行配置之前,首先进入/etc/network目录中,编辑interfaces文件:

网卡通过DHCP自动获取IP地址

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

#
# The loopback network interface(配置环回口)

# 开机自动激lo接口
auto lo
# 配置lo接口为环回口
iface lo inet loopback

#
# The primary network interface (配置主网络接口)

#开机自动激活eth0接口
auto eth0
#配置eth0接口为DHCP自动获取
iface eth0 inet dhcp

网卡静态分配IP地址

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

#
# The loopback network interface(配置环回口)

# 开机自动激lo接口
auto lo
# 配置lo接口为环回口
iface lo inet loopback

#
# The primary network interface (配置主网络接口)

#开机自动激活eth0接口
auto eth0
#配置eth0接口为静态设置IP地址
iface eth0 inet static
address 10.16.3.99
netmask 255.255.255.0
network 10.16.3.0
broadcast 10.16.3.255
gateway 10.16.3.1

# dns-* options are implemented by the resolvconf package, if installed(DNS设置)
dns-nameservers 61.153.177.196 61.153.177.197
dns-search fireteam.org

网卡进行PPPoE宽带拨号配置

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

#
# The loopback network interface(配置环回口)

# 开机自动激lo接口
auto lo
# 配置lo接口为环回口
iface lo inet loopback

#
# The primary network interface (配置主网络接口)

#开机自动激活eth0接口
auto eth0
#配置eth0接口为静态设置IP地址
iface eth0 inet static
address 10.16.3.99
netmask 255.255.255.0
network 10.16.3.0
broadcast 10.16.3.255

配置完毕后,重启计算机或网络服务即可将网卡配好。如进行PPPoE宽带拨号,可运行pppoeconf命令进行配置。

wordpress IIRF伪静态规则

将以下规则保存为iirf.ini放到网站根目录即可实现伪静态。
RewriteBase /

#store original URL in custom header (substitute for missing REQUEST_URI header in IIS)
RewriteHeader X-REWRITE-URL: ^$ %{REQUEST_URI}

#uploaded files
RewriteRule ^(.*/)?files/$ index.php [L]
RewriteCond %{REQUEST_URI} !.*wp-content/plugins.*
RewriteRule ^(.*/)?files/(.*) wp-content/blogs.php?file=$2 [L]

# add a trailing slash to /wp-admin
RewriteCond %{REQUEST_URI} ^.*/wp-admin$
RedirectRule ^(.+)$ $1/ [R=301]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule . – [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-.*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]

彻底解决由require(‘./wp-blog-header.php’)导致的500错误

这个问题困扰我好几天了,今天总算是搞定了。

之前查了很多资料,断断续续做了不少功课。但都没实质性进展。

刚开始的症状就是首页500错,但是后台可以正常进入。

查资料找到如下方案

/** Loads the WordPress Environment and Template */
require(‘./wp-blog-header.php’);

修改为

/** Loads the WordPress Environment and Template */
require(‘wp-blog-header.php’);

这还不算完,如果以后客户装WP,每次都这个错误,那会很麻烦。

于是继续找解决方案。

后来在某博文看到一篇文章,提到可能是因为上级目录没有相应权限,导致了require函数读取文件时遭到拒绝,于是给WEB根加上了IIS-WPG用户的读取权限,然后还原代码到

/** Loads the WordPress Environment and Template */
require(‘./wp-blog-header.php’);

至此,500错误消失,博客已经可以正常打开。

php 压缩网站上的文件,并返回下载

set_options ( array ('basedir' => dirname ($modpath ), 'inmemory' => 0, //不在内存压缩.而是直接存放到磁盘.如果要压缩下载,则可以选择为1
'recurse' => 1, //是否压缩子目录,resurse,递归的意思?
'storepaths' => 1, //是否存储目录结构,我选是。
'overwrite' => 1, //是否覆盖
'level' => 5, //压缩比
'name' => $zipFileName, //压缩最后生成的文件名,无需再次设置。这里是为了解说方便才放上来的。
'prepend' => "", //未知
'followlinks' => 0, //未知
'method' => 1, //未知
'sfx' => "", //自解压
'type' => "zip", //是zip还是tar...,无需设置,这里为了方便解说。放上来。
'comment' => "" ) );
$files = array("*.*");
//可以将文件名单独列出来加进去,但是文件名必须在basedir下,文件名支持*.*表示压缩全部。
$archive->add_files($files); //加$files数组里的文件名
// 正式写入磁盘
$archive->create_archive();
@header("Content-Disposition: attachment; filename=\"$zipFileName\"");
@header ( "Content-Length: " . filesize ($zipFileName ) );
@readfile( $zipFileName);
?>