如何让thinkphp在获取数据库字段信息时区分数据库字段大小写

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何让thinkphp在获取数据库字段信息时区分数据库字段大小写相关的知识,希望对你有一定的参考价值。

  解决办法:
  就是修改thinkphp的源码中的Library/Db/Driver.class.php文件,把
  PDO::ATTR_CASE => PDO::CASE_LOWER 改为 PDO::ATTR_CASE => PDO::CASE_NATURAL,
  或者在配置文件里面增加
  DB_PARAMS’ => array(\PDO::ATTR_CASE => \PDO::CASE_NATURAL) 这一句。
  第一次使用的时候这种解决方法果然可以,但是做另外一个项目的时候却始终不生效,无奈,百度了半天,找到一个方法,因为thinkphp执行的时候默认会把大写转换成小写,所以我们找到它的源码不让它转换就行。
  修改Common/functions.php里面的parse_name函数源码为:

  function parse_name($name, $type=0)
  /* if ($type)
  return ucfirst(preg_replace_callback('/_([a-zA-Z])/', function($match)return strtoupper($match[1]);, $name));
   else
  //这里会将数据库表名里的大写转换为 _小写,修改成不转换
  return strtolower(trim(preg_replace("/[A-Z]/", "_\\0", $name), "_"));
  */
  return $name;
  
  其中注释掉的是原来的,未注释是新增的。
  修改Library/Think/Model.class.php里面的getTableName函数:

  //$this->trueTableName = strtolower($tableName); //这里会将表名转换成小写,修改成不转换
  $this->trueTableName = $tableName;
  修改其中一句,这样就可以解决数据库字段名大写的问题。
参考技术A 现在的数据库管理系统(如SQL Sever、Oracle等)在安装时都有选项,可选择区分或不区分。在WINDOWS下,一般默认是不区分的。
通常来说,专用于WINDOWS下的数据库是不的。本回答被提问者和网友采纳
参考技术B mysql字符集utf8_general_cs 大小写敏感

THINKPHP如何获取一个表2个字段中相同的数据

如图,我的想法是先根据字段 tel 查询出【王五】的一条数据,然后提取【王五】的 tel作为条件再对表进行查询。查询出与字段btel相同的数据。但是新手不知道如何下手 = =,大神求救~~能写出PHP代码更感激不尽!
附上我的代码:
<?php
class JzAction extends IndAction
public $id;
public function index()
$id = $this->id;
$Data = M('userinfo');
$where['id']=array('eq',$id);
$this->data = $Data->where($where)->select();
?>
输出结果:
id name tel btel
3 王五 1589456125 1589456125

这个用OR查询就可以了

(tel = '158XXXX') OR (brel = '158XXXX')

//这里是TP的写法   
//不知道对不对   
//你可以测试一下   
//我一般都是用M() -> query(SQL语句)这样去写的
$model = M('表名');
$where['tel'] = array('eq','1589456125');
$where['btel'] = array('eq','1589456125');
$where['_logic'] = 'OR';
$model -> where($where) -> oreder('id DESC') ->  select();

追问

感谢您的回答,是这样的,1589456125这个值并不是固定的。是根据用户的ID获取的。
意思是,我之前写了一段代码,自动判定到当前访问的用户ID,然后根据该用户的tel 查询btel和他tel相同的用户数据

所以我的想法是提取第一次查询结果的tel值,然后再次对这个张表查询。
我现在就是不知道怎么提取查询结果的字段。谢谢您的回答

追答//=.=  我知道不是固定的   唉  算了  这样吧
$model = M('表名');
$where['tel'] = array('eq',"参数");
$where['btel'] = array('eq',"参数");
$where['_logic'] = 'OR';
$model -> where($where) -> oreder('id DESC') ->  select();

追问

= = ,我现在就是不知怎么获取 “参数”。
比如, 王五访问网页,然后获取到 王五的 ID是 3,然后根据王五的ID进行查询

输出结果:
id name tel btel
3 王五 1589456125 1589456125

现在我怎么使用王五的 tel 在对表进行查询,筛选出 btel=王五.tel的用户。
谢谢您的耐心解答

参考技术A   SELECT `username`,COUNT(`username`) AS c FROM `answer` GROUP BY `username` ORDER BY c DESC LIMIT 10
  这样可以查询出 那些username 和出现的次数;
  $Model = new Model() // 实例化一个model对象 没有对应任何数据表
  $Model->query("这里是上面的sql语句");

以上是关于如何让thinkphp在获取数据库字段信息时区分数据库字段大小写的主要内容,如果未能解决你的问题,请参考以下文章

thinkphp测评系统分数怎么统计?

ThinkPHP3.2基础教程--模型-字段定义

THINKPHP如何获取一个表2个字段中相同的数据

thinkphp5一个表里的字段值就是另一个表里的字段值,怎么获取另一个表的字段值呢

thinkPHP 如何查询出数据库中id最大的一条数据

如何在给定时间和状态信息的情况下获取当地时区