2007年12月29日星期六

打印CGI 的Request

打印CGI 的Request
说法不准, 刚开始搞PERL CGI, 不知道怎么debug.
照经验, 网页编程简单, 数据一目了然. 把变量 dump 出来, 是最好的debug方式.
虽然会perl, 但是对perl CGI 的模式还是不太熟悉.

OK, 开始 dump 了.

Perl CGI Code:
use CGI;
use Data::Dumper;

my $Cgi = new CGI();
my $DebugStr = Dumper(Cgi);
print(DebugStr);

就这么简单, 其他略过

这帮我解决了大问题, 终于知道页面为什么转不到目的页面了, 原来是一个参数有标量变成了一个第一个元素是空值的数组.

郁闷了半天, 现在OK了.

ide罪状

ide罪状 因为用到了多个IDE,总是感觉有不完美的地方,

用来编辑php & perl, 细微不解一一列举, 想到那说哪, 没写的以后补充.


一. eclipse

1.竟然没有自动换行功能, notepad都有的小玩意儿, 著名的大家伙竟然没有,

而且很多高手竟然不知道有这种功能, 十分不解

2.使用ctrl+shift+左右方向键 , 选择代码, eslipse竟然是按照有无空格之类的方式

来分段选择, 大跌眼镜, 难道是其开发人员偷懒?

二. Zend Studio

1. 连续按左右方向键的时候, 光标不见了,

只有靠你灵巧的手指,和敏锐的直觉, 才能确定现在光标在那. 真晕

2.代码折叠, 确实是个好东西

但是你也不要把函数后面的空行都折到自己里面啊, 我还想留着空行随时为下面的函数加注释呢.

非得逼着我为每个函数后面一行加上个注释符号#

聪明反被聪明误

perl正则表达式里的变量替换

perl正则表达式里的变量替换
perl正则表达式里的变量替换

语法比较特别,难记
帖之,备忘:
perl code:

my $str1 = '123abc123';
my $str2 = 'str2';
print "\n\n$str1";
$str1 =~ s/abc/${str2}/gsi;
print "\n\n$str1";

output:
123str2123

应该能看懂吧.

回头多看,多记,少忘

perl在windows下与linux下路径保持一致

perl在windows下与linux下路径保持一致 windows下,设置perl安装在website相同盘里的\usr目录

在cgi的头部为:
#!/usr/bin/perl


这样,就不需要为两种环境下的迁移,把这条信息改来改去了.


另:
activeperl原版未删除, 只不过改了地方,和系统path,

再装新版, 装完以后,旧版安装的模块都还在.

无需重装了,窃喜...

send mail by perl

perl发信的代码
use strict;
no strict 'refs';
use warnings;
use Sql;
use Net::SMTP;
use Net::SMTP_auth;
# Start Send mail
my $Row;
my $MailServer = 'smtp.sample.com';
my $MailAccount= 'username@sample.com';# or 'username'
my $MailPwd = 'userpassword';
my $smtp = Net::SMTP_auth->new($MailServer, Debug => 1) or die('can not connect to smtp server');
$smtp->auth('LOGIN', $MailAccount, 'xiaoyin.yan');
my $MailTo = 'targetuser@smaple.com';
my $MailFrom = 'username@sample.com';
my $MailTitle= 'Notification!';
my $logFile = 'expire2.log';
open(my $log,">>$logFile") or die('Can not open log file!');;

my %DBConnection = (
dbhost=>'192.168.0.1',
dbname=>'dbname',
dbuser=>'dbuser',
dbpass=>'dbpass'
);
my $DB = Sql->new(%DBConnection);
if($DB->{_errstr}) {return("Data base error: " . $DB->{_errstr} . " (". $DB->{_maxtries} . " Attempts)");}
my $query = sprintf("SELECT a.* From dbtable a WHERE ... LIMIT 100;");
$DB->execute($query);
while (my $Row = $DB->read()) {
my $date = gmtime();
my $MailBody = "Subject:$MailTitle.\nto:$MailTo\ncc:thirdemail\@sample.com\n\nDear Sir/Madam #name#,\n\nYour product \"#item_name#\" was expired two weeks ago. Please check. \n\nBest Regards,\nCompany Name\n".$date;
$MailBody =~ s/#name#/$Row->{'name'}/gsi;
$MailBody =~ s/#item_name#/$Row->{'title'}/gsi;

#$MailTo = $Row->{'email'};

print $log "\n********\ngmdate:$date\nUser email:$Row->{'email'}\nUser name:$Row->{'name'}\nTitle:$Row->{'title'}\nEnd date:$Row->{'end_date'}\nMail message:\n$MailBody\n\n";

$smtp->mail($MailFrom);
$smtp->to($MailTo);
$smtp->data();
$smtp->datasend($MailBody);
$smtp->dataend();
}

