自己做了个登陆注册的小东西 但一旦用字母登陆就报错
这是控制器下登陆Action的代码
//登陆提交控制器 public function logAction() { //获取登录表单参数 $userid = $this->getRequest()->getParam('userid'); $password = $this->getRequest()->getParam('psd'); //创建表模型并查询登录密码 $table = new user(); $where = 'userid ='.$userid; $row = $table->fetchRow($where)->toArray(); //验证表单密码和数据库密码 if($row['password'] == $password) { //创建全局变量session用户名id session_start(); $_SESSION['userid'] = $userid; //显示登陆成功视图 $this->render('logok'); } else { //密码错误显示登录失败视图 $this->render('logfailed'); } }
这就是user表
+--------+----------+----------+
| userid | username | password |
+--------+----------+----------+
| 010 | messi | 010 |
| robin | test | robin |
+--------+----------+----------+
首先注册过程一切正常 这两条记录都可以正常插入
但登陆的时候 用第一条记录010登陆的时候正常
用第二条记录robin登陆的时候就出错了!! 报的是500错误 An error occurred Application error
而如果我随便写一个用户名提交表单后 如果带字母就报错 没有字母纯数字的话就不报错 但也没有显示任何跳转信息
首先我分析出了随便写用户名密码时没有任何跳转的原因 就是因为fetchRow的返回值为null
但为什么我一旦写入英文字符就报错??
获取表单参数应该没有问题 表模型也应该没有问题
页面字符集 mysql字符集 zend studio字符集也都统一为了utf-8
是$where条件写的不对么 可是用数字登陆成功跳转啊
怎么还会出这么奇葩的问题呢...小弟经验不足 还得求教各位高手了
我还测试了010_010这种不带字母带特殊字符的字符串 提交之后也是报500的错
这问题实在是太奇怪了..
回复讨论(解决方案)
$where = 'userid ='.$userid;
应写作
$where = "userid ='$userid'";
010可能变成了10,而010_010则还是010_010
$where = 'userid ='.$userid;
应写作
$where = "userid ='$userid'";
不行 还是那样.. 传入表单的用户名只要带有字母就报错了..
这问题实在是太奇怪了
010可能变成了10,而010_010则还是010_010
我数据库里定义的userid数据类型是varchar(10)
表单参数获取过来 我也没有使用任何字符串处理函数啊 怎么可能010变了呢
我就怕参数传错 还特意输出出来看了一下呢 表单传参应该没问题
打印每一条查询命令看看吧?
打印每一条查询命令看看吧?
弄了很久 还是没有找到原因 但现在用别的办法把问题解决了
传进来的表单参数没有问题,但一旦送进fetchrow()方法就嘣了
数字没有问题 但一旦传字母就报错
后来我获取表模型适配器 用qutoeInto()方法处理一下传进来的参数
然后用适配器query()方法执行的sql语句 没有异常出现
虽然能用了 但还是没有找到一开始那么做出错的原因 可能问题还是出在了$where参数上吧...
debug下么 看下是数据库查询错误还是其他错误
大概找到问题的所在了
首先问题确实是出在了$where条件上
我后来进行调试 用适配器 quoteInto()方法处理表单参数 然后赋给
$where = $msgAdapter->quoteInto("?", $userid);
然后我显示$where出来 发现表单获取的参数无论是数字还是字母 都会加上了单引号 形如'001' 'robin'
然后我又尝试不用quoteInto()方法 像一楼哥们说的那样 把
$where = 'userid ='.$userid;
写作
$where = "userid ='$userid'";
这样实际上不就和quoteInto()方法处理过后的参数是一个意思了么?
调试之后也通过了
但为什么用我楼上帖子中贴出来的代码能通过数字参数却不能通过字母参数呢??
我推测 可能是因为sql语句规范上的问题造成
我上面代码里通过php传给mysql的sql语句 其中的where子句肯定是不带引号的'' 但是此时传入数字竟然可以执行 传入带字母的参数却不能
然后我打开mysql这样分别输入了三条sql语句 问题的原因就比较清晰了
这是我在mysql执行的三条语句
可见 对于纯数字的值加不加单引号都可以被mysql服务器执行
但是 对于含有字母的值就必须用单引号引起来才能被mysql服务器执行
图中报的错误叫unknown column 'robin'
未知的列..
我也不知道这叫什么错误了
总而言之 还是通过适配器调用quoteInto()方法处理一下参数然后再构造sql语句比较正确
我之前一直都是随手写一个001 002 这样的字段取值
就一直没发现这个问题...
而具体为什么能直接执行不带单引号的数字取值的sql语句 还是等待楼下给出更好的答案吧
按理说,楼上说的 $where = 'userid ='.$userid; 应写作 $where = "userid ='$userid'"; 这个应该就是解决楼主问题的答案啊,就是字母要加单引号的问题嘛!
varchar要加引号。。。否则被当成数字处理。
数字,加不加引号都是数字。只不过不加引号表示的是数值,加引号表示是串。对于弱类型而言两者是一样的
字母,加引号表示串,不加引号就表示名称,具体含义由上下文决定
比如
userid = robin
就会报错 unknown column 'robin' 因为你的表中不存在名为 robin 的字段
只有
userid = 'robin'
才表示 userid 的值为 robin
学习了 感谢xu大大
上一篇: thinkphp怎么在不同的Action类的不同函数之间传值
下一篇: HBase之功能细节