先上代码
这是控制器下登陆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'); } }
$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大大