$smtp->quit;
close($log);
# Net::SMTP_auth模块没有 subject函数, subject需要在mailbody中的头部写入,即
# subject:the subject
# 后面加上一个换行\n
# to, from, cc类似
# 头部用两个换行结束.
# 这样,email客户端就能自动识别这些域.

这该si的IE

这该si的IE
在Firefox下好好的表格, 在IE下就变了样子.

IE下,还有类似的表格, 结构和定义都是一样的, 有的正常, 有的变形.

即便定义的列宽度, IE下的表格也是乱七八糟的.

仔细检查输出的Html, 都是一样的.

一筹莫展之际, 发现撑开变形的IE页面的表格底部有几个比较长的Button,

原来是这些小子, 搞了半天被他们给阴了.

IE,为什么不守规则?


后记:
将button移除表格, 放在新建的表格中.

现在新表格跑到原来的右面去了, 所以再给他加上css:
clear:left;
这样,他就跑到原来的下面去了

xajax的错误

xajax的错误
需要使用ajax, 只要能提交数据就可以,不需要返回的xml。
php函数执行成功以后,随便构造了个xml数据,返回,OK。
在写一些新的函数时, firefox中安装的错误检测的扩展一直报告有错误,但是期望的运行结果是正确的。
研究。。
原来是函数里的输出的debug信息也被当作xml返回, 导致xml结构不正常, 当然要报告错误了。
另外,坛子上说, 多余的回车也会引起这种错误。
所以,程序最后还是越精简越好。省的那么多bug。

Smarty初学者的模糊问题

