当前位置:首页 » 编程语言 » thinkphp5执行sql
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

thinkphp5执行sql

发布时间: 2023-02-04 20:23:17

A. thinkphp怎么做才是安全的sql防注入

  1. 注入的产生一般都是对用户输入的参数未做任何处理直接对条件和语句进行拼装.


    代码举例:

    //不安全的写法举例1

$_GET['id']=8;//希望得到的是正整数

$data=M('Member')->where('id='.$_GET['id'])->find();

$_GET['id']='8 or status=1';//隐患:构造畸形查询条件进行注入;

//安全的替换写法

$data=M('Member')->where(array('id'=>$_GET['id']))->find();//使用数组方式将自动使用框架自带的字段类型检测防止注入

$data=M('Member')->where(array('id'=>(int)$_GET['id']))->find();//类型约束

$data=M('Member')->where('id='.intval($_GET['id']))->find();//类型转换

$data=M('Member')->where(array('id'=>I('get.id','','intval')))->find();//本人习惯写法

$data=M('Member')->where(array('id'=>':id'))->bind(':id',I('get.id'))->select();//PDO驱动可以使用参数绑定

$data=M('Member')->where("id=%d",array($_GET['id']))->find();//预处理机制

//不安全的写法举例2

$_GET['id']=8;//希望得到的是正整数

$data=M()->query('SELECT * FROM `member` WHERE id='.$_GET['id']);//执行的SQL语句

$_GET['id']='8 UNION SELECT * FROM `member`';;//隐患:构造畸形语句进行注入;

2.防止注入的总的原则是<<根据具体业务逻辑,对来源于用户的值的范围,类型和正负等进行限制和判断>>,同时<<尽量使用THINKPHP自带的SQL函数和写法>>.

3.在THINKPHP3.2版本中的操作步骤是:
一:在项目配置文件中添加配置: 'DEFAULT_FILTER' => 'htmlspecialchars', //默认过滤函数
二: 使用框架带的I方法获取来自用户提交的数据;
例子:M('Member')->save(array('content'=>I('post.content')));这样添加的content内容是经过htmlspecialchars处理过的.

4.为COOKIE添加httponly配置


5.最新版本的thinkphp已经支持此参数。

9.富文本过滤

富文本过滤是,XSS攻击最令人头疼的话题,不仅是小网站,就连BAT这样的巨头也是三天两头的被其困扰.

B. thinkphp5原生查询时,查询结果怎么分页,具体代码应该怎么写

造成这个错误的原因是 Db::query($sql)返回的是数组,解决方法:
$list = Db::table('procts')->field('id,name,price')->paginate(5);
视图:
遍历$list元素
分页{$list->render()}

C. 请教大神thinkphp5 怎么打印sql语句

你好,一共有两种方法可以打印sql语句,具体实现方法可参照这篇文章:

ThinkPHP5打印sql语句

[SQL]SHOWCOLUMNSFROM`think_action`[RunTime:0.001339s]
[EXPLAIN:array('id'=>'1','select_type'=>'SIMPLE','table'=>'think_action','partitions'=>NULL,'type'=>'ALL','possible_keys'=>NULL,'key'=>NULL,'key_len'=>NULL,'ref'=>NULL,'rows'=>'82','filtered'=>'100.00','extra'=>NULL,)]
[SQL]SELECT*FROM`think_action`LIMIT1[RunTime:0.000539s]

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

ThinkPHP内置的ORM和ActiveRecord模式实现了方便的数据存取操作,而且新版增加的连贯操作功能更是让这个数据操作更加清晰,但是ThinkPHP仍然保留了原生的SQL查询和执行操作支持,为了满足复杂查询的需要和一些特殊的数据操作,SQL查询的返回值因为是直接返回的Db类的查询结果,没有做任何的处理。而且可以支持查询缓存。主要包括下面两个方法:

1、query方法

query方法是用于sql查询操作,和select一样返回数据集,例如:

$Model = new Model() // 实例化一个model对象 没有对应任何数据表

$Model->query("select * from think_user where status=1");

2、execute方法

用于更新和写入数据的sql操作,返回影响的记录数,例如:

$Model = new Model() // 实例化一个model对象 没有对应任何数据表

$Model->execute("update think_user set name='thinkPHP' where status=1");

关于原生SQL操作的一点补充

通常使用原生SQL需要手动加上当前要查询的表名,如果你的表名以后会变化的话,那么就需要修改每个原生SQL查询的sql语句了,针对这个情况,TP还提供了一个小的技巧来帮助解决这个问题。

