【转载】看完日新论坛的php的几点细节后的收获
今天在日新网的论坛里看到了一位学长的技术笔记,感觉很受用,所以转载过来分享。
http://bbs.ecjtu.net/redirect.php?tid=353846&goto=lastpost#lastpost
[后台程序] 最近在PHP中遇到的问题及收获
| 本帖最后由 水中月明 于 2010-10-28 00:31 编辑 最近在重新写日新图库的网页,中间遇到了不少问题,特别是在PHP方面,头一回这样正式的实践才发现原来自己有那么多不会的地方。 问题一:上传文件大小 在上传图片的地方,其中有句代码是这样fi($['file']['size']<=20000) { ............. }else { echo "invalid file"; } 这个上传文件的代码是从网上copy的,当时也没仔细想,可是等网页编好之后,上传总是显示错误invalid file,当然,偶尔也有上传成功的经历,这就更加郁闷,因为这表明代码在正确性上面没有问题,可这是什么原因出的问题,后来我才发现,我如果上传的是一个小图片就可以如果用电脑里面的桌面背景图片就会失败,而这二者很大的区别就是文件大小,这个时候我才开始正视那个20000的意义,上网查了才知道这20000的单位是b,也就是19kb,想想就知道了,唉,悲剧。 问题二:上传文件,文件名出现乱码 上传的时候,因为自己写的代码总是一下成功一下失败,索性我就把网上看到的代码直接复制到一个文件中,对同一个文件分别用我的和网上的代码进行上传。结果网上上传的代码总成功而我的还是像接触不良似的一下成功一下失败,后来看了看上传图片所保存的文件夹里面的图片,才发现不对劲的地方,用网上代码上传的文件,文件名显示正常,而我自己代码侥幸上传成功的那些图片,他们的文件名全部是乱码。 可我仔细研究了我的代码和网上的,得出一个结论,这两个是一样的! 所以可能的原因应该是外界,这时候我就想到了我这编译器默认的字符编码是utf-8,而从网上copy下来的,估计默认为GB2312,于是我在自己的代码中加了这样两行: $filename = $_FILE['file']['name']; $filename = iconv("utf-8","gb2312",$filename); 这两行代码的意思就是把文件名中用utf-8的改为用gb2312, 问题三:调试警告: mysql_fetch_array(): supplied argument is not a valid MySQL result resource 这个问题明眼人都看的出来很可能是查询语句出错(很惭愧的是我当时没看出来,忙晕了),后来Google了一下,发现了一个很不错的方法,就是在遇到类似的问题是echo出$sql(也就是SQL查询语句),然后将echo出来的复制到phpmyadmin中的查询框中,这样就可以很方便的知道你的查询语句有没有出错了,用这样的方法我发现原来是我的查询语句中少加了一个空格,想想这样的错误要是靠肉眼去发现,很难啊。 好了,闲话至此,就说这么多了,代码继续编,问题还会继续出现,后面继续补,哈哈 |
问题四:关于php5手册中关于mysql_query()解释的疑惑
今天在弄一个登录页面,本来挺简单的,通过POST获取用户名,密码,验证码,再跟据这些比对$_SESSION和数据库中相关数据就可以了,可是中间出了问题,怎么也没法达到想要的效果,用户名和密码不管输入什么都会得到登录成功的结果,我判断用户名和密码用的是这样的代码:
$sql = "SELECT * FROM the_table WHERE name='$name'";
$result = mysql_query($sql);
if($result)
{
...........;//假设是输出“用户名正确”
}
else
{
echo "用户名输入错误";
}
按PHP5手册中关于mysql_query()的解释:“mysql_query() 仅对 SELECT,SHOW,EXPLAIN 或 DESCRIBE 语句返回一个资源标识符,如果查询执行不正确则返回 FALSE。对于其它类型的 SQL 语句,mysql_query() 在执行成功时返回 TRUE,出错时返回 FALSE。”
可是当我故意输入错误的用户名的时候,结果还是“用户名正确”,一开始因为没有发现这个问题,让我头疼于找不到问题而郁闷好久,可是现在发现了,却也头疼的很,难道是我对手册理解错误,可是有不对啊,明明就是这样写的啊,于是我又特地编了一段代码进行测试(测试的时候其他无关代码已经注释):
$sql = "SELECT * FROM the_table WHERE name='$name'";
$result = mysql_query($sql,$ln);
if(!$result)
{
echo"the variable result's value is false";
}
else
{
echo $result;
}
知道结果是什么吗
Resource id #4
一段很奇怪的字符串,这个时候虽然不知道这段字符串有什么意义,但是我想我应该可以猜到问题了,在PHP中转换字符串到数字时除了空字符“”之外任何别的字符或字符串都会默认为1,所以不管输入什么,只要$result的结果是一大串字符串,那么结果就是1,自然输出用户名正确了。
后来我改了代码:
$sql = "SELECT * FROM the_table WHERE name='$name'";
$result = mysql_fetch_array(mysql_query($sql));
if($result)
{
...........;//假设是输出“用户名正确”
}
else
{
echo "用户名输入错误";
}
在mysql_query()之后再加了个mysql_fetch_array(),结果正常了,原先我是不想用太多函数,想提高效率,想着mysql_query()查询失败也会返回FALSE,就没用mysql_fetch_array(),哪知道结果会这样,唉
现在想想,我觉得可能手册中对mysql_query()所说的查询执行不正确,可能指的是数据库无法连接,表名或属性名写错之类的情况,而只要前提条件成立,那么查询时,虽然查询出来的结果为空,可是这个也算是查询执行成功了,当然也就返回TRUE,而mysql_fetch_array()在手册中的解释为:“返回根据从结果集取得的行生成的数组,如果没有更多行则返回 FALSE”,当查询结果为空时,没有更多行,mysql_fetch_array()的返回值也自然为0了。
刚刚我特意将测试代码中的表名和属性名分别改为the_table2和name2果然,结果显示为the variable result's value is false,可见猜想正确,特地增加上来与大家分享,可见查询失败和查询执行失败是两种概念,或者说查询失败真正的意思是查询执行失败,是在查询开始之前的基础条件不瞒足引起的问题

浙公网安备 33010602011771号