Smarty初学者的模糊问题
呵呵,自己的经历, 拿出来献丑了。
1. smarty里面的数组是可以计算数组大小的。
比如php: $smarty->assign("array", $array);
在模版中中可以这样显示数组大小:
{$array|count}
当时傻冒,没有好好看手册, 把数组大小放在单独的smarty变量里,再在模版中输出, 给自己带来了不少的麻烦。
2. 模版中如何判断结果集是否为空?
一种办法是用上面的count.
再就是,使用section后, 判断 section的index的大小:
比如:
{section name=hello loop=$data}
{$data[hello].title}
{/section}
{if $smarty.section.hello.index <>
show something here!!
{/if}
3. 分隔符问题
初学时,感觉默认的delimitor ?? delimiter 是 { }, 生怕模版中的静态东西也有这两个字符,就把分隔符设为{{ }}, 其实smarty里有{literal} {/literal}表达式,在这里面的东西都被当作静态的内容输出, smarty不会对其进行转义处理。
使用它,也不必担心js中也需要使用 {}了。
4.数组问题。
写惯了其他程序,总是用数字下标来使用变量。
这样,在数据库提取数据的时候,需要把 每个表字段对应的数组下表记下来, 再在 html中挨个对应检查输出, 特别麻烦。
其实在php中可以使用hash数组,就是用字符串做数组下标。
例如:
PHP:
while($row = $result->fetch_assoc()){
$data[] = $row;
}
$smarty->assign("data",$data);
TPL:
{secton name=output loop=$data}
{$data[output].数据库字段名称}
{/section}
这样只要记住数据库字段名就可以了, 不用挨个找对应关系,修改也很方便。
缺点是: 容易暴露数据库结构, 有利有弊吧。

Perl最新版本CGI::Session无法load Session的解决方案

Perl最新版本CGI::Session无法load Session的解决方案
在windows下,安装了active perl, 用其自带了的ppm-shell安装 CGI 及 CGI::Session 模块。
原来测试通过的Perl CGI无法运行。
具体情况就是 session 文件无法 load。 导致每次刷新都要新建 session, 因此也无法保存变量了。
原来以为是程序的原因。
哪知道, 使用 nmake, 手工编译了一下 CGI::Session 模块 ,换了个CGI::Session的版本, 一切OK了。
真是气死人, 不知道官方模块的升级测试是怎么进行的。。

php html submit

php, 一张表单, 不同submit

呵呵,php

print("

".print_r($_POST,true)."
");
?>















点击send1,输出是:
Array(

    [subject_1_1] => subject1_1
[subject_1_2] => subject1_2
[subject_3] => subject3
[subject_4] => subject4
[send] => Send1
)
点击send2,输出是:

Array
(
[subject_1_1] => subject1_1
[subject_1_2] => subject1_2
[subject_3] => subject3
[subject_4] => subject4
[send] => Send2
)


这样,就可以根据submit的值,进行不同的操作了.


继续学习...

linux下查找网关地址

linux下查找网关地址
vmware下安装slax 5.1.8 server, 光盘启动以后我总是找不到网关之类的地址, 不过网络可以访问.
不才, 用ifconfig eth0 看不到需要的信息. 另寻他法. windows 下有条命令
tracert 网址

linux 下的为:

tracepath 网址

结果中的第二条就是网关地址了.

找到是找到了, 但是不是标准方法, 哪位高人知道的话, 麻烦通知一声

windows apache2 php下安装xdebug

windows apache2 php下安装xdebug
郁闷的事情总是有的, 并不像报纸中的生活那样河蟹.

今天安装xdebug, 就遇上相当郁闷的事情.

按照某中文说明, 点击扩展的地址

就是这个: http://pecl4win.php.net/ext.php/php_xdebug.dll

下载到本机, 复制到 php 的 ext/ 目录下,

再配置php.ini

重启 apache2

再三检查 phpinfo 页面, 就是找不到 xdebug 的丁点信息.

反复尝试, 茫然, 感觉太背了.

郁闷之余, 到官网下载了个beta版的. 再检查第一次下载的版本, 发现没有版权等的信息.

用文本编辑器打开一看, 晕, 原来这个文件是个失败的 html 文件, 能用才怪.

换上官网的版本, 一切 OK!


总结: 有些事情靠教程是找不到解决方法的. 做某些事情必须细心细致. 另外, 要有从茫然中找到可能出现问题的地方的分析能力.

表格 form 提交以后后退保持状态

表格 form 提交以后后退保持状态
表单提交以后, 按浏览器的后退, 发现填的值都不见了. 做网页页有几年了, 今天栽在这里.

实际上可用的只是 jsvascript 的后退, 即

Go back

很easy的

How to keep form data wnen go back

cakephp, bake.php 1.x遗留的bug

cakephp, bake.php 1.x遗留的bug
cakephp在bake的时候, name总是空的, 如下:
Name:
Type: integer
---------------------------------------------------------------
Please select one of the following validation options:
---------------------------------------------------------------
1- VALID_NOT_EMPTY
2- VALID_EMAIL
3- VALID_NUMBER
4- VALID_YEAR
5- Do not do any validation on this field.

以mysql为例, 问题出在dbo_mysql.php describe table时, 漏掉了column的name.

更改如下:

File: dbo_mysql.php

line: 179

change: $fields[$column[0]['Field']] = array(

to: $fields[$column[0]['Field']] = array('name'=>$column[0]['Field'],


其他的数据库类似.

以前搞过, 搞了很长时间. 今天又遇到, 不写笔记很容易忘掉问题在哪, 还好今天花了不长时间.

立此存照, 也希望cakephp项目组别只顾着2.x的开发, 至少应该把以前版本的这么明显的 bug 补好.

怎样设置cakephp 默认的css

设置cakephp 的css
cakephp的css文件放在 app\webroot\css 下, 默认的有个css文件叫做cake.generic.css.
从别的地方赋值了一份 layout: 放在 app\views\layouts\default.thtml, 忘了有没有其他设置了.
发现页面的css效果都没了.
修改 default.thtml, line 8:
From: css('style'); ?>
To: css('cake.generic'); ?>
css 就出来了.

原来农行的 ATM 用的是 XP

原来农行的 ATM 用的是 XP
存款 ATM 就是一台标准的 PC, (ATM is a normal PC)
键盘放在里面. (Its keyboard is hided in its shell)
在 windows 模式下, 发现其显示效果挺不错的. 屏幕好.(The screen looks very good in os interface)

发表于: 2007-11-09,修改于: 2007-11-09 13:59 已浏览21次,有评论0条 推荐 投诉