E. 请教大神thinkphp5 怎么打印sql语句

一样的只要你php配置和语法没错 , echo db('table'->)getlastsql();

F. thinkphp5 怎么同时连接mysql和sqlserver 2种数据库

到微软官网下载文件,网址:网络搜索选择“SQLSRV20.EXE”,点击"next"(下一步),进行下载右键解压到当前目录,把这两个文件拷贝到PHP目录下的ext目录下下图是拷贝后的结果,请参考,不要拷错了。打开php-ini在文件中设置,加上下面两行代码,如下图下面这里设置为On,保存,重启服务,如下图修改thinkphp配置文件,如下图thinkphp控制器文件,随便查个sqlserver表中的数据,看是否能成功打印,如果成功打印,那么证明数据库连接成功。如果不能正确打印,那么看报错提示,在按照提示解决问题。

G. 关于thinkPHP中 foreach 里面执行sql语句

原生sql查询有
query()

execute()
两个方法:
query():用于
sql
查询操作,并返回符合查询条件的数据集
execute():更新和写入数据的
sql
操作,返回影响的记录数
public function read(){
// 实例化一个空模型,没有对应任何数据表
$ = m();
//或者使用 $ = new model();
$list = $->query("select * from user where uid<5");
if($list){
$this->assign('list', $list );
$this->display();
} else {
$this->error($->geterror());
}
}public function read(){
header("content-type:text/html; charset=utf-8");
// 实例化一个空模型,没有对应任何数据表
$ = m();
//或者使用 $ = new model();
$num = $->execute("update user set email = '[email protected]' where uid=3");
if($num){
echo '更新 ',$num,' 条记录。';
}else{
echo '无记录更新';
}
}

H. thinkphp5 sqlserver 怎么使用 order

数据库配置格式为
'db_type' => 'pdo',
'db_user' => 'XX',
'db_pwd' => 'XXXXXXXX',
'DB_DSN' => 'sqlsrv:Server=XXXXXX;Database=XXXX',
用不上thinkphp的DB_type为mssql 和sqlser这两个类型。
pdo连接在php5.3需要扩展dll,扩展文件为:php_pdo_sqlsrv_53_ts_vc9.dll(64位操作系统).在微软下载网站上查找SQLSRV20.EXE下载。EXE是可解压文件。
安装SqlServer的软件,由于很少接触mssql,这软件干嘛的我也不知道,应该是用来连接数据库的,名称是sqlncli,在微软下载网站上查找sqlncli.msi下载安装。

I. 怎样在thinkphp里面执行原生的sql语句

原生SQL查询有 query() 和 execute() 两个方法:

query():用于 SQL 查询操作,并返回符合查询条件的数据集

execute():更新和写入数据的 SQL 操作,返回影响的记录数

publicfunctionread(){
//实例化一个空模型,没有对应任何数据表
$Dao=M();
//或者使用$Dao=newModel();

$list=$Dao->query("select*fromuserwhereuid<5");
if($list){
$this->assign('list',$list);
$this->display();
}else{
$this->error($Dao->getError());
}
}
publicfunctionread(){
header("Content-Type:text/html;charset=utf-8");
//实例化一个空模型,没有对应任何数据表
$Dao=M();
//或者使用$Dao=newModel();

$num=$Dao->execute("updateusersetemail='[email protected]'whereuid=3");
if($num){
echo'更新',$num,'条记录。';
}else{
echo'无记录更新';
}
}

J. thinkphp5 怎么用odbc连接sql2000 ,报错,求解

因需求改变要使用到PHP连接sqlserver2000数据库操作(之前是用Java连接写的接口)。
1.准备开发框架:thinkphp5
2.系统开发环境ubuntu系统(这里需要配置odbc_dblib扩展)
3.tp5配置编写
'type' => 'dblib',
// 服务器地址
'hostname' => '1422222.168222.10222.103222321',
// 数据库名
'database' => 'voucher111333',
// 用户名
'username' => 'voucher',
// 密码
'password' => 'qwyf123456',
// 端口
'hostport' => '1433',

4.连接数据库成功,能取回数据(由于mssql编码为gb2312,需转换为utf-8,才不会出现中文乱码问题)
5.php代码如下:
$dbDB = new PDO ("dblib:host=ip;dbname=name", "232", "123456");
$sql = "SELECT count(1) FROM tablename";
foreach ($dbDB->query($sql) as $row) {
var_mp($row);
}