本文目录一览:
- php执行mysql的SQL语句,能否忽略错误?
- [think php 里面 模型执行sql语句报错 怎么回事](#think php 里面 模型执行sql语句报错 怎么回事)
- php如何防止sql注入
- php如何避免在循环中使用sql语句
- [thinkphp3.2.3 执行原生sql语句(SET SQL_QUOTE_SHOW_CREATE = 1)时报错,是怎么回事?](#thinkphp3.2.3 执行原生sql语句(SET SQL_QUOTE_SHOW_CREATE = 1)时报错,是怎么回事?)
php执行mysql的SQL语句,能否忽略错误?
mysql有提供ignore
关键字~
使用
INSERT IGNORE INTO ...
这样,当违背了唯一约束的时候,就会直接跳过,不会报错。
think php 里面 模型执行sql语句报错 怎么回事
推测两种原因吧:
- 你的数据库配置不正确,重新配置一下,找到在
Conf
文件夹里面的config.php
可以配置。 - 你的数据库表名没有加上
bbs
这个前缀,你要么把你所有的表名全部加上这个前缀,要么就在配置里取消前缀的使用。推荐还是使用前缀,可以有效的防止SQL注入。
php如何防止sql注入
PHP防止SQL注入是一个比较基础的问题了。这个问题其实早在大一上学期做第一个个人博客的时候就已经关注过了。简单地说一下关于PHP防注入的方式吧。
- 使用PDO防注入。这是最简单直接的一种方式,当然低版本的PHP一般不支持PDO方式去操作,那么就只能采用其他方式。
- 采用
escape
函数过滤非法字符。escape
可以将非法字符比如斜杠等非法字符转义,防止SQL注入,这种方式简单粗暴,但是不太建议这么用。 - 自己手写过滤函数。手写一个PHP SQL非法参数过滤函数来说还是比较简单的,但是你的函数需要非常健壮,否则仍然有可能被非法黑客攻击;你的Coding水平直接决定了你的函数的健壮性。
- 各种框架里面其实都有对于非法字符过滤的支持,最简单的比如ThinkPHP,你可以直接防止注入。
- 写一个PHP扩展对于进入参数进行有选择的过滤。开发一个PHP扩展是对于一个PHP高级程序员必备的技能,将你需要的功能打包在PHP扩展里面,就像黑词过滤一样进行检查,是非常方便的。一般都是用在自己写框架路由器转发的时候,如果你用扩展实现框架的路由器转发的话,可以顺便将参数过滤加入到PHP扩展里面,通过C去实现。 对于现在的防注入技术其实已经成熟了,对于一个站点该关心的不是防注入了,而是大规模高并发如何处理的问题,或者关于各种其他漏洞。比如现在世界上仍然有80%使用Redis的站点存在Redis漏洞,通过Redis漏洞可以直接拿到机器的访问权限,一般来说都是直接给你种一个挖矿机器人来。
php如何避免在循环中使用sql语句
- 循环内拼接SQL语句,循环外执行
例如:
// 假设这里的$users是一个很大的数组,我们要循环取出其中的值 foreach ($users as $user) { // 这部分的sql是从项目中随便摘抄出来的,主要就是实现拼接sql语句 $sql .= " ('{$order_sn}', '{$this->user_id}', '{$deliver_fee}', 0, " . " '', '', '', " . " '{$add_time}','{$order_status}', '{$order_amount}', '{$remark}', " . " '{$pickup_code}', '{$self_pickup}', '{$collect_order_sn}', '{$key}', {$reservation_time}),"; } // 循环中拼接好sql之后,我们在循环外执行 $sql = substr($sql, 0, -1); DB::statement($sql);
- where条件换为where in()
比如我们的
where()
条件中要使用大规模的数组,那么在语句应该是:
此时我们可以转变一下:foreach ($arr as $v) { DB::table('')->where('id', $v->id); }
// 先取出条件数组$arr,在直接执行whereIn即可 DB::table('')->whereIn('id', $arr);
注意:如果数据量很大,比如几十万条数据,那么
whereIn
也会成为代码的瓶颈,这个函数适用于数据量不是很大的情况。
thinkphp3.2.3 执行原生sql语句(SET SQL_QUOTE_SHOW_CREATE = 1)时报错,是怎么回事?
query
执行SQL查询操作:
$Model = M();
$Model->query("select * from think_user where status=1");
如果数据非法或者查询错误则返回false
,否则返回查询结果数据集(同select
方法)。
你用插入语句返回的不是数组,所以就报错了吧。
execute
用于更新和写入数据的SQL操作:
$Model = M();
$Model->execute("update think_user set name='thinkPHP' where status=1");
如果数据非法或者查询错误则返回false
,否则返回影响的记录数。